提示:还是建议大家先开下目录,自我检查一番
提示:以下是本篇文章正文内容
Mybatis是一种优秀的持久层框架,它内部封装了JDBC,这使得开发过程中只需要关注SQL语句本身即可,灵活性高。它支持自定义sql、存储过程和高级映射,开发可以通过xml或者注解进行编写SQL语句
优点:
缺点:
Mybatis中#{}会被替换成?,而${}会直接替换成变量的值。
#{}可以有效地防止SQL注入。
Myabtis 提供了一个标签foreach
insert /delete/update ...
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreah>
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")“合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=”,“会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open=”("合用。常用在in(),values()时。该参数可选。
collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = “ids”.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”
if
choose (when, otherwise)
trim (where, set)
foreach
if :根据条件判断,是where后的一部分;
<if test="title != null">
AND title like #{title}
</if>
choose:类似于Java中的Switch语句
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
通过自定义 trim 元素来定制 where 元素的功能。比如,和 where 元素等价的自定义 trim 元素为:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。比如:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},
<if test="password != null">password=#{password},
<if test="email != null">email=#{email},
<if test="bio != null">bio=#{bio}
</set>
where id=#{id}
</update>
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
Mybatis 提供了 9 种动态 sql 标签:
trim
where
set
foreach
if
choose
when
otherwise
bind
Myabtis 提供了标签,在定义ResultMap时可以通过标签实现关联查询
<resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.lcb.user.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
<collection property="student" ofType="com.lcb.user.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
Mybatis 默认是开启一级缓存的,一级缓存的存储作用域实在Session中,当Session刷新或者关闭后,缓存将会被清空;
二级缓存默认不开启,二级缓存存储作用域是他的命名空间中,使用时可以在配置文件中那个通过
mybatis.configuration.cache-enabled=true开启,需要注意,使用二级缓存时属性类都需要实现序列化。
mybatis:
mapper-locations: classpath:mapping/*Mapper.xml #这里是指定Mapper文件的位置
type-aliases-package: com.example.entity #指定实体类的位置
以上就是今天要讲的关于Mybatis方面的一些内容,本文大体罗列了一些常见的Mybatis方面的问题,不足之处欢迎指正。