使用Mybatis开发Dao,通常有两种方法:原始Dao开发方法和Mapper接口开发方法
SqlSession的使用范围
SqlSession中封装了对数据库的操作:查询、插入、更新、删除等
通过SQLSessionFactory创建SqlSession,而SqlSessionFactory是通过SQLSessionFactoryBuilder进行创建
- SqlSessionFactoryBuilder
SqlSessionFactoryBuilder用于创建SqlSessionFactory,SqlSessionFactory一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory产生,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量
- SqlSessionFactory
SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory.
- SqlSession
SqlSession是一个面向用户的接口,SqlSession中定义了数据库操作方法。
每个线程都应该有自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围,不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
打开一个SqlSession,使用完后要关闭它。通常把关闭操作放在finally块以确保每次都能执行关闭。
SqlSession session = SqlSessionFactory.openSesion();
try{
//do work
}finally{
session.close();
}
原生Dao实现(编写Dao接口和Dao实现类)
- 映射文件
<?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">
<!--namespace 命名空间,做SQL隔离-->
<!--用户的增删改查的SQL语句在代码中通过id进行调用,如果表单特别多,每张表单的SQL语句特别多,id可能重复-->
<!--namespace 相当于又加了一层,调用的时候通过namespace加上id进行调用,避免重名的可能-->
<!--namespace起名是有规范的-->
<mapper namespace="test">
<!--具有增删改查对应的子标签-->
<!--id : sql语句唯一标识-->
<!--parameterType:指定传入参数类型,是javaBean中对应属性的类型-->
<!--resultType : 返回结果集类型,如果返回结果为集合,可以调用selectList()方法,这个方法返回的结果就是一个集合,所以映射文件中应该配置成集合泛型的类型-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.zst.domain.User">
<!--#{}占位符,起到占用的作用,如果传入的是基本类型(String long double int Boolean float等)那么 # {}中的变量名称可以随意写-->
SELECT * from `user` WHERE id = #{id}
</select>
<select id ="findUserByName" parameterType="java.lang.String" resultType="cn.zst.domain.User">
<!-- SELECT