目录
动态SQL
多条件查询常规实现:
String sql = "select * from tb_user where 1=1";
if(填写用户){
sql += " and username = xxx";
}
....
拼接比较复杂,容易出错
把业务逻辑耦合到数据库操作(DAO)中
动态SQL是MyBatis的重要特性,能够在映射文件的SQL语句中,加入逻辑判断,自动拼接SQL,从而实现复杂功能
动态SQL语句的标签:
标签
语法:
SQL语句
SQL语句
当条件成立,if中的SQL语句会和外面SQL语句拼接到一起
<select id="selecUser" parameterType="User" > select * from tb_user where <if test="username != null"> username = #{username} </if> <if test="realname != null"> and realname = #{realname} </if> <select >
问题:可能出现多余的and或where
标签
作用:自动添加where,去掉多余的and、or、where
语法:
SQL语句
<where> <if test="条件"> SQL语句 </if> </where>
示例:
<select id="selecUser" parameterType="User" > select * from tb_user <where> <if test="username != null"> username = #{username} </if> <if test="realname != null"> and realname = #{realname} </if> </where> <select >
补充:查看SQL日志
在mybatis配置文件中添加:
spring-mybaits中工厂配置中添加:
标签
用于update语句,作用是:自动添加set,去掉多余的,
update tb_user
username = #{username},
and realname = #{realname},
...
where user_id = #{userId}
标签
灵活配置添加前缀、后缀,删除前缀、后缀
使用
..
标签
循环添加SQL语句
select * from tb_user where username in('user1','user2','user3')
注意:集合参数前添加@Param("名称")
#{name}
对象的关联映射
对象之间的关联关系有:
一对一 如:用户和身份证 一对多 如:用户和评论,商品和订单 多对多 如:学生和课程
通过映射文件,实现对象和对象的关系
配置方式:
1)子查询
查询两次:
1)查询用户
2)按用户id查询用户所有评论
2)连接查询
内连接直接一次查询到两个表的数据
子查询:配置用户找到评论
1)在用户类添加评论的集合属性,并添加set、get
2)定义CommentDAO接口,定义按用户id查询评论的方法
3)定义Mapper文件实现该方法
4)修改UserMapper.xml
在resultMap添加标签
collection 用于配置一对多关系的集合
配置通过评论找到用户
1)在评论类添加用户对象属性,get\set
2) 在UserMapper中实现按用户id查询用户的方法,并实现
3) 修改CommentMapper.xml
在resultMap添加标签
association 用于配置一对一关系的对象
连接查询:
配置用户找到评论
1)在用户类添加评论的集合属性,并添加set、get
2)修改UserMapper.xml
在resultMap添加标签
collection 用于配置一对多关系的集合
<collection property="comments" column="user_id" ofType="com.qianfeng.mybatis.entity.Comment" javaType="java.util.ArrayList"> <!--配置主键 property配置Java类的属性名 column表的列名 javaType配置属性类型,jdbcType字段类型--> <id property="commentId" column="comment_id"></id> <!--配置一般的列--> <result property="time" column="time"></result> <result property="stars" column="stars"></result> <result property="userId" column="user_id"></result> <result property="nannyId" column="nanny_id"></result> </collection>
3) 把所有的用户的查询改成内连接
<select id="selectById" parameterType="int" resultMap="userMap"> <!--select * from tb_user where user_id = #{userId}--> select * from tb_user u,tb_comment c where u.user_id = c.user_id and u.user_id = #{userId} </select>
对比子查询和内连接:
子查询不用修改每个查询,内连接需要修改每个查询为连接查询 子查询可以使用延迟加载,内连接不支持延迟加载 内连接只查询一次,子查询查询多次
延迟加载
也叫懒加载,MyBatis的优化方式
当对象调用某个属性后,才进行查询
延迟加载默认情况下是关闭的
启动延迟加载,在MyBatis的settings中添加
缓存
没有缓存的情况下,所有用户会直接查询数据库,数据库压力很大
存在缓存的情况下,用户可以先查询缓存,减少直接查询数据的次数
作用:
1)提高查询速度
2)减少数据库服务器压力
MyBatis自带的缓存:
一级缓存
保存在内存中,使用范围是一个SqlSession中,默认开启
注意:Spring整合MyBatis后一级缓存会失效,每次查询都会创建新的SQLSession
当查询到一个对象后,MyBatis会缓存到内存中
如果用户再次访问该对象是,MyBatis直接返回该对象,不去查询数据库
失效情况:
1)SqlSession关闭
2)对象被删除或修改
二级缓存
保存在磁盘或内存中,默认关闭
启动方法:
1) 在settings加:
2)在对象对应的Mapper文件中加:
3) 实体类需要实现序列化接口
失效情况:
磁盘文件被删除
对象被删除或修改
缓存使用的过程:
缓存可能存在问题:
本地缓存和远程数据库的数据存在不一致
在查询上禁用缓存
useCache="是否使用缓存"
flushCache="是否清空缓存"