基于 Mybatis 的 Dao 层开发
SqlSessionFactoryBuilder 用于创建 SqlSessionFacoty,SqlSessionFacoty 一旦创建完成就不需要 SqlSessionFactoryBuilder 了, 因为 SqlSession 是通过 SqlSessionFactory 生产, 所以可以将 SqlSessionFactoryBuilder 当成一个工具类使用, 最佳使用范围是方法范围即方法体内局部变量.
SqlSessionFactory 是一个接口, 接口中定义了 openSession 的不同重载方法, SqlSessionFactory 的最佳使用范围是整个应用运行期间, 一旦创建后可以重复使用, 通常以单例模式管理 SqlSessionFactory.
SqlSession 是一个面向用户的接口, sqlSession 中定义了数据库操作方法.
每个线程都应该有它自己的 SqlSession 实例. SqlSession 的实例不能共享使用, 它也是线程不安全的. 因此最佳的范围是请求或方法范围. 绝对不能将 SqlSession 实例的引用放在一个类的静态字段或实例字段中.
打开一个 SqlSession; 使用完毕就要关闭它. 通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭.
1 传统的 dao 层开发 (编写 dao 接口, 编写 dao 接口的实现类)
1 > 配置 mapper 映射文件
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 > 在 sqlMapConfig.xml 文件中配置 map 映射
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
3 > 创建 dao 层接口
package cn.rodge.dao;
import cn.rodge.entity.User;
public interface UserMapper {
public User findUserByIdDao (int id) throws Exception;
}
4 > 创建 dao 的实现类
package cn.rodge.dao.impl;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.rodge.dao.UserMapper;
import cn.rodge.entity.User;
public class UserMapperImpl implements UserMapper {
private SqlSessionFactory sqlSessionFactory;
// 有参数的都在方法
public UserMapperImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
// 无参数的构造方法
public UserMapperImpl() {
super();
}
@Override
public User findUserByIdDao(int id) throws Exception {
// 获取 sqlsession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用 sqlsession 中的查询单个结果的方法
User user = sqlSession.selectOne("findUserByIdDao", id);
// 释放资源
sqlSession.close();
return user;
}
}
5 > 创建测试类
package cn.rodge.dao.impl;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.rodge.entity.User;
public class UserMapperImplTest {
private UserMapperImpl userMapper;
@Before
public void init () throws Exception {
// 创建 sqlsessionfactorybuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 获取 mabatis 核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 加载配置文件, 并创建 sqlsessionfactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 创建 userMapper 实体类, 通过有参数的构造方法
userMapper = new UserMapperImpl(sqlSessionFactory);
}
@Test
public void testFindUserById() throws Exception {
User user = userMapper.findUserByIdDao(1);
System.out.println(user);
}
}
2 Mapper 动态代理的方法开发 dao 层
Mapper 接口开发需要遵循以下规范:
1. Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同.
2. Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
3. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
4. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
5. Mapper 接口和 Mapper 映射文件在同一目录下
1 > 配置 UserMapper.xml 映射文件
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2 > 创建 UserMapper.java 接口
package cn.rodge.dao;
import cn.rodge.entity.User;
public interface UserMapper {
public User findUserByIdDao (int id) throws Exception;
}
3 > 在 sqlMapConfig.xml 中加载映射文件
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
4 > 创建测试类
package cn.rodge.dao;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.rodge.entity.User;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init () throws Exception {
// 创建 sqlsessionfactorybuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 获取 mabatis 核心配置文件输入流
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 加载配置文件, 并创建 sqlsessionfactory
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 创建 userMapper 实体类, 通过有参数的构造方法
}
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserByIdDao(1);
System.out.println(user);
sqlSession.close();
}
}
UserMapper 接口中如何区分调用 selectOne 和 selectList 方法
动态代理对象调用 sqlSession.selectOne() 和 sqlSession.selectList() 是根据 mapper 接口方法的返回值决定, 如果返回 list 则调用 selectList 方法, 如果返回单个对象则调用 selectOne 方法.
来源: http://www.bubuko.com/infodetail-2484595.html