forked from fuzhengwei/book-small-mybatis
-
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.
- Loading branch information
1 parent
496ed74
commit 966a8a9
Showing
14 changed files
with
769 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
<?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"> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<groupId>cn.bugstack.mybatis</groupId> | ||
<artifactId>mybatis-step-01</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
|
||
<packaging>jar</packaging> | ||
|
||
<parent> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-parent</artifactId> | ||
<version>2.3.5.RELEASE</version> | ||
<relativePath/> | ||
</parent> | ||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-configuration-processor</artifactId> | ||
<optional>true</optional> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-autoconfigure</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>org.springframework.boot</groupId> | ||
<artifactId>spring-boot-starter-aop</artifactId> | ||
</dependency> | ||
<dependency> | ||
<groupId>mysql</groupId> | ||
<artifactId>mysql-connector-java</artifactId> | ||
<version>5.1.20</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>commons-beanutils</groupId> | ||
<artifactId>commons-beanutils</artifactId> | ||
<version>1.8.3</version> | ||
</dependency> | ||
<!-- 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>com.alibaba</groupId> | ||
<artifactId>fastjson</artifactId> | ||
<version>1.2.75</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>junit</groupId> | ||
<artifactId>junit</artifactId> | ||
<version>4.12</version> | ||
<scope>test</scope> | ||
</dependency> | ||
</dependencies> | ||
|
||
<build> | ||
<finalName>mybatis-step-01</finalName> | ||
<resources> | ||
<resource> | ||
<directory>src/main/resources</directory> | ||
<filtering>true</filtering> | ||
<includes> | ||
<include>**/**</include> | ||
</includes> | ||
</resource> | ||
</resources> | ||
<testResources> | ||
<testResource> | ||
<directory>src/test/resources</directory> | ||
<filtering>true</filtering> | ||
<includes> | ||
<include>**/**</include> | ||
</includes> | ||
</testResource> | ||
</testResources> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-surefire-plugin</artifactId> | ||
<version>2.12.4</version> | ||
<configuration> | ||
<skipTests>true</skipTests> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-resources-plugin</artifactId> | ||
<version>2.5</version> | ||
<configuration> | ||
<encoding>${project.build.sourceEncoding}</encoding> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-compiler-plugin</artifactId> | ||
<version>2.3.2</version> | ||
<configuration> | ||
<source>1.8</source> | ||
<target>1.8</target> | ||
<encoding>${project.build.sourceEncoding}</encoding> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-source-plugin</artifactId> | ||
<version>2.1.2</version> | ||
<executions> | ||
<execution> | ||
<id>attach-sources</id> | ||
<goals> | ||
<goal>jar</goal> | ||
</goals> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
|
||
</project> |
24 changes: 24 additions & 0 deletions
24
mybatis-step-01/src/main/java/cn/bugstack/mybatis/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,24 @@ | ||
package cn.bugstack.mybatis; | ||
|
||
import java.sql.Connection; | ||
import java.util.Map; | ||
|
||
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; | ||
} | ||
|
||
} |
183 changes: 183 additions & 0 deletions
183
mybatis-step-01/src/main/java/cn/bugstack/mybatis/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,183 @@ | ||
package cn.bugstack.mybatis; | ||
|
||
import java.lang.reflect.Field; | ||
import java.lang.reflect.Method; | ||
import java.sql.*; | ||
import java.util.Date; | ||
import java.util.*; | ||
|
||
|
||
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(); | ||
} | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
mybatis-step-01/src/main/java/cn/bugstack/mybatis/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,16 @@ | ||
package cn.bugstack.mybatis; | ||
|
||
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); | ||
} | ||
|
||
} |
31 changes: 31 additions & 0 deletions
31
mybatis-step-01/src/main/java/cn/bugstack/mybatis/Resources.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,31 @@ | ||
package cn.bugstack.mybatis; | ||
|
||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.io.InputStreamReader; | ||
import java.io.Reader; | ||
|
||
public class Resources { | ||
|
||
public static Reader getResourceAsReader(String resource) throws IOException { | ||
return new InputStreamReader(getResourceAsStream(resource)); | ||
} | ||
|
||
private static InputStream getResourceAsStream(String resource) throws IOException { | ||
ClassLoader[] classLoaders = getClassLoaders(); | ||
for (ClassLoader classLoader : classLoaders) { | ||
InputStream inputStream = classLoader.getResourceAsStream(resource); | ||
if (null != inputStream) { | ||
return inputStream; | ||
} | ||
} | ||
throw new IOException("Could not find resource " + resource); | ||
} | ||
|
||
private static ClassLoader[] getClassLoaders() { | ||
return new ClassLoader[]{ | ||
ClassLoader.getSystemClassLoader(), | ||
Thread.currentThread().getContextClassLoader()}; | ||
} | ||
|
||
} |
Oops, something went wrong.