MyBatis——Dao层开发总结
Posted 任长江
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis——Dao层开发总结相关的知识,希望对你有一定的参考价值。
一、开发模式
1、原始DAO层开发
原始的开发模式为:定义一个DAO接口和一个DAO实现类,向DAO实现类中注入SqlSessionFactory,在方法内部通过SqlSessionFactory创建SqlSession,范例如下:
dao接口
public interface UserDao
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//根据用户名列查询用户列表
public List<User> findUserByName(String name) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUser(int id) throws Exception;
dao实现类
public class UserDaoImpl implements UserDao
// 需要向dao实现类中注入SqlSessionFactory
// 这里通过构造方法注入
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory)
this.sqlSessionFactory = sqlSessionFactory;
@Override
public User findUserById(int id) throws Exception
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
// 释放资源
sqlSession.close();
return user;
@Override
public List<User> findUserByName(String name) throws Exception
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> list = sqlSession.selectList("test.findUserByName", name);
// 释放资源
sqlSession.close();
return list;
@Override
public void insertUser(User user) throws Exception
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.insert("test.insertUser", user);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
@Override
public void deleteUser(int id) throws Exception
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.delete("test.deleteUser", id);
// 提交事务
sqlSession.commit();
// 释放资源
sqlSession.close();
原始方法问题:
1、Dao接口实现类中存在大量重复的代码,从获取SqlSession,到提交事务和释放资源都是相同的。
2、SqlSession的方法的入参利用了泛型,这样对传入的变量类型就不能在编译期发现问题,加大了出错的可能性。
2、Mapper代理方法
利用Mapper代理方法需要编写一个mapper.xml文件,MyBatis可以通过代理方法通过mapper接口自动生成一个实现类的代理对象,但是需要遵守一定的规范:
1、在mapper.xml中定义的namespace等于mapper接口的地址
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法入参类型和mapper.xml中对应的statement的parameterType类型一致
4、mapper.java接口中的方法返回值类型和mapper.xml中对应的statement的resultType类型一致。
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#value
</select>
二、SqlMapConfig.xml
1、properties属性
用来加载其他配置文件,这样可以将数据库的配置单独抽取出来,方便数据库参数的单独管理,从而不用再在SqlMapConfig.xml进行硬编码,虽然说到底数据库信息在db.properties中还是已硬编码的方式存在,但是这样也方便了配置文件的加载和修改及其其他配置文件的引用。
<properties resource="db.properties"/>
2、settings参数
用来配置MyBatis的运行全局参数,例如开启二级缓存和延迟加载等功能
3、typeAliases
用来为参数指定别名,这样在mapper.xml中就可以用相应的别名方便开发了,不过MyBatis已经为我们提供了一系列基本数据类型的默认支持的别名,但是在需要的时候我们可以通过该属性配置自己需要的别名,例如:
单个别名定义:
<typeAlias type="cn.itcast.mybatis.po.User" alias="user"/>
批量定义
<package name="cn.itcast.mybatis.po"/>
4、typeHandlers类型处理器
用来完成JDBC类型到JAVA类型的转换,同样的MyBatis也为我们提供了一系列对基本数据类型转换的处理器
5、mapper映射配置
用来指定和加载配置文件
单个加载
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
批量加载
<mappers>
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
三、动态SQL
MyBatis为了实现对SQL语句的灵活操作,提供了对SQL语句的一种动态性操作方式,通过在SQL语句中嵌入表达式,实现对SQL语句的灵活组装和拼接操作。
例如:
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex = #userCustom.sex
</if>
<if test="userCustom.username!=null and userCustom.username!=''">
and user.username LIKE '%$userCustom.username%'
</if>
</if>
</where>
其中#userCustom.sex和$userCustom.username分别用来取出POJO中的性别和用户名的值,在这里通过这样的条件判断,实现了SQL语句根据入参的不同拼接出不同的SQL语句。
SQL片段:
如果我们的功能中有一段非常常用的SQL,就可以将其抽取出来,给它定义一个id,在需要的时候直接引用即可。
<!-- 定义sql片段-->
<sql id="query_user_where">
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex = #userCustom.sex
</if>
<if test="userCustom.username!=null and userCustom.username!=''">
and user.username LIKE '%$userCustom.username%'
</if>
</if>
</sql>
<where>
<include refid="query_user_where"></include>
<!-- 在这里还要引用其它的sql片段 -->
</where>
总结:
总的来说,在这里介绍了三点,Dao层开发的两种模式(原始模式和Mappper代理模式),SqlMapConfig.xml配置文件的配置信息及其相关作用和用法,还有就是动态SQL。其实都是一些最基本的知识,时不时对之前的知识总结一下,感觉可以收获更多,一回生两回熟。
以上是关于MyBatis——Dao层开发总结的主要内容,如果未能解决你的问题,请参考以下文章