目录
1、模糊查询
1.1、方法一:使用 #{}
1.2、方法二:使用concat、${}
1.3、方法三:使用双引号、#{}
2、批量删除:使用in()
3、动态设置表名
4、添加功能获取自增的主键
本次笔记使用的模块是 MyBatis_demo2
1、模糊查询
1.1、方法一:使用 #{}
① 创建 SQLMapper 接口,并添加方法
public interface SQLMapper {
List getUserByLike(@Param("username") String username);
}
② 创建对应的映射文件 SQLMapper.xml,并添加 SQL 语句,这里先测试使用 #{} 来获取参数值
select * from t_user where username like '%#{username}%'
③ 测试方法
@Test
public void testGetUserByLike(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
List d = mapper.getUserByLike("d");
System.out.println(d);
}
④ 输出结果
DEBUG 03-16 17:12:20,017 ==> Preparing: select * from t_user where username like '%?%' (baseJdbcLogger.java:137)
可以看到 SQL 语句中 #{} 被替代为 ?
⑤ 使用 ${} 来替代 #{} 获取参数值
select * from t_user where username like '%${username}%'
⑥ 测试,输出结果如下
DEBUG 03-16 17:57:07,529 ==> Preparing: select * from t_user where username like '%d%' (baseJdbcLogger.java:137)
DEBUG 03-16 17:57:07,557 ==> Parameters: (baseJdbcLogger.java:137)
DEBUG 03-16 17:57:07,577 <== Total: 1 (baseJdbcLogger.java:137)
[User{id=4, username='admin', password='123456', age=23, sex='男', email='123456@qq.com'}]
1.2、方法二:使用concat、${}
select * from t_user where username like concat('%',#{username},'%')
1.3、方法三:使用双引号、#{}
2、批量删除:使用in()
2、批量删除:使用in()
由于 #{} 会在参数两边自动拼接单引号,会导致出错,但不会报错,只是更新的数据为0条,例如:如果使用#{},则解析后的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') 。所以只能使用 ${}
① 在 SQLMapper 接口添加方法
int deleteMore(@Param("ids") String ids);
② 在 SQLMapper.xml 添加 SQL 语句
delete from t_user where id in(${ids})
③ 测试方法
@Test
public void testDeleteMore(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
int i = mapper.deleteMore("1,2,3");
System.out.println(i);
}
④ 输出结果
DEBUG 03-16 18:27:41,358 ==> Preparing: delete from t_user where id in(1,2,3) (baseJdbcLogger.java:137) DEBUG 03-16 18:27:41,397 ==> Parameters: (baseJdbcLogger.java:137) DEBUG 03-16 18:27:41,400 <== Updates: 1 (baseJdbcLogger.java:137) 1
3、动态设置表名
只能使用 ${},因为表名不能加单引号
① 在 SQLMapper 接口添加方法
List getUserByTableName(@Param("tableName") String tableName);
② 在 SQLMapper.xml 添加 SQL 语句
③ 测试方法
@Test
public void testGetUserByTableName(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
List t_user = mapper.getUserByTableName("t_user");
System.out.println(t_user);
}
④ 输出结果
DEBUG 03-16 20:14:40,053 ==> Preparing: select * from t_user (baseJdbcLogger.java:137)
DEBUG 03-16 20:14:40,085 ==> Parameters: (baseJdbcLogger.java:137)
DEBUG 03-16 20:14:40,105 <== Total: 2 (baseJdbcLogger.java:137)
[User{id=4, username='admin', password='123456', age=23, sex='男', email='123456@qq.com'}, User{id=5, username='李四', password='lisi', age=33, sex='男', email='lisi@qq.com'}]
4、添加功能获取自增的主键
应用场景:
假设现在有两张表:t_clazz(clazz_id,clazz_name) t_student(student_id,student_name,clazz_id)
需求:为学生设置班级(班级需要新建)
1. 添加班级信息
2. 获取新添加的班级的id
3. 为班级分配学生,即将某学的班级id修改为新添加的班级的id
① 在 SQLMapper 接口添加 insert 方法
void insertUser(User user);
② 在 SQLMapper.xml 添加 SQL 语句
insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})
③ 测试方法
@Test
public void testInsertUser(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
SQLMapper mapper = sqlSession.getMapper(SQLMapper.class);
User user = new User(null, "admin", "123456", 99, "女", "admin@qq.con");
mapper.insertUser(user);
System.out.println(user);
}
④ 输出结果,发现输出的 user 对象有 id 值
DEBUG 03-16 21:05:19,306 ==> Preparing: insert into t_user values(null,?,?,?,?,?) (baseJdbcLogger.java:137)
DEBUG 03-16 21:05:19,339 ==> Parameters: admin(String), 123456(String), 99(Integer), 女(String), admin@qq.con(String) (baseJdbcLogger.java:137)
DEBUG 03-16 21:05:19,343 <== Updates: 1 (baseJdbcLogger.java:137)
User{id=6, username='admin', password='123456', age=99, sex='女', email='admin@qq.con'}



