forked from fuzhengwei/itstack-demo-design
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
小傅哥 | 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
- Loading branch information
1 parent
f3af331
commit 247cfa7
Showing
27 changed files
with
850 additions
and
795 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<parent> | ||
<artifactId>itstack-demo-design</artifactId> | ||
<groupId>org.itstack</groupId> | ||
<version>1.0-SNAPSHOT</version> | ||
</parent> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<artifactId>itstack-demo-design-16-01</artifactId> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>mysql</groupId> | ||
<artifactId>mysql-connector-java</artifactId> | ||
<version>5.1.20</version> | ||
</dependency> | ||
</dependencies> | ||
</project> |
34 changes: 34 additions & 0 deletions
34
itstack-demo-design-16-01/src/main/java/org/itstack/demo/design/JDBCUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package org.itstack.demo.design; | ||
|
||
import com.alibaba.fastjson.JSON; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import java.sql.Connection; | ||
import java.sql.DriverManager; | ||
import java.sql.ResultSet; | ||
import java.sql.Statement; | ||
|
||
public class JDBCUtil { | ||
|
||
private static Logger logger = LoggerFactory.getLogger(JDBCUtil.class); | ||
|
||
public static final String URL = "jdbc:mysql://172.25.64.119:3306/itstack_demo_ddd"; | ||
public static final String USER = "root"; | ||
public static final String PASSWORD = "JRTEST"; | ||
|
||
public static void main(String[] args) throws Exception { | ||
//1.加载驱动程序 | ||
Class.forName("com.mysql.jdbc.Driver"); | ||
//2. 获得数据库连接 | ||
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); | ||
//3.操作数据库,实现增删改查 | ||
Statement stmt = conn.createStatement(); | ||
ResultSet resultSet = stmt.executeQuery("SELECT id, name, age, createTime, updateTime FROM user"); | ||
//如果有数据,rs.next()返回true | ||
while (resultSet.next()) { | ||
logger.info("测试结果 姓名:{} 年龄:{}", resultSet.getString("name"),resultSet.getInt("age")); | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
DROP TABLE school; | ||
CREATE TABLE school ( id bigint NOT NULL AUTO_INCREMENT, name varchar(64), address varchar(256), createTime datetime, updateTime datetime, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
insert into school (id, name, address, createTime, updateTime) values (1, '北京大学', '北京市海淀区颐和园路5号', '2019-10-18 13:35:57', '2019-10-18 13:35:57'); | ||
insert into school (id, name, address, createTime, updateTime) values (2, '南开大学', '中国天津市南开区卫津路94号', '2019-10-18 13:35:57', '2019-10-18 13:35:57'); | ||
insert into school (id, name, address, createTime, updateTime) values (3, '同济大学', '上海市彰武路1号同济大厦A楼7楼7区', '2019-10-18 13:35:57', '2019-10-18 13:35:57'); | ||
DROP TABLE user; | ||
CREATE TABLE user ( id bigint(11) NOT NULL AUTO_INCREMENT, name varchar(32), age int(4), address varchar(128), entryTime datetime, remark varchar(64), createTime datetime, updateTime datetime, status int(4) DEFAULT '0', dateTime varchar(64), PRIMARY KEY (id), INDEX idx_name (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; | ||
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status, dateTime) values (1, '水水', 18, '吉林省榆树市黑林镇尹家村5组', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 0, '20200309'); | ||
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status, dateTime) values (2, '豆豆', 18, '辽宁省大连市清河湾司马道407路', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 1, null); | ||
insert into user (id, name, age, address, entryTime, remark, createTime, updateTime, status, dateTime) values (3, '花花', 19, '辽宁省大连市清河湾司马道407路', '2019-12-22 00:00:00', '无', '2019-12-22 00:00:00', '2019-12-22 00:00:00', 0, '20200310'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<parent> | ||
<artifactId>itstack-demo-design</artifactId> | ||
<groupId>org.itstack</groupId> | ||
<version>1.0-SNAPSHOT</version> | ||
</parent> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<artifactId>itstack-demo-design-16-02</artifactId> | ||
|
||
<dependencies> | ||
<!-- https://mvnrepository.com/artifact/dom4j/dom4j --> | ||
<dependency> | ||
<groupId>dom4j</groupId> | ||
<artifactId>dom4j</artifactId> | ||
<version>1.6.1</version> | ||
</dependency> | ||
<!-- https://mvnrepository.com/artifact/jaxen/jaxen --> | ||
<dependency> | ||
<groupId>jaxen</groupId> | ||
<artifactId>jaxen</artifactId> | ||
<version>1.1.6</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>mysql</groupId> | ||
<artifactId>mysql-connector-java</artifactId> | ||
<version>5.1.20</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.mybatis</groupId> | ||
<artifactId>mybatis</artifactId> | ||
<version>3.4.6</version> | ||
</dependency> | ||
</dependencies> | ||
|
||
</project> |
9 changes: 9 additions & 0 deletions
9
itstack-demo-design-16-02/src/main/java/org/itstack/demo/design/dao/ISchoolDao.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.itstack.demo.design.dao; | ||
|
||
import org.itstack.demo.design.po.School; | ||
|
||
public interface ISchoolDao { | ||
|
||
School querySchoolInfoById(Long treeId); | ||
|
||
} |
9 changes: 9 additions & 0 deletions
9
itstack-demo-design-16-02/src/main/java/org/itstack/demo/design/dao/IUserDao.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.itstack.demo.design.dao; | ||
|
||
import org.itstack.demo.design.po.User; | ||
|
||
public interface IUserDao { | ||
|
||
User queryUserInfoById(Long id); | ||
|
||
} |
30 changes: 30 additions & 0 deletions
30
itstack-demo-design-16-02/src/main/java/org/itstack/demo/design/mediator/Configuration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package org.itstack.demo.design.mediator; | ||
|
||
import java.sql.Connection; | ||
import java.util.Map; | ||
|
||
|
||
/** | ||
* 公众号 | bugstack虫洞栈 | ||
* 博 客 | https://bugstack.cn | ||
* Create by 小傅哥 @2020 | ||
*/ | ||
public class Configuration { | ||
|
||
protected Connection connection; | ||
protected Map<String, String> dataSource; | ||
protected Map<String, XNode> mapperElement; | ||
|
||
public void setConnection(Connection connection) { | ||
this.connection = connection; | ||
} | ||
|
||
public void setDataSource(Map<String, String> dataSource) { | ||
this.dataSource = dataSource; | ||
} | ||
|
||
public void setMapperElement(Map<String, XNode> mapperElement) { | ||
this.mapperElement = mapperElement; | ||
} | ||
|
||
} |
188 changes: 188 additions & 0 deletions
188
...k-demo-design-16-02/src/main/java/org/itstack/demo/design/mediator/DefaultSqlSession.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
package org.itstack.demo.design.mediator; | ||
|
||
import java.lang.reflect.Field; | ||
import java.lang.reflect.Method; | ||
import java.sql.*; | ||
import java.util.Date; | ||
import java.util.*; | ||
|
||
|
||
/** | ||
* 公众号 | bugstack虫洞栈 | ||
* 博 客 | https://bugstack.cn | ||
* Create by 小傅哥 @2020 | ||
*/ | ||
public class DefaultSqlSession implements SqlSession { | ||
|
||
private Connection connection; | ||
private Map<String, XNode> mapperElement; | ||
|
||
public DefaultSqlSession(Connection connection, Map<String, XNode> mapperElement) { | ||
this.connection = connection; | ||
this.mapperElement = mapperElement; | ||
} | ||
|
||
@Override | ||
public <T> T selectOne(String statement) { | ||
try { | ||
XNode xNode = mapperElement.get(statement); | ||
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); | ||
ResultSet resultSet = preparedStatement.executeQuery(); | ||
List<T> objects = resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); | ||
return objects.get(0); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
public <T> T selectOne(String statement, Object parameter) { | ||
XNode xNode = mapperElement.get(statement); | ||
Map<Integer, String> parameterMap = xNode.getParameter(); | ||
try { | ||
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); | ||
buildParameter(preparedStatement, parameter, parameterMap); | ||
ResultSet resultSet = preparedStatement.executeQuery(); | ||
List<T> objects = resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); | ||
return objects.get(0); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
public <T> List<T> selectList(String statement) { | ||
XNode xNode = mapperElement.get(statement); | ||
try { | ||
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); | ||
ResultSet resultSet = preparedStatement.executeQuery(); | ||
return resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
public <T> List<T> selectList(String statement, Object parameter) { | ||
XNode xNode = mapperElement.get(statement); | ||
Map<Integer, String> parameterMap = xNode.getParameter(); | ||
try { | ||
PreparedStatement preparedStatement = connection.prepareStatement(xNode.getSql()); | ||
buildParameter(preparedStatement, parameter, parameterMap); | ||
ResultSet resultSet = preparedStatement.executeQuery(); | ||
return resultSet2Obj(resultSet, Class.forName(xNode.getResultType())); | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
} | ||
|
||
private void buildParameter(PreparedStatement preparedStatement, Object parameter, Map<Integer, String> parameterMap) throws SQLException, IllegalAccessException { | ||
|
||
int size = parameterMap.size(); | ||
// 单个参数 | ||
if (parameter instanceof Long) { | ||
for (int i = 1; i <= size; i++) { | ||
preparedStatement.setLong(i, Long.parseLong(parameter.toString())); | ||
} | ||
return; | ||
} | ||
|
||
if (parameter instanceof Integer) { | ||
for (int i = 1; i <= size; i++) { | ||
preparedStatement.setInt(i, Integer.parseInt(parameter.toString())); | ||
} | ||
return; | ||
} | ||
|
||
if (parameter instanceof String) { | ||
for (int i = 1; i <= size; i++) { | ||
preparedStatement.setString(i, parameter.toString()); | ||
} | ||
return; | ||
} | ||
|
||
Map<String, Object> fieldMap = new HashMap<>(); | ||
// 对象参数 | ||
Field[] declaredFields = parameter.getClass().getDeclaredFields(); | ||
for (Field field : declaredFields) { | ||
String name = field.getName(); | ||
field.setAccessible(true); | ||
Object obj = field.get(parameter); | ||
field.setAccessible(false); | ||
fieldMap.put(name, obj); | ||
} | ||
|
||
for (int i = 1; i <= size; i++) { | ||
String parameterDefine = parameterMap.get(i); | ||
Object obj = fieldMap.get(parameterDefine); | ||
|
||
if (obj instanceof Short) { | ||
preparedStatement.setShort(i, Short.parseShort(obj.toString())); | ||
continue; | ||
} | ||
|
||
if (obj instanceof Integer) { | ||
preparedStatement.setInt(i, Integer.parseInt(obj.toString())); | ||
continue; | ||
} | ||
|
||
if (obj instanceof Long) { | ||
preparedStatement.setLong(i, Long.parseLong(obj.toString())); | ||
continue; | ||
} | ||
|
||
if (obj instanceof String) { | ||
preparedStatement.setString(i, obj.toString()); | ||
continue; | ||
} | ||
|
||
if (obj instanceof Date) { | ||
preparedStatement.setDate(i, (java.sql.Date) obj); | ||
} | ||
|
||
} | ||
|
||
} | ||
|
||
private <T> List<T> resultSet2Obj(ResultSet resultSet, Class<?> clazz) { | ||
List<T> list = new ArrayList<>(); | ||
try { | ||
ResultSetMetaData metaData = resultSet.getMetaData(); | ||
int columnCount = metaData.getColumnCount(); | ||
// 每次遍历行值 | ||
while (resultSet.next()) { | ||
T obj = (T) clazz.newInstance(); | ||
for (int i = 1; i <= columnCount; i++) { | ||
Object value = resultSet.getObject(i); | ||
String columnName = metaData.getColumnName(i); | ||
String setMethod = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); | ||
Method method; | ||
if (value instanceof Timestamp) { | ||
method = clazz.getMethod(setMethod, Date.class); | ||
} else { | ||
method = clazz.getMethod(setMethod, value.getClass()); | ||
} | ||
method.invoke(obj, value); | ||
} | ||
list.add(obj); | ||
} | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return list; | ||
} | ||
|
||
@Override | ||
public void close() { | ||
if (null == connection) return; | ||
try { | ||
connection.close(); | ||
} catch (SQLException e) { | ||
e.printStackTrace(); | ||
} | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
...design-16-02/src/main/java/org/itstack/demo/design/mediator/DefaultSqlSessionFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package org.itstack.demo.design.mediator; | ||
|
||
/** | ||
* 公众号 | bugstack虫洞栈 | ||
* 博 客 | https://bugstack.cn | ||
* Create by 小傅哥 @2020 | ||
*/ | ||
public class DefaultSqlSessionFactory implements SqlSessionFactory { | ||
|
||
private final Configuration configuration; | ||
|
||
public DefaultSqlSessionFactory(Configuration configuration) { | ||
this.configuration = configuration; | ||
} | ||
|
||
@Override | ||
public SqlSession openSession() { | ||
return new DefaultSqlSession(configuration.connection, configuration.mapperElement); | ||
} | ||
|
||
} |
Oops, something went wrong.