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层开发总结的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis——Dao层实现映射文件深入核心配置文件深入

2020.2.7学习进度总结

基于Mybatis的Dao层开发

02.MyBatis在DAO层开发使用的Mapper动态代理方式

spring boot+mybatis+mysql

MyBatis DAO层传递参数到mapping.xml