Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化
前言
接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了。
前面自定义的持久层框架存在的问题
解决思路
代码实现
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<User> 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 <E> List<E> selectList(String statementId, Object... Parameter) throws Exception;
12
13 // 根据条件查询单个
14 public <T> T selectOne(String statementId, Object... Parameter) throws Exception;
15
16 //为Dao接口生成代理实现类
17 public <T> 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 <E> List<E> 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<Object> list = simpleExecutor.query(configuration, mappedStatement, params);
28
29 return (List<E>) list;
30 }
31
32 @Override
33 public <T> T selectOne(String statementId, Object... params) throws Exception {
34 List<Object> objects = selectList(statementId, params);
35 if (objects.size() == 1) {
36 return (T) objects.get(0);
37 } else {
38 throw new RuntimeException("查无此数据或查询结果过多");
39 }
40
41 }
42
43 @Override
44 public <T> T getMapper(Class<?> mapperClass) {
45 // 使用JDK动态代理来为Dao接口生成代理对象,并返回
46 Object proxyInstance = Proxy.newProxyInstance(DefaultSqlSession.class.getClassLoader(), new Class[]{mapperClass}, new InvocationHandler() {
47 @Override
48 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
49 // 底层都还是去执行JDBC代码
50 // 根据不同情况,来调用selctList或者selectOne
51 // 准备参数 1:statmentid :sql语句的唯一标识:namespace.id = 接口全限定名.方法名
52 String methodName = method.getName();
53 String className = method.getDeclaringClass().getName();
54
55 String statementId = className + "." + methodName;
56
57 // 准备参数2:params:args
58 // 获取被调用方法的返回值类型
59 Type genericReturnType = method.getGenericReturnType();
60 // 判断是否进行了 泛型类型参数化
61 if (genericReturnType instanceof ParameterizedType) {
62 List<Object> objects = selectList(statementId, args);
63 return objects;
64 }
65
66 return selectOne(statementId, args);
67 }
68 });
69
70 return (T) proxyInstance;
71 }
72
73 public void close() throws SQLException {
74 simpleExecutor.close();
75 }
76
77 }
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<User> 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 List<User> allUsers = userDao.findAll();
41 for (User user1 : allUsers) {
42 System.out.println(user1);
43 }
44
45 }
46 }
总结
这半年多来,经过工作中的磨练及空闲时间的自学,虽然我依旧是个菜鸟,但是开发能力还是比之前强了不少,回想半年多以前自己写这个系列文章的时候,对当中很多概念都不太清楚,现在倒是觉得很简单了。
之前是挺想一直坚持写下去的,不过由于那段时间项目太赶,工作强度比较大,导致学习积极性下降了很多。另一方面,也是因为自己的心态没有调整好,对于未来没有明确的目标。
我还算比较幸运,后面有机会换了一份比较好的工作,工作强度不那么大,这几个月自学的时间相当多,技术方面进步了不少。
可惜一直没有下定决心来好好写技术博客,新年新气象,正好最近自学也快告一段落了,是时候通过输出倒逼输入了,今年的目标之一就是坚持每周写一点博客,每月发布几篇。
也许我在很长的一段时间内都写不出什么好文章,但是 管它呢,自己喜欢就好,有个平台可以免费写点东西,顺便还能复习下自己学到的知识,这本身就是一种回报。
话虽如此,还是要精益求精,尽可能写多点有技术含量的东西,所以,要好好学习咯。
Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化的更多相关文章
- 七、持久层框架(MyBatis)
一.MyBatis学习 平时我们都用JDBC访问数据库,除了自己需要写SQL,还要操作Connection,Statement,ResultSet这些. 使用MyBatis,只需要自己提供SQL语句, ...
- Mybatis(一):手写一套持久层框架
作者 : 潘潘 未来半年,有幸与导师们一起学习交流,趁这个机会,把所学所感记录下来. 「封面图」 自毕业以后,自己先创业后上班,浮沉了近8年,内心着实焦躁,虽一直是走科班路线,但在技术道路上却始终没静 ...
- Django框架(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器
目录 模板层:变量.过滤器.标签.自定义标签和过滤器 一.模板层变量 1.语法 2.使用 二.模板层之过滤器 1.语法 2.常用过滤器 3.其他过滤器 三.模板值标签 1.for标签 2.if标签 3 ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- mybatis学习笔记之基础框架(2)
mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...
- MyBatis学习七:spring和MyBatis整合
<\mybatis\day02\16mybatis和spring整合-sqlSessionFactory配置.avi;> MyBatis学习七:spring和MyBatis整合.逆向工程 ...
- 【MyBatis学习01】宏观上把握MyBatis框架
今天开始学习mybatis框架,博客主要记录学习过程中的一些总结,如有错误之处,欢迎留言指正~先用mybatis的鸟鸟来镇个楼,咳咳~~ mybatis框架是一个持久层框架,是Apache下的顶级项目 ...
- Mybatis学习记录(七)----Mybatis查询缓存
1. 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sql ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
随机推荐
- 安全计算环境之剩余信息保护-windows
参考https://blog.csdn.net/ubjewen/article/details/107587951 应保证鉴别信息所在的存储空间被释放或重新分配前得到完全清除 交互式登录: 之前登录到 ...
- 1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java.library.path org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path
github上一个java项目,在myeclipse中运行正常,生成jar后,运行报错: 1 [main] DEBUG Sigar - no sigar-amd64-winnt.dll in java ...
- sqli-labs系列——第二关
less2 and 1=1有回显,and 1=2无回显,为数值型注入 order by 4–+报错,有3行 查询数据库名 ?id=0' union select 1,(select group_con ...
- [系统重装日志2]win10系统安装pytorch0.4.1(gpu版本)
目录 0,资源整理 1,安装最新版的显卡驱动 2,安装visual studio 3,安装cuda 4,安装cudnn,配置环境变量 5,安装pytorch 6,安装torchvision 7,验证 ...
- java例题_46 两个字符串拼接问题!
1 /*46 [程序 46 字符串连接] 2 题目:两个字符串连接程序,将两个字符串拼接在一起 3 */ 4 5 /*分析 6 * 两个字符串的拼接方法 7 * concat方式 8 * 当两个量都为 ...
- WebGPU[1] 三角形
代码见: https://github.com/onsummer/my-dev-notes/tree/master/webgpu-Notes/01-triangle 如果本篇的代码不能跑了,请联系我或 ...
- Linux 软链接link/ln -s
在Linux中,链接分为软的和硬的,至于两者之间有什么差别,大家可以参考下https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-li ...
- [矩阵乘法]裴波拉契数列III
[ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I I [矩阵乘法]裴波拉契数列III [矩阵乘法]裴波拉契数列III Description 求数列f[n]=f[n-1]+f[n-2]+1的第N ...
- 【图像处理】OpenCV+Python图像处理入门教程(六)图像平滑处理
相信很多小伙伴都听过"滤波器"这个词,在通信领域,滤波器能够去除噪声信号等频率成分,然而在我们OpenCV中,"滤波"并不是对频率进行筛选去除,而是实现了图像的 ...
- OO第三单元小结
目录 JML理论基础 JML工具链 openjml使用 openjml总结 jmlunitng使用 代码分析 第一次作业 第二次作业 第三次作业 测试&bug分析 黑盒测试 白盒测试(Juni ...