Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化
前言
接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了。
前面自定义的持久层框架存在的问题
Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配置文件、创建sqlSessionFactory、生产sqlSession)解决思路
使用代理模式生成Dao层接口的代理实现类(去掉原Dao层的代理实现类)代码实现
在IPersistence_test项目中添加Dao层及接口类:1 package com.hardy.dao; 2 3 import com.hardy.pojo.User; 4 5 import java.util.List; 6 7 public interface IUserDao { 8 9 // 查询所有用户 10 public List在SqlSession接口类中添加getMapper接口:findAll() throws Exception; 11 12 // 根据条件进行用户查询 13 public User findByCondition(User user) throws Exception; 14 15 }
1 package com.hardy.sqlSession; 2 3 import java.util.List; 4 5 public interface SqlSession { 6 7 /* 查询所有: 8 根据statementId,找到Mapper.xml文件中对应的sql语句 9 Object...Parameter 表示支持传递多个参数值进行查询 10 */ 11 public在SqlSession的实现类中重写getMapper接口:List selectList(String statementId, Object... Parameter) throws Exception; 12 13 // 根据条件查询单个 14 public T selectOne(String statementId, Object... Parameter) throws Exception; 15 16 //为Dao接口生成代理实现类 17 public T getMapper(Class<?> mapperClass); 18 19 }
1 package com.hardy.sqlSession; 2 3 import com.hardy.pojo.Configuration; 4 import com.hardy.pojo.MappedStatement; 5 6 import java.lang.reflect.*; 7 import java.lang.reflect.Proxy; 8 import java.sql.SQLException; 9 import java.util.List; 10 11 public class DefaultSqlSession implements SqlSession { 12 13 private Configuration configuration; 14 15 public DefaultSqlSession(Configuration configuration) { 16 this.configuration = configuration; 17 } 18 19 // 处理器对象 20 private Executor simpleExecutor = new SimpleExecutor(); 21 22 @Override 23 public修改测试类:List selectList(String statementId, Object... params) throws Exception { 24 // 对SimpleExecutor里的query方法的调用 7 25 SimpleExecutor simpleExecutor = new SimpleExecutor(); 26 MappedStatement mappedStatement = configuration.getMappedStatementMap().get(statementId); 27 List
1 package com.hardy.test; 2 3 import com.hardy.dao.IUserDao; 4 import com.hardy.io.Resources; 5 import com.hardy.pojo.User; 6 import com.hardy.sqlSession.SqlSession; 7 import com.hardy.sqlSession.SqlSessionFactory; 8 import com.hardy.sqlSession.SqlSessionFactoryBuilder; 9 import org.junit.Test; 10 11 import java.io.InputStream; 12 import java.util.List; 13 14 public class IPersistenceTest { 15 16 @Test 17 public void test() throws Exception { 18 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); 19 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().builder(resourceAsStream); 20 SqlSession sqlSession = sqlSessionFactory.openSession(); 21 22 System.out.println("自定义持久层框架,GO!"); 23 // 调用 24 // User user = new User(); 25 // user.setId(1); 26 // user.setUsername("hardy"); 27 // User user2 = sqlSession.selectOne("User.selectOne", user); 28 // System.out.println("查询单条记录:"+ user2); 29 // 30 // System.out.println("-----------------------------------------"); 31 // 32 // List运行结果如下所示:users = sqlSession.selectList("User.selectList"); 33 // System.out.println("查询多条记录:"); 34 // for (User user1 : users) { 35 // System.out.println(user1); 36 // } 37 38 IUserDao userDao = sqlSession.getMapper(IUserDao.class); 39 40 ListallUsers = userDao.findAll(); 41 for (User user1 : allUsers) { 42 System.out.println(user1); 43 } 44 45 } 46 }
总结
这半年多来,经过工作中的磨练及空闲时间的自学,虽然我依旧是个菜鸟,但是开发能力还是比之前强了不少,回想半年多以前自己写这个系列文章的时候,对当中很多概念都不太清楚,现在倒是觉得很简单了。
之前是挺想一直坚持写下去的,不过由于那段时间项目太赶,工作强度比较大,导致学习积极性下降了很多。另一方面,也是因为自己的心态没有调整好,对于未来没有明确的目标。
我还算比较幸运,后面有机会换了一份比较好的工作,工作强度不那么大,这几个月自学的时间相当多,技术方面进步了不少。
可惜一直没有下定决心来好好写技术博客,新年新气象,正好最近自学也快告一段落了,是时候通过输出倒逼输入了,今年的目标之一就是坚持每周写一点博客,每月发布几篇。
也许我在很长的一段时间内都写不出什么好文章,但是 管它呢,自己喜欢就好,有个平台可以免费写点东西,顺便还能复习下自己学到的知识,这本身就是一种回报。
话虽如此,还是要精益求精,尽可能写多点有技术含量的东西,所以,要好好学习咯。