一 mybatis 开发 dao 的方法
1 SqlSessionFactoryBuilder:
通过 SqlSessionFactoryBuilder 创建会话工厂 SqlSessionFactory, 将 SqlSessionFactoryBuilder 当成一个工具类使用即可, 不需要使用单例管理 SqlSessionFactoryBuilder. 在需要创建 SqlSessionFactory 时候, 只需要 new 一次 SqlSessionFactoryBuilder 即可.
2 SqlSessionFactory
通过 SqlSessionFactory 创建 SqlSession, 使用单例模式管理 sqlSessionFactory(工厂一旦创建, 使用一个实例). 将来 mybatis 和 spring 整合后, 使用单例模式管理 sqlSessionFactory.
3 SqlSession
SqlSession 是一个面向用户 (程序员) 的接口. SqlSession 中提供了很多操作数据库的方法: 如: selectOne(返回单个对象),selectList(返回单个或多个对象).SqlSession 是线程不安全的, 在 SqlSesion 实现类中除了有接口中的方法 (操作数据库的方法) 还有数据域属性.
SqlSession 最佳应用场合在方法体内, 定义成局部变量使用.
二 原始 dao 开发方法(程序员需要些 dao 接口和 dao 实现类)
1 在 src 文件夹下新建 dao 包, 在包内新建接口 userDao
- package pers.czs.mybatis.dao;
- import pers.czs.mybatis.po.User;
- public interface userDao {
- // 根据 id 查询用户信息
- public User findUserById(int id) throws Exception;
- // 添加用户
- public void insertUser(User user) throws Exception;
- // 删除用户
- public void deleteUser(int id) throws Exception;
- }
2 在 dao 包内新建接口实现类 userDaoImpl
- package pers.czs.mybatis.dao;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import pers.czs.mybatis.po.User;
- 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",29);
- sqlSession.close();
- return user;
- }
- @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.insert("test.deleteUser", id);
- sqlSession.commit();
- sqlSession.close();
- }
- }
3 新建测试类 userDaoImplTest
- package pers.czs.mybatis.first;
- 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.Test;
- import pers.czs.mybatis.dao.userDao;
- import pers.czs.mybatis.dao.userDaoImpl;
- public class userDaoImplTest {
- @Test
- public void testFindUserByid() throws Exception {
- //Mybatis 配置文件
- String resource = "SqlMapConfig.xml";
- // 得到配置文件流
- InputStream inputStream = Resources.getResourceAsStream(resource);
- // 创建会话工厂, 传入配置文件信息
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- // 创建 userDao 对象
- userDao dao = new userDaoImpl(sqlSessionFactory);
- // 调用 userDao 的方法
- System.out.println(dao.findUserById(29));
- }
- }
4 执行结果
4 原始 dao 开发问题
dao 接口实现类方法中存在大量模板方法, 设想能否将这些代码提取出来, 大大减轻程序员的工作量.
调用 sqlsession 方法时将 statement 的 id 硬编码了
调用 sqlsession 方法时传入的变量, 由于 sqlsession 方法使用泛型, 即使变量类型传入错误, 在编译阶段也不报错, 不利于程序员开发.
来源: http://www.bubuko.com/infodetail-2947331.html