mybatis学习总结

来源:互联网 发布:win10网络连接红叉 编辑:程序博客网 时间:2024/06/15 15:55

mybatis是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架

为什么要使用mybatis框架?

直接以JDBC编程,将sql语句硬编码到了java代码中,如果sql语句修改,需要重新编译java代码,不利于系统的维护,mybatis将sql语句配置在xml文件中,更易于修改。这边顺便提下mybatis与hibernate的区别,hibernate是一个标准的ORM框架,sql语句自动生成,对sql语句优化、修改比较困难,适用于需求变化不多的中小型项目。mybatis专注于sql语句,对sql语句的优化、修改比较方便,是个不完全的ORM框架,适用于需求变化较多的项目。

mybatis-config.xml配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <environments default="">        <environment id="">            <transactionManager type=""></transactionManager>            <dataSource type=""></dataSource>        </environment>    </environments>        <!--配置全局属性-->    <settings></settings>        <!-- 配置别名 -->    <typeAliases>        <!-- 批量配置别名 -->            <package name=""/>    </typeAliases></configuration>

在mybatis与spring整合之后,与数据库的连接,事务管理等功能都交给了spring来管理,因此再上面就不再写具体的代码,全局属性的配置根据自己的需要来进行,ssm的整合写在另一篇文章 spring mvc学习的一点总结中,这边就不再赘述。

映射文件*.xml配置

<?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"><mapper namespace="com.sqy.ssm.dao.UserDao">    <select id="" parameterType="" resultType="" >        SELECT * FROM USER WHERE id=#{id}    </select>    <insert id="" parameterType=""></insert>    <delete id="" parameterType=""></delete>    <update id="" parameterType=""></update></mapper>

namespace是命名空间,作用是对sql进行分类化管理。
-#{id}:id表示输入的参数,参数名称为id
parameterType:指定输入参数的类型
resultType:输出结果所映射的java对象类型。使用resultType进行输出映射,只有查询出来的列名与pojo中的属性名一致,该列才可以映射成功。
resultMap:如果查询出来的列名与pojo中的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系
1.定义resultMap

<!--type表示resultMap最终映射的java对象类型,可使用别名,id表示resultMap的唯一标识  --><resultMap type="" id="">    <!-- id表示查询结果集的唯一标识,column标识列名,type指定的pojo中的属性名-->    <id column="" property=""/>    <!-- result表示普通列的标识 -->    <result column="" property=""/></resultMap>

2.使用resultMap作为输出映射类型

mybatis开发dao方法

原始dao开发:自写dao接口和dao实现类
mapper代理方法:只需要写mapper接口,mybatis可以自动生成mapper接口实现类代理对象

动态sql

动态sql是mybatis的核心,可以对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接和组装。

    <!-- 定义sql片段,其他statement中可以引用sql片段         id:sql片段的唯一标识    -->    <sql id="...">balabala代码</sql>    <select id="findUserList" parameterType="com.sqy.po.UserQueryVo" resultType="com.sqy.po.UserCustom">        select * from user         <!-- where可以自动去掉第一个and -->        <where>            <!-- 引用sql片段的id,如果refid指定的id不在本xml文件中,需加上namespace -->            <include refid="..."></include>            <if test="userCustom!=null">                <if test="userCustom.id!=null and userCustom.id!=''">                    and user.id=#{userCustom.id}                 </if>                <if test="userCustom.username!=null and userCustom.username!=''">                    and user.username like '%${userCustom.username}%'                </if>            </if>            <if test="ids!=null ">                <!--使用foreach遍历传入ids                    collection指定输入对象中的集合属性                      item_id指定每次遍历生成的对象名                    open:开始遍历时拼接的串                    close:结束遍历时拼接的串                    separator遍历的两个对象中间拼接的串                -->                <foreach collection="ids" item="item_id" open="and (" close=")" separator="or">                    <!-- 每次遍历需要拼接的串 -->                    id=#{item_id}                </foreach>            </if>        </where>    </select>

延迟加载:先从单表查询,需要时再从关联表进行关联查询,大大提高数据库性能。association、collection具备延迟加载功能。在mybatis-config.xml中的全局配置参数中配置。

查询缓存:分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,在SqlSession对象中有一个HashMap的数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域(HashMap)互不影响。二级缓存是mapper级别的缓存,多个SqlSession去操作同一个mapper的sql语句,多个SqlSession可以共用二级缓存 ,二级缓存是跨SqlSession的。