迷你版mybatis
时间:2019-11-27
本文章向大家介绍迷你版mybatis,主要包括迷你版mybatis使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class BootStrap { public static void start(){ MySqlSession sqlSession = new MySqlSession();//外层使用sqlSession,生成Mapper的代理, //TestMapper是一个接口,所以是一个动态代理, TestMapper testMapper = sqlSession.getMapper(TestMapper.class); //Mapper去查询语句,里面调用的是Mapper代理的invoke方法,invoke方法里面调用sqlSession的查询数据库方法, //sqlSession的查询数据库方法调用的是Executor的方法, Test test = testMapper.selectByPrimaryKey(1); System.out.println(test); } public static void main(String[] args){ start(); } }
public class MySqlSession { private Executor executor = new SimpleExecutor(); public <T> T selectOne(String statement, Object parameter) { return executor.query(statement,parameter); } public <T> T getMapper(Class<T> clazz) {//clazz是一个接口, return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, new MapperProxy(this, clazz)); //new MapperProxy里面传进去的是接口和SqlSession //jdk动态代理时候,new MapperProxy是代理(实现类的方法前后加内容), //new MapperProxy的形参是接口的实现类。 //mybatis没有传实现类进去,使用的是sqlSession来实现真正查询数据库操作。 //public class Advice implements InvocationHandler1 { //People people;//接口,传进来实例 //public Advice(People people) { // this.people = people; //} // public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // before();//前置增强 // Object value = method.invoke(people,args);//被代理方 /// after();//后置增强 // return value; // } //} //public class MyTest { // public static void main(String[] args) { // People proxyObject = (People) Proxy1.newProxyInstance(MyTest.class.getClassLoader(), // new Class<?>[] { People.class }, new Advice(new Jack())); } }
public class MapperProxy<T> implements InvocationHandler { private final MySqlSession sqlSession; private final Class<T> mapperInterface; public MapperProxy(MySqlSession sqlSession, Class<T> mapperInterface) { this.sqlSession = sqlSession;//接口和sqlSession, this.mapperInterface = mapperInterface; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass().getName().equals(TestMapperXml.nameSpace)) { String sql = TestMapperXml.methodSqlMapping.get(method.getName()); System.out.println(String.format("SQL [ %s ], parameter [%s] ", sql, args[0])); return sqlSession.selectOne(sql, String.valueOf(args[0])); } return null; } }
public interface Executor { <E> E query(String statement, Object parameter); }
public class SimpleExecutor implements Executor { public <E> E query(String sql, Object parameter) { try { Connection conn = getConnection(); PreparedStatement pstmt; pstmt = conn.prepareStatement(String.format(sql, Integer.parseInt(String.valueOf(parameter)))); ResultSet rs = pstmt.executeQuery(); Test test = new Test(); while (rs.next()) { test.setId(rs.getInt(1)); test.setName(rs.getString(2)); } return (E) test; } return null; } public Connection getConnection() throws SQLException { String driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/upgrade?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; String username = "root"; String password = "123456"; Connection conn = null; try { Class.forName(driver); //classLoader,加载对应驱动 conn = DriverManager.getConnection(url, username, password); } return conn; } }
public class CachingExecutor implements Executor { private GpConfiguration configuration; private SimpleExecutor delegate; private Map<String,Object> localCache = new HashMap(); public CachingExecutor(SimpleExecutor delegate) { this.delegate = delegate; } public CachingExecutor(GpConfiguration configuration) { this.configuration = configuration; } public <E> E query(MapperRegistory.MapperData mapperData, Object parameter) throws Exception { //初始化StatementHandler --> ParameterHandler --> ResultSetHandler StatementHandler handler = new StatementHandler(configuration); Object result = localCache.get(mapperData.getSql()); if( null != result){ System.out.println("缓存命中"); return (E)result; } result = (E) delegate.query(mapperData,parameter); localCache.put(mapperData.getSql(),result); return (E)result; } }
public interface TestMapper { Test selectByPrimaryKey(Integer userId); }
public class TestMapperXml { public static final String nameSpace = "com.gupaoedu.mybatis.my.TestMapper"; public static final Map<String, String> methodSqlMapping = new HashMap<String, String>(); static { methodSqlMapping.put("selectByPrimaryKey", "select * from test where id = %d"); } }
一级缓存是在update,delete时候会去更新缓存。
事务:都是用spring来管理事务的。 <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property value="jdbc:mysql://localhost:3306/upgrade?useSSL=false" name="url"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments>
原文地址:https://www.cnblogs.com/yaowen/p/11945150.html
- Android查缺补漏(View篇)--事件分发机制
- Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
- Android查缺补漏(View篇)--自定义 View 的基本流程
- CVPR2018: Unsupervised Cross-dataset Person Re-identification by Transfer Learning of Spatio-tempora
- 一个数据包消灭一台服务器的DNS漏洞
- java文件基本操作与实例
- 如何在Azkaban中安装HDFS插件以及与CDH集成
- CVE-2017-5123 漏洞利用全攻略
- sqlmap被ban了ip怎么办
- 毫秒级检测!你见过带GPU的树莓派吗?
- 达观数据对AngularJS技术的思考与实践
- hadoop配置文件
- 推荐一款src自动化扫描和收集的工具
- 蓝桥杯:兰顿蚂蚁
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist
- redis学习(十一)
- 互联网软件常见开发方法
- 利用Vue实现简易tab切换效果
- 第3天:最近笔试编程题汇总
- 设计模式学习(四)-UML中的类图及类图之间的关系
- 数据结构与算法(一)——学习工具的推荐
- sparc v8架构的异常处理
- 设计模式(五)-工厂方法模式
- html 的div或其他元素监听 resize事件不生效的解决办法
- 基于docker部署skywalking实现全链路监控
- 数据结构与算法(二)——十大排序算法
- VUE项目使用.env文件配置全局环境变量
- 设计模式学习(六)-抽象工厂模式
- 彻底完美解决安卓苹果手机点击输入框网页页面自动放大缩小