框架技术——mybatis

    在软件开发三层模式的持久层中,mybatis被广泛认为是可用的最简单的持久化框架之一。

    mybatis提供一种“半自动化”的ORM实现,重点维护了POJO与SQL之间的映射关系。它的基本配置,这里就暂不赘述了,我们重点讲一下它的流程及其SQL常用实现。

    当我们完成基本的配置之后,将按照下面的流程逐步执行。

    1、加载配置并初始化。开始加载配置文件,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

    2、接收调用请求。调用Mybatis提供的API,为SQL的ID和传入参数对象,将请求传递给下层的请求处理层进行处理。

    3、处理操作请求。API接口层传递请求过来,为SQL的ID和传入参数对象。处理过程:a、根据SQL的ID查找对应的MappedStatement对象;b、根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数;c、获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果;d、根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果;e、释放连接资源。
    4、返回处理结果将最终的处理结果返回。
 
    下面我们以一个实际的xml文件来熟悉一下实体结果和SQL之间的映射关系的实现。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-mybatis.org/DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 上面的两句描述是mybatits的SQL映射固定写法 -->

<!-- 下面的mapper根节点表示mybatits的SQL映射的内容,他们拥有一个namespace命名空间,它的值是一个接口的全路径,表示下面的内容与命名空间路径的接口存在映射关系 -->

<mapper namespace="com.lovo.mapper.UserMapper">
<!-- 我们要将从数据库中查到的结果转换为实体类可以通过两种方法实现。当查询结果集的列别名和实体类的属性字段名一致时,我们可以使用resultType直接进行转换。当不一致时,我们使用resultMap来指定他们之间的转化关系 -->
<resultMap type="UserBean" id="userMap">
<id property="id" column="id" javaType="java.lang.Long"/>
<result property="userName" column="user_name" javaType="java.lang.String"/>
</resultMap>

<!-- id="saveUserInfo" 代表着实现的是哪个接口方法,
parameterType="com.lovo.beans.UserBean" 代表着传入的参数,它的类型
useGeneratedKeys="true" 代表着获取数据库自增长的ID信息
keyProperty="u.id" 代表着将获取到的ID值赋值给哪个属性 -->
<insert id="saveUserInfo" parameterType="UserBean" useGeneratedKeys="true" keyProperty="u.id">
insert into t_user(id,user_name,sex) values (null,#{u.userName},#{u.sex})
</insert>

<!-- 动态SQL包括foreach,set--if,where--if,trim--if,include--sql,choose--when -->

 

<!-- 动态SQL之foreach的用法 -->
<insert id="batchSaveUser">
insert into t_user (user_name,sex) values
<!-- collection="users" 用于指定循环集合的名称,如果接口中并未指定参数别名,那么默认就是list
item="u" 用于指定每次循环后的对象的别名
separator="," 用于指定每次循环后之间的分割符-->
<foreach collection="users" item="u" separator=",">
(#{u.userName},#{u.sex})
</foreach>
</insert>


<!-- 动态SQL之set if的用法 -->
update t_user
<set>
<if test="u.userName != null">
user_name = #{u.userName},
</if>

<if test="u.sex != null">
sex = #{u.sex}
</if>

</set>

<where>
id = #{id}
</where>
</update>

 

<!--使用resultMap-->

<select id="queryUserInfoByName" resultMap="userMap">
<!-- CONCAT('%',#{name},'%')该数据库函数,主要用户拼接字符串 -->
select user_name,sex from t_user as u where u.user_name like CONCAT('%',#{name},'%')
</select>
<!--使用resultType-->
<select id="findUserInfoByDeptName" resultType="UserBean">
select u.user_name as userName,u.sex as sex from t_user as u left join t_dept as d on u.fk_dept_id = d.id where d.dept_name like CONCAT('%',#{name},'%')
</select>


<!--使用include--sql-->
<select id="queryUserInfoByParams" resultType="UserBean">
select u.id as id,u.user_name as userName,u.sex as sex from t_user as u left join t_dept as d on u.fk_dept_id = d.id
<where>
<include refid="commonSQL"></include>
limit ${page.index},${page.rows}
</where>
</select>
<!-- 公共的SQL语句可以提到一处,其他地方采用include获取 -->
<sql id="commonSQL">
<if test="userName != null &amp;&amp; userName != ''">
and u.user_name like CONCAT('%',#{userName},'%')
</if>
<if test="deptName != null &amp;&amp; deptName != ''">
and d.dept_name like CONCAT('%',#{deptName},'%')
</if>
</sql>


<!-- choose when 等同于java中的switch case的组合,
只匹配一项,如果都不匹配,就执行otherwise中的内容,等同于default-->
<choose>
<when test="name != null">
user_name like CONCAT('%',#{name},'%')
</when>
<when test="sex != null">
and sex like CONCAT('%',#{sex},'%')
</when>
<otherwise>1=1</otherwise>
</choose>
</where>
</select>

</mapper>

    

 

posted @ 2016-07-20 00:16  前进着  阅读(1250)  评论(0编辑  收藏  举报