package com.kkb.mybatis.test;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import com.kkb.mybatis.framework.config.Configuration;
import com.kkb.mybatis.framework.config.MappedStatement;
import com.kkb.mybatis.framework.sqlsource.BoundSql;
import com.kkb.mybatis.framework.sqlsource.ParameterMapping;
import com.kkb.mybatis.framework.sqlsource.iface.SqlSource;
import com.kkb.mybatis.po.User;
import com.kkb.mybatis.utils.SimpleTypeRegistry;
/**
* 目的是使用XML来表达mybatis的全局配置信息,和业务相关的SQL映射信息 (映射文件) 其次,优化数据连接的创建(使用连接池)
*
* @author 灭霸詹
*
*/
public class MybatisV2 {
/**
* 封装了全局配置文件和映射文件中的所有信息
*/
private Configuration configuration = new Configuration();
private String namespace;
@Test
public void test() {
loadConfiguration();
User user = new User();
user.setUsername("王五");
List<User> users = selectList("queryUserById", user);
System.out.println(users);
}
private void loadConfiguration() {
// 指定全局配置文件的路径
String location = "mybatis-config.xml";
// 获取对应的InputStream对象
InputStream inputStream = getInputStream(location);
// 获取Document对象
Document document = createDocument(inputStream);
// 按照全局配置文件和映射文件的XML语义进行解析
loadConfigurationElement(document.getRootElement());
}
/**
*
* @param rootElement
* <configuration>
*/
private void loadConfigurationElement(Element rootElement) {
Element environments = rootElement.element("environments");
parseEnvironments(environments);
Element mappers = rootElement.element("mappers");
parseMappers(mappers);
}
/**
*
* @param mappers
* <mappers>
*/
@SuppressWarnings("unchecked")
private void parseMappers(Element mappers) {
List<Element> mapperElements = mappers.elements("mapper");
for (Element mapperElement : mapperElements) {
parseMapper(mapperElement);
}
}
private void parseMapper(Element mapperElement) {
String resource = mapperElement.attributeValue("resource");
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(resource);
Document document = createDocument(inputStream);
// 按照映射文件的语义进行解析
parseXmlMapper(document.getRootElement());
}
@SuppressWarnings("unchecked")
private void parseXmlMapper(Element rootElement) {
// 为了方便管理statement,需要使用statement唯一标识
namespace = rootElement.attributeValue("namespace");
List<Element> selectElements = rootElement.elements("select");
for (Element selectElement : selectElements) {
parseStatementElement(selectElement);
}
}
private void parseStatementElement(Element selectElement) {
String statementId = selectElement.attributeValue("id");
if (statementId == null || selectElement.equals("")) {
return;
}
// 一个CURD标签对应一个MappedStatement对象
// 一个MappedStatement对象由一个statementId来标识,所以保证唯一性
// statementId = namespace + "." + CRUD标签的id属性
statementId = namespace + "." + statementId;
String parameterType = selectElement.attributeValue("parameterType");
Class<?> parameterClass = resolveType(parameterType);
String resultType = selectElement.attributeValue("resultType");
Class<?> resultClass = resolveType(resultType);
String statementType = selectElement.attributeValue("statementType");
statementType = statementType == null || statementType == "" ? "prepared" : statementType;
// SqlSource的封装过程
SqlSource sqlSource = createSqlSource(selectElement);
// TODO 建议使用构建者模式去优化
MappedStatement mappedStatement = new MappedStatement(statementId, parameterClass, resultClass, statementType,
sqlSource);
configuration.addMappedStatement(statementId, mappedStatement);
}
private SqlSource createSqlSource(Element selectElement) {
return null;
}
private Class<?> resolveType(String parameterType) {
try {
Class<?> clazz = Class.forName(parameterType);
return clazz;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
*
* @param environments
* <environments>
*/
@SuppressWarnings("unchecked")
private void parseEnvironments(Element environments) {
String def = environments.attributeValue("default");
List<Element> envList = environments.elements();
for (Element element : envList) {
String id = element.attributeValue("id");
if (id.equals(def)) {
parseDataSource(element);
}
}
}
/**
*
* @param element
* <environment>
*/
private void parseDataSource(Element element) {
Element dataSourceElement = element.element("dataSource");
String type = dataSourceElement.attributeValue("type");
if (type.equals("DBCP")) {
BasicDataSource dataSource = new BasicDataSource();
Properties properties = parseProperty(dataSourceElement);
dataSource.setDriverClassName(properties.getProperty("driver"));
dataSource.setUrl(properties.getProperty("url"));
dataSource.setUsername(properties.getProperty("username"));
dataSource.setPassword(properties.getProperty("password"));
configuration.setDataSource(dataSource);
}
}
@SuppressWarnings("unchecked")
private Properties parseProperty(Element dataSourceElement) {
Properties properties = new Properties();
List<Element> propElements = dataSourceElement.elements("property");
for (Element propElement : propElements) {
String name = propElement.attributeValue("name");
String value = propElement.attributeValue("value");
properties.put(name, value);
}
return properties;
}
private Document createDocument(InputStream inputStream) {
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputStream);
return document;
} catch (Exception e) {
}
return null;
}
private InputStream getInputStream(String location) {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(location);
return inputStream;
}
@SuppressWarnings("unchecked")
private <T> List<T> selectList(String statementId, Object paramObject) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
// 要返回的结果集合
List<Object> results = new ArrayList<Object>();
try {
// 获取数据源对象,通过数据源获取连接
connection = getConnection(configuration.getDataSource());
MappedStatement mappedStatement = configuration.getMappedStatementById(statementId);
// 定义sql语句 ?表示占位符
SqlSource sqlSource = mappedStatement.getSqlSource();
// SqlSource的执行过程
BoundSql boundSql = sqlSource.getBoundSql(paramObject);
String sql = boundSql.getSql();
// 获取预处理 statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数
handleParameter(preparedStatement, mappedStatement, boundSql, paramObject);
// 向数据库发出 sql 执行查询,查询出结果集
rs = preparedStatement.executeQuery();
// 获取要映射的结果类型
handleResultSet(rs, results, mappedStatement);
} catch (Exception e) {
没有合适的资源?快使用搜索试试~ 我知道了~
手写mybatis核心流程代码demo

共39个文件
class:12个
java:12个
xml:6个

需积分: 1 0 下载量 201 浏览量
2023-04-22
22:56:37
上传
评论
收藏 18KB 7Z 举报
温馨提示
手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写mybatis核心流程代码demo手写myba
资源推荐
资源详情
资源评论

























收起资源包目录














































































共 39 条
- 1
资源评论


Java码库
- 粉丝: 2646
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【Python爬虫】从请求到数据存储全流程指南:涵盖网络请求、HTML解析与数据处理基础教程
- 由百度文心大模型驱动的 AirSim 无人机系统
- Selenium测试版浏览器和驱动
- 基于OpenCV的工业机器视觉软件开发.pdf
- 基于百度文心大模型驱动airsim无人机
- Python在图书情报学的应用与扩散研究.pdf
- 基于ELF文件恢复的Linux内存取证技术研究.caj
- 基于MATLAB地下水溶质运移预测模型的构建.pdf### 文章总结
- 管理系统源码-Python编程-基于SQLite的用户管理系统实现:涵盖CRUD功能的数据库操作入门教程
- 用于调用生成式大语言模型的 API 服务器系统
- 全国小区数据(包含字段:小区名、省份、城市、区域、地址、纬度(百度地图)、经度(百度地图)、纬度(GPS)、经度(GPS)、物业费
- 【大模型 NLP 算法付费干货大礼包】一站式拥有,学习科研工作全无忧!
- SQL Server 2000权威指南:从入门到精通
- 一项基于大模型的App隐私开关探测技术
- python 练习题 ,python 题目
- python 练习题,python 三角形题目
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
