放在前面,给大家推荐一个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>
添加功能获取自增的主键
代码语言:html复制在mapper.xml中设置两个属性
useGeneratedKeys:设置使用自增的主键 keyProperty:因为增删改有统一的返回值是受影响的行数,因此只能将获取的自增的主键放在传输的参数user对象的某个属性中
<!--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属性中
}