第二阶段mybatis框架熟悉

来源:互联网 发布:java map实现内存缓存 编辑:程序博客网 时间:2024/05/26 12:06
mybatis框架熟悉:
    什么是Mybatis
        MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,
        是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
    mybatis基础知识:
        1:Mybatis实现了接口绑定,使用更加方便。
        2:在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。
        3:对象关系映射的改进,效率更高
        4:MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。
        5:实现原理:MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。
          SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
    优缺点:
        MyBatis的优点
            1、简单易学mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
            2、灵活mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
            3、解除sql与程序代码的耦合通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
            4、提供映射标签,支持对象与数据库的orm字段关系映射
            5、提供对象关系映射标签,支持对象关系组建维护
            6、提供xml标签,支持编写动态sql。
        缺点
            1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
            2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
            3、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
            4、二级缓存机制不佳
    接下来我从项目的一个具体实现来分析mybatis的使用规则:
    1:<!-- 下面的两句描述是mybatits的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">
    
    2:<!-- 下面的mapper根节点表示mybatits的SQL映射的内容,他们拥有一个namespace命名空间,它的值是一个接口的全路径,表示下面的内容与命名空间路径的接口存在映射关系 -->
    <mapper namespace="com.lovo.mapper.UserMapper">


    3:<!-- 我们要将从数据库中查到的结果转换为实体类可以通过两种方法实现。当查询结果集的列别名和实体类的属性字段名一致时,我们可以使用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>
    
    4:<!-- 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>
    
    5:<!-- 动态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>
    
    6:<!-- 动态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>
    
    7:<!--使用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>


    8:<!--使用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>


    9:<!--使用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>


    10:<!-- 公共的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>


    11:<!-- 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>
原创粉丝点击