Skip to content

Commit 427ddfa

Browse files
committedDec 8, 2019
加入JDBC规范
接口代理和jdbc操作的连接小例子
1 parent 25296c3 commit 427ddfa

34 files changed

+377
-44
lines changed
 

‎.idea/workspace.xml

+46-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎README.md

+22-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
* [mybatis-test](#mybatis-test)
1717
* [导航目录](#导航目录)
1818
* [开个头](#开个头)
19+
* [基本结构:](#基本结构)
20+
* [几个问题:](#几个问题)
1921
* [XML基础知识(名称空间/文档验证/文档处理)](#xml基础知识名称空间文档验证文档处理)
2022
* [XML](#xml)
2123
* [XML名称空间](#xml名称空间)
@@ -39,7 +41,14 @@
3941
* [JDK动态代理](#jdk动态代理)
4042
* [从头开始](#从头开始)
4143
* [mybatis初始化流程](#mybatis初始化流程)
42-
* [SqlSession运行原理解析](#SqlSession运行原理解析)
44+
* [SqlSession运行原理解析](#sqlsession运行原理解析)
45+
* [Executor](#executor)
46+
* [BaseExecutor](#baseexecutor)
47+
* [一级缓存](#一级缓存)
48+
* [事务管理](#事务管理)
49+
* [sql操作具体实现](#sql操作具体实现)
50+
* [CachingExecutor 二级缓存](#cachingexecutor-二级缓存)
51+
* [JDBC](#jdbc)
4352
* [<em><strong>mybatis思维导图</strong></em>](#mybatis思维导图)
4453
* [<em><strong>主要参考资料:</strong></em>](#主要参考资料)
4554

@@ -60,7 +69,7 @@ mybatis整体架构分为三层,分别是基础支持层、核心处理层和
6069
结果集/实体 UserEntiry
6170

6271
## 几个问题:
63-
1. 读写配置文件,如何封装,提取配置的SQL语句 Configuration MapperProxy MappedStatement
72+
1. 读写配置文件,如何封装,提取配置的SQL语句并解析 Configuration MapperProxy MappedStatement
6473
2. 接口在哪里实现,怎么实现,SQL如何执行 SqlSession Executor TypeHandler
6574
3. 结果集映射返回期望的Java类型 ResultSetHandler
6675
4. 对扩展开放 plugins
@@ -401,6 +410,16 @@ Mybatis定义Transaction事务操作接口,它有两个实现JdbcTranscation
401410
二级缓存是事务级别缓存,是一个全局缓存,被所有SqlSession(ref -> sqlSession javadoc)共享。
402411
CachingExecutor通过装饰模式组合Executor添加新功能,提供二级缓存功能。当然Cache的线程安全由自身保证。
403412

413+
# JDBC
414+
415+
JDBC JSR221规范,当前4.3(oracle)草案,4.0(sun)为最终版。
416+
417+
[JCP](https://www.jcp.org/en/home/index "JCP")
418+
[JSR221](https://www.jcp.org/en/jsr/detail?id=221 "jdbc规范")
419+
[JDBC4.0](./jdbc4.0-fr-spec.pdf "4.0")
420+
[JDBC4.0规范中文](https://www.jianshu.com/nb/15028668 "JDBC4.0规范")
421+
422+
DataSource数据源实现 参考规范4.0 ch09---connections
404423

405424

406425
# ***mybatis思维导图***
@@ -426,5 +445,5 @@ CachingExecutor通过装饰模式组合Executor添加新功能,提供二级缓
426445
> - [x] [深入理解Java虚拟机 JVM高级特性与最佳实践 第2版](https://pan.baidu.com/s/17mGl_Xu-dgWITfoD8V90HA "3tv9")
427446
> - [x] [Java深度历险](https://pan.baidu.com/s/1FTxaBmZPaiHKA4MPEF9p5g "rx5d")
428447
> - [x] [Java语言规范 基于Java SE 8](https://pan.baidu.com/s/1OSxrl5dZOvEHddAG4exNEA "wl1r")
429-
> - [x] [Java虚拟机规范 Java SE 8版](https://pan.baidu.com/s/14PjId4EJOHhyPxqQITaUTA "fvgs")
448+
> - [x] [Java虚拟机规范 Java SE 8版](https://pan.baidu.com/s/14PjId4EJOHhyPxqQITaUTA "fvgs")
430449

‎jdbc4.0-fr-spec.pdf

1.59 MB
Binary file not shown.

‎jdbc4.3-fr-spec.pdf

982 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.pp.mybatis.foundationsupportlayer;
2+
3+
import org.pp.mybatis.foundationsupportlayer.reflector.proxy.jdk.*;
4+
5+
public class Client {
6+
public static void main(String[] args) {
7+
// jdk proxy
8+
// Subject subject = new JdkSubject();
9+
//
10+
// Subject proxy = (Subject) JdkProxy.getProxy(subject);
11+
// proxy.doSomething();
12+
// proxy.getStr();
13+
//
14+
// System.out.println("======================================================");
15+
16+
Subject proxy2 = JdkInterfaceProxy.newInstance(Subject.class);
17+
proxy2.doSomething();
18+
proxy2.getStr();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.pp.mybatis.foundationsupportlayer.jdbc;
2+
3+
import org.pp.mybatis.foundationsupportlayer.jdbc.cases.prepare.BaseExecutor;
4+
import org.pp.mybatis.foundationsupportlayer.jdbc.cases.prepare.ExecutorFactory;
5+
6+
import java.sql.Connection;
7+
import java.sql.DatabaseMetaData;
8+
import java.sql.SQLException;
9+
10+
public class Client {
11+
public static void main(String[] args) throws SQLException {
12+
BaseExecutor executor = ExecutorFactory.newExecutor();
13+
executor.doQuery("1");
14+
Connection connection = executor.getTransaction().getConnection();
15+
DatabaseMetaData metaData = connection.getMetaData();
16+
System.out.println("driverName: " + metaData.getDriverName());
17+
System.out.println("DriverVersion: " + metaData.getDriverVersion());
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.pp.mybatis.foundationsupportlayer.jdbc;
2+
3+
import java.util.ResourceBundle;
4+
5+
public final class ConfigUtil {
6+
private static final ResourceBundle config = ResourceBundle.getBundle("jdbc");
7+
8+
public static String getJdbcDriverClass() {
9+
return config.getString("jdbc.driverClass");
10+
}
11+
12+
public static String getJdbcUrl() {
13+
return config.getString("jdbc.url");
14+
}
15+
16+
public static String getJdbcUserName() {
17+
return config.getString("jdbc.username");
18+
}
19+
20+
public static String getJdbcPassWord() {
21+
return config.getString("jdbc.password");
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.pp.mybatis.foundationsupportlayer.jdbc.cases.prepare;
2+
3+
import java.sql.Connection;
4+
import java.sql.SQLException;
5+
import java.util.List;
6+
7+
/**
8+
* 提供事务管理机制和基本数据库操作
9+
*/
10+
public abstract class BaseExecutor {
11+
12+
protected JdbcTransaction transaction;
13+
14+
private Environment environment;
15+
16+
protected BaseExecutor(Environment environment) {
17+
this.environment = environment;
18+
if (this.transaction == null) {
19+
this.transaction = this.environment.getJdbcTransaction();
20+
}
21+
}
22+
23+
public abstract <E> List<E> doQuery(String parameter) throws SQLException;
24+
25+
public JdbcTransaction getTransaction() {
26+
return transaction;
27+
}
28+
29+
protected Connection getConnection() throws SQLException {
30+
return transaction.getConnection();
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.pp.mybatis.foundationsupportlayer.jdbc.cases.prepare;
2+
3+
import javax.sql.DataSource;
4+
5+
/**
6+
* 提供数据源和事务管理
7+
*/
8+
public final class Environment {
9+
private final String id;
10+
private final JdbcTransaction jdbcTransaction;
11+
private final DataSource dataSource;
12+
13+
public Environment(String id, DataSource dataSource) {
14+
this.id = id;
15+
this.dataSource = dataSource;
16+
this.jdbcTransaction = newTransaction(dataSource, null, false);
17+
}
18+
19+
public String getId() {
20+
return this.id;
21+
}
22+
23+
public JdbcTransaction getJdbcTransaction() {
24+
return jdbcTransaction;
25+
}
26+
27+
public DataSource getDataSource() {
28+
return this.dataSource;
29+
}
30+
31+
/**
32+
* 数据源创建JdbcTransaction实例
33+
* @param ds
34+
* @param level
35+
* @param autoCommit
36+
* @return
37+
*/
38+
public JdbcTransaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
39+
return new JdbcTransaction(ds, level, autoCommit);
40+
}
41+
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.pp.mybatis.foundationsupportlayer.jdbc.cases.prepare;
2+
3+
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
4+
import org.pp.mybatis.foundationsupportlayer.jdbc.ConfigUtil;
5+
6+
import javax.sql.DataSource;
7+
8+
public class ExecutorFactory {
9+
10+
private static Environment environment;
11+
12+
private ExecutorFactory() {
13+
}
14+
15+
public static BaseExecutor newExecutor() {
16+
if (environment == null) {
17+
// 读配置文件,获取数据源 这里直接用mybatis数据源测试
18+
// UnpooledDataSource使用DriverManager.getDrivers();获取classpath下已加载的driver
19+
// 如果pom中去掉唯一的mysql driver依赖 Client调用就会产生异常
20+
// DataSource实现 请参考jdbc规范
21+
DataSource dataSource = new UnpooledDataSource(ConfigUtil.getJdbcDriverClass(), ConfigUtil.getJdbcUrl(),
22+
ConfigUtil.getJdbcUserName(), ConfigUtil.getJdbcPassWord());
23+
environment = new Environment("", dataSource);
24+
}
25+
return new SimpleExecutor(environment);
26+
}
27+
28+
// private static final class Holder {
29+
// private static final ExecutorFactory EXECUTOR_FACTORY = new ExecutorFactory();
30+
// }
31+
//
32+
// public static final ExecutorFactory getInstance() {
33+
// return Holder.EXECUTOR_FACTORY;
34+
// }
35+
}

0 commit comments

Comments
 (0)
Failed to load comments.