Mybatis(三)执行特殊Sql

2022-04-05 13:38:42 浏览数 (1)

放在前面,给大家推荐一个idea插件,可以提供mapper接口到xml配置之间的跳转。

MyBatisX

插件插件

添加成功之后,会在接口左侧有个图标,点击图标即可跳转。

本文章中介绍的执行特殊sql包括以下几种

  • 模糊查询
  • 批量删除
  • 动态设置表名
  • 添加功能获取自增主键

模糊查询

mapper.java和xml中用到 的代码。

代码语言:html复制
<!--List<User> getUserByLike(@Param("username") String userName);-->

<select id="getUserByLike" resultType="User">
    select * from t_user where username like '%${userNamew}%';
</select>

测试.java

代码语言:javascript复制
    @Test
    public void testSelectById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        List<User> user = mapper.getUserByLike("张三");
        System.out.println(user);
    }

测试结果

模糊查询测试结果模糊查询测试结果

批量删除

只能使用${},如果使用#{},则解析后的sql语句为delete from t_user where id in ('1,2,3'),这样是将1,2,3看做是一个整体,只有id为1,2,3的数据会被删除。

正确的语句应该是delete from t_user where id in (1,2,3),或者delete from t_user where id in ('1','2','3')

批量删除形式:

代码语言:sql复制
select * from t_user where id in (  , )

首先添加用于删除的数据

代码语言:javascript复制
INSERT t_user VALUES(null, '王五', 123, 32, '女', '1432@qq');
INSERT t_user VALUES(null, '李四', 123, 12, '男', '123@3221');

mapper.java和xml中用到 的代码。

代码语言:html复制
<!--int deleteMore(@Param("ids") String ids);-->
<delete id="deleteMore">
	delete from t_user where id in (${ids})
</delete>

测试.java

代码语言:java复制
//测试类
@Test
public void deleteMore() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
    int result = mapper.deleteMore("7,8");
    System.out.println(result);
}

测试结果

测试批量删除结果测试批量删除结果

动态设置表名

只能使用${},因为表名不能加单引号

xml配置

代码语言:javascript复制
<!--List<User> getUserByTable(@Param("tableName") String tableName);-->
<select id="getUserByTable" resultType="User">
	select * from ${tableName}
</select>

添加功能获取自增的主键

在mapper.xml中设置两个属性

useGeneratedKeys:设置使用自增的主键 keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中

代码语言:html复制
<!--void insertUser(User user);-->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
    insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email})
</insert>
代码语言:javascript复制
//测试类
@Test
public void insertUser() {
	SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
	User user = new User(null, "ton", "123", 23, "男", "123@321.com");
	mapper.insertUser(user);
	System.out.println(user);
	//输出:user{id=10, username='ton', password='123', age=23, sex='男', email='123@321.com'},
	//自增主键存放到了user的id属性中
}

0 人点赞