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 configuration
PUBLIC "-//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的。