mapper.xml文件的头,定义xml版本,编码格式
引入myBatis
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
注意:该标签还包含一个标签,其他的标签代码需放在这个代码块里面。
<mapper namespace="com.fan.mapper.UserMapper">
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>
SQL 标签是用于抽取可重用的 SQL 片段,将相同的,使用频繁的 SQL 片段抽取出来,单独定义,方便多次引用。id为代码块的名称,通常与include标签连用,include标签引用已经抽取的sql片段,还可以自定义一些property,sql 标签内部就能使用自定义的属性 :include-property:取值的正确方式${prop},#{不能使用这种方式},主要有以下几种用法:
<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>
<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>
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
默认是LRU
1.LRU – 最近最少使用的:移除最长时间不被使用的对象。
2.FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
3.SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
4.WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
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>
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>
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>
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>
update标签为删除操作标签,id为该操作的名称,对应mapper接口中的方法名,parameterType为参数类型。
<delete id="deleteJy" parameterType="string">
delete from jy_info where yw_id=#{ywNo}
delete>
注意点:mybatis中使用ParameterType向sql语句传参,在sql语句中引用这些参数的时候,有两种方式:#parameterName, $parameterName。
#是一个占位符,$是拼接符。
(1)使用#parameterName方式引用参数的时候,Mybatis会把传入的参数当成是一个字符串,自动添加双引号。
(2)使用$parameterName引用参数时,不做任何处理,直接将值拼接在sql语句中。
\#的方式引用参数,mybatis会先对sql语句进行预编译,然后再引用值,能够有效防止sql注入,提高安全性。$的方式引用参数,sql语句不进行预编译。
建议使用# 。