一、SQL语句标签:
1、<!--查询语句-->
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
</select>
2、<!--插入语句-->
<insert id="insert" parameterType="pojo.OrderTable" >
insert into ordertable (order_id, cid, address,
create_date, orderitem_id)
values (#{orderId,jdbcType=VARCHAR},#{cid,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR},
#{createDate,jdbcType=TIMESTAMP}, #{orderitemId,jdbcType=VARCHAR})
</insert>
3、<!--删除语句-->
<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
delete from ordertable
where order_id = #{orderId,jdbcType=VARCHAR}
</delete>
4、<!--修改语句-->
<update id="updateByPrimaryKey" parameterType="pojo.OrderTable" >
update ordertable
set cid = #{cid,jdbcType=VARCHAR},
address = #{address,jdbcType=VARCHAR},
create_date = #{createDate,jdbcType=TIMESTAMP},
orderitem_id = #{orderitemId,jdbcType=VARCHAR}
where order_id = #{orderId,jdbcType=VARCHAR}
</update>
1》需要配置的属性:
★id=“xxxx” ——表示此段sql执行语句的唯一标识,也是接口的方法名称【必须一致才能找到】
★parameterType=“xxxx” ——表示该sql语句中需要传入的参数, 类型要与对应的接口方法的类型一致【可选】
★resultMap=“xxx”—— 定义出参,调用已定义的映射管理器的id值
★resultType=“xxxx”——定义出参,匹配普通Java类型或自定义的pojo【出参类型若不指定,将为语句类型默认类型,如语句返回值为int】
2》注意: 至于为何 语句的返回值类型为什么是int,有过JDBC操作经验的朋友可能会有印象,增删改操作实际上返回的是操作的条数。而Mybatis框架本身是基于JDBC的,所以此处也沿袭这种返回值类型。
3》传参和取值:mapper.xml 的灵活性还体现在SQL执行语句可以传参,参数类型通过parameterType= “” 定义
★取值方式1:#{value jdbcType = valuetype}:jdbcType 表示该属性的数据类型在数据库中对应的类型,如 #{user jdbcType=varchar} 等价于 String username;
★取值方式2:${value } : 这种方式不建议大量使用,可能会发送sql注入而导致安全性问题。一般该取值方式可用在非经常变化的值上,如orderby ${columnName};
二、sql片段标签:通过该标签可定义能复用的sql语句片段,在执行sql语句标签中直接引用即可。这样既可以提高编码效率,还能有效简化代码,提高可读性
1》 需要配置的属性:id="" ———表示需要改sql语句片段的唯一标识
2》引用:通过<include refid="" />标签引用,refid="" 中的值指向需要引用的<sql>中的id=""属性
1、<!--定义sql片段-->
<sql id="orderAndItem">
o.order_id,o.cid,o.address,o.create_date,o.orderitem_id,i.orderitem_id,i.product_id,i.count
</sql>
<select id="findOrderAndItemsByOid" parameterType="java.lang.String" resultMap="BaseResultMap">
select
2、<!--引用sql片段-->
<include refid="orderAndItem" />
from ordertable o
join orderitem i on o.orderitem_id = i.orderitem_id
where o.order_id = #{orderId}
</select>
三、映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系
1》需要配置的属性:
id=""——表示这个映射管理器的唯一标识,外部通过该值引用;
type ="" ——表示需要映射的实体类;
2》 需要配置的参数:
标签指的是:结果集中结果唯一的列【column】 和 实体属性【property】的映射关系,
3》注意:标签管理的列未必是主键列,需要根据具体需求指定;
<result column= " " property=" " /> <result>标签指的是:结果集中普通列【column】 和 实体属性【property】的映射关系;
4》 需要维护的关系:所谓关系维护是值在主表查询时将其关联子表的结果也查询出来
四:常用的动态语句标签:通过动态sql标签可以进行条件判断,条件遍历等操作从而满足结果的需要
1》 : 使用其可以代替sql语句中的where关键字,一般防止在条件查询的最外层
2》:条件判断标签,配置属性test=" 条件字符串 ",判断是否满足条件,满足则执行,不满足则跳过
<select id="findOrderItemDetail" parameterType="pojo.Orderitem" resultMap="BaseResultMap">
select orderitem.orderitem_id,product.*
from orderitem,product
<where>
<if test="orderitemId!=null and orderitemId!=''">
and orderitem.orderitem_id = #{orderitemId}
</if>
<if test="productId!=null and productId!=''">
and orderitem.product_id = #{productId}
</if>
<if test="count!=null">
and orderitem.count = #{count}
</if>
</where>
</select>
3》:常用于更新语句中,替代 sql中的“set”关键字,特别是在联合进行判断是,可以有效方式当某个参数为空或者不合法是错误的更新到数据库中
<update id="updateByPrimaryKeySelective" parameterType="pojo.Orderitem" >
update orderitem
<set >
<if test="productId != null" >
product_id = #{productId,jdbcType=VARCHAR},
</if>
<if test="count != null" >
count = #{count,jdbcType=INTEGER},
</if>
</set>
where orderitem_id = #{orderitemId,jdbcType=VARCHAR}
</update>
4》 标签组:也是一个用于条件判断的标签组,和的不同之处在于条件从进入,去匹配中的添加,一旦匹配马上结束;若到找不到匹配项,将执行中的语句;可以理解为是 && 关系 是 || 关系
<!-- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->
<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
<where>
<choose>
<when test="studentName!=null and studentName!='' ">
ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
</when>
<when test="studentSex!= null and studentSex!= '' ">
AND ST.STUDENT_SEX = #{studentSex}
</when>
<when test="studentBirthday!=null">
AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
</when>
<when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">
AND ST.CLASS_ID = #{classEntity.classID}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
5》标签:该标签的作用是遍历集合类型的条件
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名.
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.
open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.
close表示以什么结束
用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item
<delete id="deleteByPriKeys" parameterType="java.lang.String">
delete from product where product_Id in
<foreach collection="list" item="productId" open="(" separator="," close=")">
#{productId,jdbcType = VARCHAR}
</foreach>
</delete>
常用列表查询demo:
<!-- 查询列表-->
<select id="selectList" parameterType="TestPlayWspCompanyDTO" resultMap="TestPlayWspCompanyVOResult">
<include refid="selectTestPlayWspCompanyVo" />
<where>
<if test="partnerName != null and partnerName != ''">and partner_name like '%${partnerName}%'</if>
<!-- CONCAT()函数用于将多个字符串连接成一个字符串 -->
<if test="realName != null and realName != ''">and real_name like concat('%',#{realName},'%')</if>
<if test="status != null ">and status =#{status}</if>
<!-- partners(1,2,3,4),编码串查询 ,传进来的可以是List,[](array),Map-->
<if test="partners !=null">
and partner in
<foreach item="str" collection="partners.split(',')" open="(" separator="," close=")">
#{str}
</foreach>
</if>
<!-- 创建时间查询,精确到时分秒 ,传入的是时间字符串 ,date_format函数还可以解析正常的字符串类型,%y%m%d %T格式=2008-12-29 02:10:23-->
<if test="createdTimeBegin != null and createdTimeBegin != ''"><!-- 转义符 > > -->
AND date_format(created_time,'%y-%m-%d %T') >= date_format(#{createdTimeBegin},'%y%m%d %T')
</if>
<if test="createdTimeEnd != null and createdTimeEnd != ''"><!-- 转义符 < < -->
AND date_format(created_time,'%y%m%d %T') <= date_format(#{createdTimeEnd},'%y%m%d %T')
</if>
<!-- 审核时间查询,精确到时分秒,传入进来的是Date类型,数据库保存的是deteTime -->
<if test="auditTimeBegin != null">
and audit_time >= #{auditTimeBegin}
</if>
<if test="auditTimeEnd != null">
and audit_time <= #{auditTimeEnd}
</if>
</where>
</select>
一对一查询:尽量少去使用collection,association 标签去查询,因为如果查询有10条list,就会10次去查询关联表,io数据库的次数就多,尽量一条sql用搞定,一对多可以使用group_concat()搞定
//查询映射对象
<resultMap type="TestPlayWspCompanyVO" id="TestPlayWspCompanyVOResult" extends="TestPlayWspCompanyResult" >
<association property="vehicleInfo" column="partner" select="getVehicleInfo"/>
</resultMap>
<!-- 映射查车辆信息 -->
<select id="getVehicleInfo" parameterType="java.lang.Integer" resultMap="TestPlayWspVehicleInfoResult">
select id, partner, vehicle_type, carrying_capacity, vehicle_number, plate_number, valid_flag, created_by,
created_name, created_time, changed_by, changed_name, changed_time from test_play_wsp_vehicle_info
where partner = #{partner,jdbcType=DECIMAL}
</select>
<!-- 车辆映射对应 -->
<resultMap type="TestPlayWspVehicleInfo" id="TestPlayWspVehicleInfoResult">
<result property="id" column="id" />
<result property="partner" column="partner" />
<result property="vehicleType" column="vehicle_type" />
<result property="carryingCapacity" column="carrying_capacity" />
<result property="vehicleNumber" column="vehicle_number" />
<result property="plateNumber" column="plate_number" />
<result property="validFlag" column="valid_flag" />
<result property="createdBy" column="created_by" />
<result property="createdName" column="created_name" />
<result property="createdTime" column="created_time" />
<result property="changedBy" column="changed_by" />
<result property="changedName" column="changed_name" />
<result property="changedTime" column="changed_time" />
</resultMap>
分页:
<select id="queryPage" resultType="cn.com.bluemoon.model.manage.vo.servicearea.ServiceAreaPageVO">
SELECT
t.province_code,
t.province_desc province_name,
t.city_code,
t.city_desc city_name,
t.county_code,
t.county_desc county_name,
t.street_code,
t.street_desc street_name,
t2.id,
t2.partner,
t2.start_date,
t2.end_date,
t2.created_by,
t2.created_name,
t2.created_time
FROM
crmbp.crm_bp_area_info t
LEFT JOIN wsp_service_area t2 ON t.street_code = t2.street_code AND t2.valid_flag = 0 and t2.start_date <= current_date and t2.end_date >=current_date
<where>
<if test="provinceCode != null">
and t.province_code = #{provinceCode}
</if>
<if test="cityCode != null">
and t.city_code = #{cityCode}
</if>
<if test="countyCode != null">
and t.county_code = #{countyCode}
</if>
<if test="streetCode != null">
and t.street_code = #{streetCode}
</if>
</where>
ORDER BY t2.changed_time desc,t.street_code is null,t.street_code asc,t.county_code asc
limit ${pageIndex*pageSize},${pageSize}
</select>