myBatis常用标签
1.1、头标签
mapper.xml文件的头,定义xml版本,编码格式
<?xml version="1.0" encoding="UTF-8"?>
引入myBatis
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
1.2、关联mapper接口文件
注意:该标签还包含一个标签,其他的标签代码需放在这个代码块里面。
<mapper namespace="com.fan.mapper.UserMapper">
2.1、resultMap标签
resultMap标签是封装返回值集合的标签,标签中id属性为该标签的名称,type为封装集合的类型,通常为实体类类型。id标签对应实体id,column为该字段在数据库中定义的名称,jdbcType为该字段在数据库中的类型,property为该字段在Java程序中实体类中的属性名。result标签则对应该实体类中的各个属性,此处应注意实体类中属性定义的名称与数据库中定义的名称的区别。
<resultMap id="YwResultMap" type="com.java.pojo.Yw">
<id column="yw_id" jdbcType="INTEGER" property="ywId" />
<result column="yw_no" jdbcType="VARCHAR" property="ywNo" />
<result column="gk_id" jdbcType="VARCHAR" property="gkId" />
<result column="yw_name" jdbcType="VARCHAR" property="ywName" />
<result column="yw_lrtime" jdbcType="TIMESTAMP" property="ywLrtime" />
<result column="yw_xgtime" jdbcType="TIMESTAMP" property="ywXgtime" />
<result column="jy_state" jdbcType="INTEGER" property="jyState" />
<result column="yw_price" jdbcType="DOUBLE" property="ywPrice" />
</resultMap>
2.2、sql标签与include标签连用
SQL 标签是用于抽取可重用的 SQL 片段,将相同的,使用频繁的 SQL 片段抽取出来,单独定义,方便多次引用。id为代码块的名称,通常与include标签连用,include标签引用已经抽取的sql片段,还可以自定义一些property,sql 标签内部就能使用自定义的属性 :include-property:取值的正确方式${prop},#{不能使用这种方式},主要有以下几种用法:
2.2.1、抽取sql片段
<sql id="empColumns">
id, last_name lastName, email email, gender gender from tbl_employee
</sql>
<!--查询-->
<select id="getEmpByEid" resultType="Emp">
select
<include refid="empColumns">
<property name="testColomn" value="abc"/> //还可以在这里设置属性
</include>
where eid = #{eid}
</select>
2.2.2、获取公共的属性值
<sql id="insertColumn">
<if test="_databaseId=='oracle'">
employee_id,last_name,email,${testColumn} //使用${属性} 来获取 <include>中设置的值
</if>
<if test="_databaseId=='mysql'">
last_name,email,gender,d_id
</if>
</sql>
<!--设置属性值-->
<insert id="addEmps">
insert into employees(
<include refid="insertColumn">
<property name="testColomn" value="abc"/> //还可以在这里设置属性
</include>
)
values(#{id}, #{lastName}, #{email})
</insert>
2.3、cache标签
2.3.1、参数
- flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
- size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
- readOnly(只读)属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
<!--这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。-->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
2.3.2、可用的回收策略
默认是LRU
1.LRU – 最近最少使用的:移除最长时间不被使用的对象。
2.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
3.SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
4.WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
2.4、parameterMap标签
parameterMap可以用于指定实体类字段属性与数据库字段属性的映射关系,可以和esult Map搭配使用,**这样一来当传入参数实体类中的字段名和数据库的字段名名称上没有对应也能查询出想要的结果,这就是parameterMap的作用。**例如:
<parameterMap id="ParameterMap" type="Student">
<parameter property="studentId" resultMap="ResultMap"></parameter>
<parameter property="studentName" resultMap="ResultMap"></parameter>
<parameter property="studentAge" resultMap="ResultMap"></parameter>
</parameterMap>
<resultMap id="ResultMap" type="Student">
<id column="id" property="studentId"></id>
<result column="name" property="studentName"></result>
<result column="age" property="studentAge"></result>
</resultMap>
3.1、常用数据操作标签
3.1.1、select标签
select标签为查询操作标签,id为该查询操作的名称,与mapper接口的方法名对应,parameterType为参数类型,resultMap为返回值类型,当没用使用result Map时,通常查询的返回值类型为实体类类型。查询中标签为条件字句,相当与where关键字,标签为判断标签,当test成立时显示标签内内容。
<select id="selectYw" parameterType="com.java.pojo.Yw" resultMap="YwResultMap">
select * from yw_info
<where>
<if test="gkId !=null and gkId !=''">and gk_id=#{gkId}</if>
<if test="ywName !=null and ywName !=''">and yw_name like concat('%',#{ywName},'%')</if>
<if test="ywNo !=null and ywNo !=''">and yw_no=#{ywNo}</if>
</where>
</select>
3.1.2、insert标签
insert标签为插入操作标签,id为该操作的名称,与mapper接口的方法名对应,parameterType为参数类型,其中的trim标签为格式化标签,主要是去掉前后括号以及参数最后的逗号,防止动态sql语句发生语法错误,prefix:给trim标签内sql语句加上前缀suffix:给trim标签内sql语句加上后prefixOverrides:去除多余的前缀内容,如:prefixOverrides=“OR”,去除trim标签内sql语句多余的前缀"OR",suffixOverrides:去除多余的后缀内容,如suffixOverrides=“,”,去除trim标签内sql语句多余的后缀","。
<insert id="insertYwInfo" parameterType="com.java.pojo.Yw">
insert into yw_info
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ywNo != null ">yw_no,</if>
<if test="ywName != null and ywName !=''">yw_name,</if>
<if test="gkId != null and gkId !=''">gk_id,</if>
<if test="ywLrtime != null ">yw_lrtime,</if>
<if test="ywPrice != null and ywPrice !=''">yw_price,</if>
jy_state,
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="ywNo != null ">#{ywNo},</if>
<if test="ywName != null and ywName !=''">#{ywName},</if>
<if test="gkId != null and gkId !=''">#{gkId},</if>
<if test="ywLrtime != null ">#{ywLrtime},</if>
<if test="ywPrice != null and ywPrice !=''">#{ywPrice},</if>
#{jyState},
</trim>
</insert>
3.1.3、update标签
update标签为更新操作标签,id为该操作的名称,对应mapper接口中的方法名,parameterType为参数类型,其中的set标签类似sql语句中的set关键字。
<update id="updateYwInfo" parameterType="com.java.pojo.Yw">
update yw_info
<set>
<if test="gkId != null and gkId != ''">gk_id = #{gkId},</if>
<if test="ywName != null and ywName != ''">yw_name = #{ywName},</if>
<if test="ywPrice != null and ywPrice != ''">yw_price = #{ywPrice},</if>
yw_xgtime = sysdate()
</set>
where yw_id = #{ywNo}
</update>
3.1.4、delete标签
update标签为删除操作标签,id为该操作的名称,对应mapper接口中的方法名,parameterType为参数类型。
<delete id="deleteJy" parameterType="string">
delete from jy_info where yw_id=#{ywNo}
</delete>
4、补充点
注意点:mybatis中使用ParameterType向sql语句传参,在sql语句中引用这些参数的时候,有两种方式:#parameterName, $parameterName。
4.1, #是一个占位符,$是拼接符。
#是一个占位符,$是拼接符。
(1)使用#parameterName方式引用参数的时候,Mybatis会把传入的参数当成是一个字符串,自动添加双引号。
(2)使用$parameterName引用参数时,不做任何处理,直接将值拼接在sql语句中。
4.2,使用 # 能够防止sql注入,$不能避免注入攻击。
\#的方式引用参数,mybatis会先对sql语句进行预编译,然后再引用值,能够有效防止sql注入,提高安全性。$的方式引用参数,sql语句不进行预编译。
4.3 ,总结
建议使用# 。