Mybatis的mapperxml⽂件中的常⽤标签。
Mybatis的mapper xml⽂件中的常⽤标签
⼀、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"—— 定义出参,调⽤已定义的<resultMap>映射管理器的id值
★resultType="xxxx"——定义出参,匹配普通Java类型或⾃定义的pojo【出参类型若不指定,将为语句类型默认类型,如<insert>语句返回值为int】
2》注意: ⾄于为何<insert><delete><update> 语句的返回值类型为什么是int,有过JDBC操作经验的朋友可能会有印象,增删改操作实际上返回的是操作的条数。⽽Mybatis框架本⾝是基于JDBC的,所以此处也沿袭这种返回值类型。
3》传参和取值:l 的灵活性还体现在SQL执⾏语句可以传参,参数类型通过parameterType= "" 定义
★取值⽅式1:#{value jdbcType = valuetype}:jdbcType 表⽰该属性的数据类型在数据库中对应的类型,如 #{user
jdbcType=varchar} 等价于 String username;
★取值⽅式2:${value } : 这种⽅式不建议⼤量使⽤,可能会发送sql注⼊⽽导致安全性问题。⼀般该取值⽅式可⽤在⾮经常变化的值上,如orderby ${columnName};
⼆、sql⽚段标签<sql>:通过该标签可定义能复⽤的sql语句⽚段,在执⾏sql语句标签中直接引⽤即可。这样既可以提⾼编码效率,还能有效简化代码,提⾼可读性
1》 需要配置的属性:id="" ———表⽰需要改sql语句⽚段的唯⼀标识
2》引⽤:通过<include refid="" />标签引⽤,refid="" 中的值指向需要引⽤的<sql>中的id=""属性
1、<!--定义sql⽚段-->
<sql id="orderAndItem">
</sql>
<select id="findOrderAndItemsByOid" parameterType="java.lang.String" resultMap="BaseResultMap">
select
2、<!--引⽤sql⽚段-->
<include refid="orderAndItem" />
from ordertable o
join orderitem i deritem_id = i.orderitem_id
der_id = #{orderId}
</select>
三、映射管理器resultMap:映射管理器,是Mybatis中最强⼤的⼯具,使⽤其可以进⾏实体类之间的关系,并管理结果和实体类间的映射关系
1》需要配置的属性:<resultMap id="" type=""></resutlMap>
id=""——表⽰这个映射管理器的唯⼀标识,外部通过该值引⽤;
type ="" ——表⽰需要映射的实体类;
2》 需要配置的参数:<id column = "" property= "" />
<id>标签指的是:结果集中结果唯⼀的列【column】 和 实体属性【property】的映射关系,
3》注意:<id>标签管理的列未必是主键列,需要根据具体需求指定;
<result column= " " property=" " />  <result>标签指的是:结果集中普通列【column】 和 实体属性【property】的映射关系;
4》 需要维护的关系:所谓关系维护是值在主表查询时将其关联⼦表的结果也查询出来
1)⼀对⼀关系
<assocation property = " " javaType=" ">
property = “ ”→ 被维护实体在宿主实体中的属性名,
javaType = " "→ 被维护实体的类型
Orderitem.java
package pojo;
public class Orderitem {
private String orderitemId;
private String productId;
private Integer count;
private Product product;
从上⽅代码段可以看出:Product 对象在 Orderitem 实体中以 product 属性存在
<resultMap id="BaseResultMap" type="pojo.Orderitem" >
<id column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />
<result column="product_id" property="productId" jdbcType="VARCHAR" />
<result column="count" property="count" jdbcType="INTEGER" />
★ <!-- 通过association 维护 ⼀对⼀关系 -->
<association property="product" javaType="pojo.Product">
<id column="product_id" property="productId"/>
<result column="product_factroy" property="productFactroy"/>
<result column="product_store" property="productStore"/>
<result column="product_descript" property="productDescript"/>
</association>
</resultMap>
通过xml的配置可以看出,在resultMap映射管理器中,通过<association> 进⾏了维护,也就是在查询Orderitem对象时,可以把关联的Product对象的信息也查询出来
2)⼀对多关系的维护
<collection property=" " ofType=" ">
property = “”→ 被维护实体在宿主实体中的属性名
ofType=“ ”→是被维护⽅在宿主类中集合泛型限定类型
【由于在⼀对多关系中,多的⼀放是以List形式存在,因此ofType的值取⽤Lsit<?> 的泛型对象类型】
OrderTable.java
public class OrderTable {
private String orderId;
private String cid;
private String address;
private Date createDate;
private String orderitemId;
private List<Orderitem> orderitemList ;
}
<resultMap id="BaseResultMap" type="pojo.OrderTable" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.      This element was generated on Fri May 06 15:49:42 CST 2016.
-->
<id column="order_id" property="orderId" jdbcType="VARCHAR" />
<result column="cid" property="cid" jdbcType="VARCHAR" />
<result column="address" property="address" jdbcType="VARCHAR" />
<result column="create_date" property="createDate" jdbcType="TIMESTAMP" />    <result column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />    ★ <!--维护⼀对多的关系  -->
<collection property="orderitemList" ofType="pojo.Orderitem">
<id column="orderitem_id" property="orderitemId"/>
<result column="product_id" property="productId"/>
<result column="count" property="count"/>
</collection>
</resultMap>
5》在resultMap 中需要注意两点:
关联关系的维护可以根据实体类之间的实际情况进⾏嵌套维护
<resultMap id="BaseResultMap" type="pojo.OrderTable" >
<id column="order_id" property="orderId" jdbcType="VARCHAR" />
<result column="cid" property="cid" jdbcType="VARCHAR" />
<result column="address" property="address" jdbcType="VARCHAR" />
<result column="create_date" property="createDate" jdbcType="TIMESTAMP" />      <result column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />    ★<!--维护⼀对多的关系  -->
<collection property="orderitemList" ofType="pojo.Orderitem">
<id column="orderitem_id" property="orderitemId"/>
<result column="product_id" property="productId"/>
<result column="count" property="count"/>
<span >        </span><!--嵌套⼀对⼀关系-->
<association property="customer" javaType="pojo.Customer">
<id column="cid" property="cid"/>
<result column="cname" property="cname"/>
</association>
</collection>
</resultMap>
关于出现重复列名的处理:在实际操作过程中,查询到的结果可能会出现相同的列名,这样会对映射到实体属性带来影响甚⾄出现报错,那么对待这个问题可以通过对列取别名的⽅式处理
四:常⽤的动态语句标签:通过动态sql标签可以进⾏条件判断,条件遍历等操作从⽽满⾜结果的需要
1》<where> : 使⽤其可以代替sql语句中的where关键字,⼀般防⽌在条件查询的最外层
xml标签大全2》<if >:条件判断标签,配置属性test=" 条件字符串 ",判断是否满⾜条件,满⾜则执⾏,不满⾜则跳过
<select id="findOrderItemDetail" parameterType="pojo.Orderitem" resultMap="BaseResultMap">
deritem_id,product.*
from orderitem,product
<where>
<if test="orderitemId!=null and orderitemId!=''">
deritem_id = #{orderitemId}
</if>
<if test="productId!=null and productId!=''">
and orderitem.product_id = #{productId}
</if>
<if test="count!=null">
unt = #{count}
</if>
</where>
</select>
3》<set>:常⽤于<update>更新语句中,替代 sql中的“set”关键字,特别是在联合<if>进⾏判断是,可以有效⽅式当某个参数为空或者不合法是错误的更新到数据库中
<update id="updateByPrimaryKeySelective" parameterType="pojo.Orderitem" >
update orderitem

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。