在之前写的代码中,每使用一种操作有很多重复的代码,于是试着Dao封装
前提
在进行封装之前,首先思考如何封装,先把封装前的代码贴出来,以增添操作为例
// mybatis 配置文件
String resource = "Configuration.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis配置
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 资源处理
User user = new User();
user.setUserName("小亮");
user.setUserAge(18);
user.setUserAdress("武汉");
// 通过SqlSession操作数据库
sqlSession.insert("test.insertUser", user);
// 提交
sqlSession.commit();
// 释放资源
sqlSession.close();
分析
- 对于
SqlSessionFactory
可以进行单例模式进行封装 SqlSession
是非线程安全的,所以需要把它写到方法体中
实际操作
-
创建Dao接口,新建
UserDao.java
,编写相关代码package com.dao; import java.util.List; import com.model.User; public interface UserDao { public User selectUserByID(int id) throws Exception; public void deleteUser(int id) throws Exception; public void insertUser(User user) throws Exception; public void updateUser(User user) throws Exception; public List<User> selectUserByName(String name) throws Exception; }
-
新建
UserDaoImpl.java
以此作为UserDao的实现类,编写相关代码package com.dao; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import com.model.User; public class UserDaoImpl implements UserDao { // 向实现类中注入SqlSessionFactary private SqlSessionFactory sqlSessionFactory; // 通过构造方法注入 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User selectUserByID(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.selectUserByID", id); sqlSession.close(); return user; } @Override public void deleteUser(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.delete("test.deleteUser", id); sqlSession.close(); } @Override public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.insert("test.insertUser", user); sqlSession.close(); } @Override public void updateUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); sqlSession.update("test.updateUser", user); sqlSession.close(); } @Override public List<User> selectUserByName(String name) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.selectUserByName", name); sqlSession.close(); return list; } }
-
编写测试类,代码如下
package com.test; 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 com.dao.UserDao; import com.dao.UserDaoImpl; import com.model.User; public class UserDaoImplTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception { // mybatis 配置文件 String resource = "Configuration.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis配置 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testSelectUserByID() throws Exception { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.selectUserByID(5); System.out.println(user); } }
-
文件层次
-
测试结果
总结
虽然Dao封装解决了一部分重复代码的使用,但是依然有部分重复代码,代码依然繁琐,所以如果要求代码精致,则可能需要另想办法