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>
相关文章
|
28天前
|
Java 数据库连接 Maven
后端框架学习-----mybatis(使用mybatis框架遇到的问题)
这篇文章总结了在使用MyBatis框架时可能遇到的几个常见问题及其解决方法,包括配置文件注册、接口绑定、方法名匹配、返回类型匹配、Maven资源导出、时区设置和字符编码问题。
|
21天前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
28天前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
28天前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
28天前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
28天前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
28天前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
2月前
|
Java 数据库连接 Spring
搭建 spring boot + mybatis plus 项目框架并进行调试
搭建 spring boot + mybatis plus 项目框架并进行调试
58 4
|
21天前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
11 0
|
27天前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
136 0
下一篇
DDNS