# 1.模糊查询的用法
mysql中常用条件连接符
“`sql
— 查询条件
— 条件连接符 and or in
— < > <= >= != <>
— BETWEEN ‘2024-11-01 00:00:00’ and ‘2024-11-02 00:00:00’
— like 模糊匹配符 _ %
“`
模糊查询在业务场景中非常常用
“`sql
select * from user
where username like CONCAT(‘%’,’老’,’%’)
“`
mybatis映射文件
“`xml
“`
# 2.排序用法
排序时 需要拼语法结构 不能用#{} 需要用${} 做语法拼接
“`java
@Test
public void listUserBySortTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
//List
List
System.out.println(JSON.toJSONString(users));
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
“`xml
“`
#{} 传参使用
${} 拼语法使用 没有使用占位符
# 3.sql标签公用字段标签
查询数据时 不要*(做全表扫描 查询较慢) 可读性比较差 会把需要的字段标记出来
标记公共字段
“`xml
id,username,age,`password`,image,balance,create_time,update_time,rid,deptno
“`
查询时引用公共字段
“`xml
“`
# 4.动态sql
### 通过java代码根据不同的查询情况 拼接出不同的sql语句
mybats提供了动态sql标签 通过标签配置 生成对应动态sql语句
### 1.查询场景
#### 1.1动态查询条件 根据用户选填条件不同 生成不同的条件语句
“`xml
and username like CONCAT(‘%’,#{username},’%’)
and deptno = #{deptno}
and age = #{age}
“`
注意:
{
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
//List
User user = new User();
// user.setAge(30);
// user.setDeptno(10l);
user.setUsername(“老”);
List
System.out.println(JSON.toJSONString(users));
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
#### 1.2动态查询多条数据
接口文件
“`java
//List
//String listIdStr 简化做法 需要使用${}拼接语法 不能防注入
// 所以参数:1,2,3,4,5 不是从页面传的时候 才可以使用
//通过@Param封装map 指定list的key 方便映射文件使用
List
“`
映射文件
“`xml
“`
测试代码:
“`java
@Test
public void listUserByListIdTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List
listId.add(1l);
//listId 需要有数据 没数据会报错 执行前需要检测是否有数据
List
System.out.println(JSON.toJSONString(users));
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
### 2.删除场景
多条删除
配合in语句 通过forEach遍历集合数据 多条删除
接口文件
“`java
//List
//String listIdStr 1,2,3,4,5 不是从页面传的
int deleteUserByListId(@Param(“listId”) List
“`
映射文件
“`xml
delete from user
where id in
#{id}
“`
测试案例
“`java
@Test
public void deleteUserByListIdTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List
listId.add(29l);
listId.add(30l);
listId.add(31l);
//listId 需要有数据 没数据会报错 执行前需要检测是否有数据
int resNum = mapper.deleteUserByListId(listId);
System.out.println(resNum);
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
### 3.添加场景 多条添加
批量从文件导入数据时使用
接口文件
“`java
//List
int addUserByUserList(@Param(“addUserList”)List
“`
映射文件
“`xml
insert into user(username,`password`,age) VALUES
(#{user.username},#{user.password},#{user.age})
“`
测试案例
“`java
@Test
public void addUserByUserListTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List
addUserList.add(new User(“aaa1”, 13, “aaa”));
addUserList.add(new User(“aaa2”, 13, “aaa”));
addUserList.add(new User(“aaa3”, 13, “aaa”));
//listId 需要有数据 没数据会报错 执行前需要检测是否有数据
int resNum = mapper.addUserByUserList(addUserList);
System.out.println(resNum);
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
### 4.动态修改 根据条件不同执行的修改不同
给多模块公共修改语句时使用
接口文件
“`java
int UpdateUserByCondition(User inputUser);
“`
映射文件
“`xml
update user
username = #{username} ,
age = #{age} ,
where id = 38
“`
测试案例
“`java
@Test
public void updateUserByConditionTest(){
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
// User user = new User(“aaa2”, 13, “aaa”);
User user = new User();
user.setAge(99);
user.setId(38l);
//listId 需要有数据 没数据会报错 执行前需要检测是否有数据
int resNum = mapper.UpdateUserByCondition(user);
System.out.println(resNum);
MyBatisHealper.backAndSaveSqlSession(sqlSession);
}
“`
# 5mybatis缓存
“`java
* mybatis缓存
* 一级缓存(sqlSession级别) 查询数据时 如果是相同的数据 会自动存入缓存(不多次查询数据库)
* 在一次sqlSession中生效
*
* 二级缓存(SqlSessionFactory) 可以跨sqlSession共享数据
*
*
* redis (类似 内存数据库) 可以替代java中的自带缓存
“`
“`java
@Test
public void listUserCacheTest(){
/*
* mybatis缓存
* 一级缓存(sqlSession级别) 查询数据时 如果是相同的数据 会自动存入缓存(不多次查询数据库)
* 在一次sqlSession中生效
*
* 二级缓存(SqlSessionFactory) 可以跨sqlSession共享数据
*
*
* redis (类似 内存数据库) 可以替代java中的自带缓存
*
*
* */
SqlSession sqlSession = MyBatisHealper.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
//在一次事务控制中 如果使用了相同的数据 直接从缓存加载
List
System.out.println(“第一次查询的数据”+JSON.toJSONString(users));
MyBatisHealper.backAndSaveSqlSession(sqlSession);
SqlSession sqlSession2 = MyBatisHealper.getSqlSession();
UserDao mapper2 = sqlSession2.getMapper(UserDao.class);
//在一次事务控制中 如果使用了相同的数据 直接从缓存加载
List
System.out.println(“第二次查询的数据”+JSON.toJSONString(users2));
MyBatisHealper.backAndSaveSqlSession(sqlSession2);
}
“`
# 6.mybatis注解配置
mybatis可以不使用配置文件 使用注解配置 注解不适合复杂配置