一 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方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。