MyBatis框架:第七章:注解使用方式和参数传递及#{}和${}

简介: MyBatis框架:第七章:注解使用方式和参数传递及#{}和${}

myBatis的注解使用方式(了解。主要使用xml)

注解的使用示例:

public interface UserMapperAnnotation {
  @Select("select id,last_name userName ,sex from t_user where id = #{id}")
  public User selectUser(int id);
  @Select("select * from t_user")
  public List<User> selectUserList();
  @Update("update t_user set last_name = #{lastName}, sex = #{sex} where id = #{id}")
  public int updateUser(User user);
  @Delete("delete from t_user where id = #{id}")
  public int deleteUserById(int id);
  @Insert("insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})")
  @SelectKey(before = false, keyProperty = "id", resultType = Integer.class, statement = { "select last_insert_id()" })
  public int insertUser(User user);
}

mybatis-config.xml配置文件中导入

<mappers>
  <mapper class="com.dao.UserMapperAnnotation"/>
</mappers>

mybatis的参数传递

1.一个普通数据类型

当一个方法中只有一个普通数据类型。在mapper配置文件中可以使用#{}占位符来进行占位输出。

#{} 占位符中,可以写参数的 #{变量名}。 也可以写 #{value}。

方法:

public int deleteUserById(int id);

#{变量名}

<delete id="deleteUserById" parameterType="int">
  delete from t_user where id = #{id}
</delete>

#{value}

<delete id="deleteUserById" parameterType="int">
  delete from t_user where id = #{value}
</delete>

2.多个普通数据类型

多个普通的参数。当我们需要使用 #{} 占位输出的时候,可以使用

param1,param2 …… paramN

也就是 #{param1} …… #{paramN}

或者使用@Param命名参数

使用param1、param2 …… paramN 占位输出参数

方法:

public List<User> findUserByNameAndSex(String username, int sex);

使用param1、param2 …… paramN 的方式 占位输出参数

<select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
  select id,last_name lastName,sex from t_user where last_name = #{param1} and sex = #{param2}
</select>

3.使用@Param注解命名参数

方法:

public List<User> findUserByNameAndSex(@Param("username") String username, @Param("sex") int sex);

使用命名参数输出:

<select id="findUserByNameAndSex" resultType="com.atguigu.bean.User" >
  select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
</select>

传递一个Map对象作为参数

当我们的参数为map对象的时候。我们可以使用 map对象的key来做为占位符,输出数据。

#{map的key} 来做为占位符的输出

使用示例如下:

方法:

public List findUserByMap(Map<String, Object> map);

调用的代码:

@Test
public void findUserByMap() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
    Map<String, Object>map = new HashMap<String, Object>();
    map.put("lastName", "admin");
    map.put("sex", 1);
    System.out.println( userMapper.findUserByMap(map) );
  } finally {
    session.close();
  }
}

配置如下:

<select id="findUserByMap" resultType="com.bean.User" >
  select id,last_name lastName,sex from t_user where last_name = #{lastName} and sex = #{sex}
</select>

一个Pojo数据类型

当方法的参数是一个复杂类型的对象的时候。我们可以使用 对象的属性名。当成占位符的名称。比如:#{ 属性名 }

示例:

public int insertUser(User user);

mapper中的配置:

<insert id="insertUser" parameterType="com.atguigu.bean.User" useGeneratedKeys="true" keyProperty="id">
  insert into t_user(`last_name`,`sex`) values(#{lastName},#{sex})
</insert>

个Pojo数据类型

当有多个复杂pojo对象做为参数传递给方法使用时候。我们要取出数据做为sql的参数。可以使用如下方式:

#{param1.属性名}

……

#{paramN.属性名}

也可以使用@Param命名参数。给每个pojo对象起一个别名。然后再通过 #{别名.属性名} 的方式取出数据值做为参数使用。

使用示例:

默认param1、param2、paramN形式取对象属性。配置如下:

方法:

 public List<User> findUserByTwoUser(User user1, User user2);

配置如下:

<select id="findUserByTwoUser" resultType="com.bean.User" >
    select id,last_name lastName,sex from t_user where last_name = #{param1.lastName} and sex = #{param2.sex}
</select>

@Param注解命名参数的形式:

方法:

public List<User> findUserByTwoUser(@Param("user1") User user1, @Param("user2") User user2);

配置如下:

<select id="findUserByTwoUser" resultType="com.bean.User" >
  select id,last_name lastName,sex from t_user where last_name = #{user1.lastName} and sex = #{user2.sex}
</select>

#{}和${}的区别

#{} 在mapper的配置文件的sql语句中,它是占位符, 相当于 ? 号。

${} 在 mapper 的配置文件的 sql 语句中,它是原样输出变量的值,然后以字符串拼接的功能进行操作。

${} 中只能写value,或者是@Param命名参数后的参数名称

在输出参数的时候,我们并不推荐使用 ${} 来输出。因为可能会导至 sql 注入问题的存在

比如:

select * form t_user where id = #{id}
相当于:
select * from t_user where id = ?   
select * from t_user where id = ${value}
相当于
select * from t_user where id = 原样输出变量的值

模糊查询

现在要根据用户名查询用户对象。 也就是希望查询如下:

select id,last_name lastName ,sex from t_user where last_name like '%张%'

方法:

public List<User> findUserLikeName(String name);

#{} 的实现配置和调用

调用代码:

@Test
public void findUserLikeName() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
       // 需要在传递参数的时候,自己加上前后的两个百分号
    System.out.println( userMapper.findUserLikeName("%a%") );
  } finally {
    session.close();
  }
}

配置如下:

<select id="findUserLikeName" resultType="com.bean.User" >
  select id,last_name lastName ,sex from t_user where last_name like #{name}
</select>

${} 的实现配置和调用

${} 的实现,只是原样的输出参数的值。然后做字符串的拼接操作。

调用代码:

${} 的实现配置和调用
${} 的实现,只是原样的输出参数的值。然后做字符串的拼接操作。
调用代码:
@

配置如下:

<select id="findUserLikeName" resultType="com.bean.User" >
  select id,last_name lastName ,sex,phone from t_user where last_name like '%${value}%'
</select>

MySQL的字符串拼接,concat函数实现。

在mysql中,有一个字符串拼接操作的函数。叫concat函数。当我们需要做类似于like 这种查询的时候。我们可以使用 #{} 组合 concat来解决参数输入,以及不需要在传递参数的时候,加两个%%的情况。还可以解决sql注入问题。使用如下:

代码调用下:

@Test
public void findUserLikeName() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
    // 需要在传递参数的时候,自己加上前后的两个百分号
    System.out.println( userMapper.findUserLikeName("a") );
  } finally {
    session.close();
  }
}

配置如下:

<select id="findUserLikeName" resultType="com.bean.User" >
  select id,last_name lastName ,sex from t_user where user_name like concat('%',#{name},'%');
</select>
相关文章
|
7天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
15天前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
32 1
持久层框架MyBatisPlus
|
17天前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
49 5
|
17天前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
39 3
|
24天前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
105 3
|
22天前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
41 1
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
29天前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
29 0
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
下一篇
无影云桌面