Mybatis下

南楼画角 提交于 2019-12-01 10:23:24

动态SQL

多条件查询常规实现:
String sql = "select * from tb_user where 1=1";
if(填写用户){
sql += " and username = xxx";
}
....
拼接比较复杂,容易出错
把业务逻辑耦合到数据库操作(DAO)中

动态SQL是MyBatis的重要特性,能够在映射文件的SQL语句中,加入逻辑判断,自动拼接SQL,从而实现复杂功能

动态SQL语句的标签:

基本的条件判断
配置查询条件
配置update语句
自定义条件配置
循环标签

标签

语法:
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="是否清空缓存"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!