当前位置: 首页 > news >正文

如何部置网站到iis安康养老院收费价格表

如何部置网站到iis,安康养老院收费价格表,dw新建站点,html5制作手机网站文章目录 一、目标#xff1a;数据源的解析、创建和使用二、设计#xff1a;数据源的解析、创建和使用三、实现#xff1a;数据源的解析、创建和使用3.1 引入依赖3.2 工程结构3.3 数据源解析、创建和使用关系图3.4 事务管理接口和事务工厂3.4.1 事务的隔离级别3.4.2 定义事务… 文章目录 一、目标数据源的解析、创建和使用二、设计数据源的解析、创建和使用三、实现数据源的解析、创建和使用3.1 引入依赖3.2 工程结构3.3 数据源解析、创建和使用关系图3.4 事务管理接口和事务工厂3.4.1 事务的隔离级别3.4.2 定义事务接口3.4.3 事务接口实现类3.4.4 事务工厂3.4.5 JDBC事务工厂 3.5 数据源工厂创建3.5.1 数据源工厂3.5.2 阿里的druid数据库连接池 3.6 创建配置环境基础类3.6.1 绑定的SQL对象3.6.2 参数映射对象3.6.3 环境配置类3.6.4 映射器语句类 3.7 类型别名注册器3.7.1 JDBC枚举类型3.7.2 类型别名注册机3.7.3 配置项 3.8 解析数据源配置3.8.1 构建器基类3.8.2 XML配置构建器 3.9 SQL执行和结果封装3.9.1 默认sqlSession实现类 四、测试数据源的解析、创建和使用4.1 创建 mybatis 数据库并添加数据库表4.2 提供 DAO 接口 和 User 实体类4.2.1 用户持久层4.2.2 用户类 4.3 配置数据源和配置Mapper4.3.1 配置文件4.3.2 用户接口配置文件 4.4 单元测试4.5 功能验证 五、总结数据源的解析、创建和使用 一、目标数据源的解析、创建和使用 解析 XML 中关于 dataSource 数据源信息配置并建立事务管理和连接池的启动和使用并将这部分能力在 DefaultSqlSession 执行 SQL 语句时进行调用。 二、设计数据源的解析、创建和使用 怎么完成对数据源的解析 建立数据源连接池和 JDBC 事务工厂操作并以 XML 配置数据源信息为入口在 XMLConfigBuilder 中添加数据源解析和构建操作。向配置类 configuration 添加 JDBC 操作环境信息以便在 DefaultSqlSession 完成对 JDBC 执行 SQL 操作。 在 parse 中解析 XML DB 链接配置信息并完成事务工厂和连接池的注册环境到配置类的操作。调用 selectOne 方法的处理把 SQL 语句放到 DB 连接池中进行执行以及完成简单的结果封装。 三、实现数据源的解析、创建和使用 3.1 引入依赖 pom.xml dependencies!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.48/version/dependency!-- https://mvnrepository.com/artifact/com.alibaba/druid --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.9/version/dependency /dependencies3.2 工程结构 mybatis-step-04 |-src|-main| |-java| |-com.lino.mybatis| |-binding| | |-MapperMethod.java| | |-MapperProxy.java| | |-MapperProxyFactory.java| | |-MapperRegistry.java| |-builder| | |-xml| | | |-XMLConfigBuilder.java| | |-BaseBuilder.java| |-datasource| | |-druid| | | |-DruidDataSourceFacroty.java| | |-DataSourceFactory.java| |-io| | |-Resources.java| |-mapping| | |-BoundSql.java| | |-Environment.java| | |-MappedStatement.java| | |-ParameterMapping.java| | |-SqlCommandType.java| |-session| | |-defaults| | | |-DefaultSqlSession.java| | | |-DefaultSqlSessionFactory.java| | |-Configuration.java| | |-SqlSession.java| | |-SqlSessionFactory.java| | |-SqlSessionFactoryBuilder.java| | |-TransactionIsolationLevel.java| |-transaction| | |-jdbc| | | |-JdbcTransaction.java| | | |-JdbcTransactionFactory.java| | |-Transaction.java| | |-TransactionFactory.java| |-type| | |-JdbcType.java| | |-TypeAliasRegistry.java|-test|-java| |-com.lino.mybatis.test| |-dao| | |-IUserDao.java| |-po| | |-User.java| |-ApiTest.java|-resources|-mapper| |-User_Mapper.xml|-mybatis-config-datasource.xml3.3 数据源解析、创建和使用关系图 以事务接口 Transaction 和事务工厂 TransactionFactory 的实现包装数据源 DruidDataSourceFactory 的功能。数据源采用阿里的 druid。当所有的数据源相关功能准备好之后在 XMLConfigBuilder 解析 XML 配置操作中对数据源的配置进行解析以及创建出相应的服务存在到 Configuration 的环境配置中。最后在 DefaultSqlSession#selectOne 方法中完成 SQL 的执行和结果封装最终就把整个 Mybatis 的核心脉络串联起来。 3.4 事务管理接口和事务工厂 一次数据库的操作应该具备事务管理能力而不是通过 JDBC 获取链接后直接执行还应该把控链接、提交、回滚和关闭的操作处理。结合 JDBC 的能力封装事务管理。 3.4.1 事务的隔离级别 TransactionIsolationLevel.java package com.lino.mybatis.session;import java.sql.Connection;/*** description: 事务的隔离级别*/ public enum TransactionIsolationLevel {//包括JDBC支持的5个级别NONE(Connection.TRANSACTION_NONE),READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);private final int level;TransactionIsolationLevel(int level) {this.level level;}public int getLevel() {return level;} }3.4.2 定义事务接口 Transaction.java package com.lino.mybatis.transaction;import java.sql.Connection; import java.sql.SQLException;/*** description: 事务接口*/ public interface Transaction {/*** 获取数据库连接** return 数据库连接* throws SQLException SQL异常*/Connection getConnection() throws SQLException;/*** 提交** throws SQLException SQL异常*/void commit() throws SQLException;/*** 回滚** throws SQLException SQL异常*/void rollback() throws SQLException;/*** 关闭** throws SQLException SQL异常*/void close() throws SQLException; }定义标准的事务接口连接、提交、回滚、关闭具体可以由不同的事务方式进行实现。包括JDBC 和托管事务托管事务是交给 Spring 容器管理。 3.4.3 事务接口实现类 JdbcTransaction.java package com.lino.mybatis.transaction.jdbc;import com.lino.mybatis.session.TransactionIsolationLevel; import com.lino.mybatis.transaction.Transaction;import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;/*** description: JDBC 事务直接利用 JDBC 的commit、rollback。依赖于数据源获得的连接管理事务范围*/ public class JdbcTransaction implements Transaction {protected Connection connection;protected DataSource dataSource;protected TransactionIsolationLevel level TransactionIsolationLevel.NONE;protected boolean autoCommit;public JdbcTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {this.dataSource dataSource;this.level level;this.autoCommit autoCommit;}public JdbcTransaction(Connection connection) {this.connection connection;}Overridepublic Connection getConnection() throws SQLException {connection dataSource.getConnection();connection.setTransactionIsolation(level.getLevel());connection.setAutoCommit(autoCommit);return connection;}Overridepublic void commit() throws SQLException {if (connection ! null !connection.getAutoCommit()) {connection.commit();}}Overridepublic void rollback() throws SQLException {if (connection ! null !connection.getAutoCommit()) {connection.rollback();}}Overridepublic void close() throws SQLException {if (connection ! null !connection.getAutoCommit()) {connection.close();}} }在 JDBC 事务实现类中封装了获取连接、提交事务等操作其实使用的就是 JDBC 本身提供的能力。 3.4.4 事务工厂 TransactionFactory.java package com.lino.mybatis.transaction;import com.lino.mybatis.session.TransactionIsolationLevel;import javax.sql.DataSource; import java.sql.Connection;/*** description: 事务工厂*/ public interface TransactionFactory {/*** 根据 Connection 创建 事务** param conn 连接* return 事务对象*/Transaction newTransaction(Connection conn);/*** 根据数据源和事务隔离级别创建事务** param dataSource 数据源* param level 事务隔离级别* param autoCommit 是否自动提交* return 事务*/Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit); }以工厂方法模式包装 JDBC 事务实现为每一个事务实现都提供一个对应的工厂。与简单工厂的接口包装不同。 3.4.5 JDBC事务工厂 JdbcTransactionFactory.java package com.lino.mybatis.transaction.jdbc;import com.lino.mybatis.session.TransactionIsolationLevel; import com.lino.mybatis.transaction.Transaction; import com.lino.mybatis.transaction.TransactionFactory;import javax.sql.DataSource; import java.sql.Connection;/*** description: JDBC 事务工厂*/ public class JdbcTransactionFactory implements TransactionFactory {Overridepublic Transaction newTransaction(Connection conn) {return new JdbcTransaction(conn);}Overridepublic Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {return new JdbcTransaction(dataSource, level, autoCommit);} }3.5 数据源工厂创建 3.5.1 数据源工厂 DataSourceFactory.java package com.lino.mybatis.datasource;import javax.sql.DataSource; import java.util.Properties;/*** description: 数据源工厂*/ public interface DataSourceFactory {/*** 添加数据源** param props 数据源信息*/void setProperties(Properties props);/*** 获取数据源** return 数据源*/DataSource getDataSource(); }3.5.2 阿里的druid数据库连接池 DruidDataSourceFactory.java package com.lino.mybatis.datasource.druid;import com.alibaba.druid.pool.DruidDataSource; import com.lino.mybatis.datasource.DataSourceFactory; import javax.sql.DataSource; import java.util.Properties;/*** description: Druid 数据源工厂*/ public class DruidDataSourceFactory implements DataSourceFactory {private Properties props;Overridepublic void setProperties(Properties props) {this.props props;}Overridepublic DataSource getDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(props.getProperty(driver));dataSource.setUrl(props.getProperty(url));dataSource.setUsername(props.getProperty(username));dataSource.setPassword(props.getProperty(password));return dataSource;} }3.6 创建配置环境基础类 3.6.1 绑定的SQL对象 BoundSql.java package com.lino.mybatis.mapping;import java.util.Map;/*** description: 绑定的SQL是从SqlSource而来将动态内容都处理完成得到的SQL语句字符串其中包括?还有绑定的参数*/ public class BoundSql {private String sql;private MapInteger, String parameterMappings;private String parameterType;private String resultType;public BoundSql(String sql, MapInteger, String parameterMappings, String parameterType, String resultType) {this.sql sql;this.parameterMappings parameterMappings;this.parameterType parameterType;this.resultType resultType;}public String getSql() {return sql;}public MapInteger, String getParameterMappings() {return parameterMappings;}public String getParameterType() {return parameterType;}public String getResultType() {return resultType;} }3.6.2 参数映射对象 ParameterMapping.java package com.lino.mybatis.mapping;import cn.hutool.db.meta.JdbcType; import com.lino.mybatis.session.Configuration;/*** description: 参数映射 #{property,javaTypeint,jdbcTypeNUMERIC}*/ public class ParameterMapping {private Configuration configuration;/*** property*/private String property;/*** javaType int*/private Class? javaType Object.class;/*** javaType NUMERIC*/private JdbcType jdbcType;public ParameterMapping() {}public static class Builder {private ParameterMapping parameterMapping new ParameterMapping();private Builder(Configuration configuration, String property) {parameterMapping.configuration configuration;parameterMapping.property property;}public Builder javaType(Class? javaType) {parameterMapping.javaType javaType;return this;}public Builder jdbcType(JdbcType jdbcType) {parameterMapping.jdbcType jdbcType;return this;}}public Configuration getConfiguration() {return configuration;}public String getProperty() {return property;}public Class? getJavaType() {return javaType;}public JdbcType getJdbcType() {return jdbcType;} }3.6.3 环境配置类 Environment.java package com.lino.mybatis.mapping;import com.lino.mybatis.transaction.TransactionFactory; import javax.sql.DataSource;/*** description: 环境*/ public final class Environment {/*** 环境id*/private final String id;/*** 事务工厂*/private final TransactionFactory transactionFactory;/*** 数据源*/private final DataSource dataSource;public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {this.id id;this.transactionFactory transactionFactory;this.dataSource dataSource;}public static class Builder {private String id;private TransactionFactory transactionFactory;private DataSource dataSource;public Builder(String id) {this.id id;}public Builder transactionFactory(TransactionFactory transactionFactory) {this.transactionFactory transactionFactory;return this;}public Builder dataSource(DataSource dataSource) {this.dataSource dataSource;return this;}public String id() {return this.id;}public Environment build() {return new Environment(this.id, this.transactionFactory, this.dataSource);}}public String getId() {return id;}public TransactionFactory getTransactionFactory() {return transactionFactory;}public DataSource getDataSource() {return dataSource;} }3.6.4 映射器语句类 MappedStatement.java package com.lino.mybatis.mapping;import com.lino.mybatis.session.Configuration; import java.util.Map;/*** description: 映射器语句类*/ public class MappedStatement {private Configuration configuration;private String id;private SqlCommandType sqlCommandType;private BoundSql boundSql;public MappedStatement() {}public static class Builder {private MappedStatement mappedStatement new MappedStatement();public Builder(Configuration configuration, String id, SqlCommandType sqlCommandType, BoundSql boundSql) {mappedStatement.configuration configuration;mappedStatement.id id;mappedStatement.sqlCommandType sqlCommandType;mappedStatement.boundSql boundSql;}public MappedStatement build() {assert mappedStatement.configuration ! null;assert mappedStatement.id ! null;return mappedStatement;}}public Configuration getConfiguration() {return configuration;}public String getId() {return id;}public SqlCommandType getSqlCommandType() {return sqlCommandType;}public BoundSql getBoundSql() {return boundSql;} }去除 sql 多个参数字段添加 BoundSql SQL 对象 3.7 类型别名注册器 Mybatis 框架中我们所需要的基本类型、数组类型以及自定定义的事务实现和事务工厂都需要注册到类型别名注册器中进行管理。 在我们需要使用的时候可以从注册器中获取到具体的对象类型之后再进行实例化的方式进行使用。 3.7.1 JDBC枚举类型 JdbcType.java package com.lino.mybatis.type;import java.sql.Types; import java.util.HashMap; import java.util.Map;/*** description: JDBC枚举类型*/ public enum JdbcType {// JDBC枚举类型INTEGER(Types.INTEGER),FLOAT(Types.FLOAT),DOUBLE(Types.DOUBLE),DECIMAL(Types.DECIMAL),VARCHAR(Types.VARCHAR),TIMESTAMP(Types.TIMESTAMP);public final int TYPE_CODE;private static MapInteger, JdbcType codeLookup new HashMap();static {for (JdbcType type : JdbcType.values()) {codeLookup.put(type.TYPE_CODE, type);}}JdbcType(int code) {this.TYPE_CODE code;}public static JdbcType forCode(int code) {return codeLookup.get(code);} }3.7.2 类型别名注册机 TypeAliasRegistry.java package com.lino.mybatis.type;import java.util.HashMap; import java.util.Locale; import java.util.Map;/*** description: 类型别名注册机*/ public class TypeAliasRegistry {private final MapString, Class? TYPE_ALIASES new HashMap();public TypeAliasRegistry() {// 构造函数里注册系统内置的类型别名registerAlias(string, String.class);// 基本包装类型registerAlias(byte, Byte.class);registerAlias(long, Long.class);registerAlias(short, Short.class);registerAlias(int, Integer.class);registerAlias(integer, Integer.class);registerAlias(double, Double.class);registerAlias(float, Float.class);registerAlias(boolean, Boolean.class);}public void registerAlias(String alias, Class? value) {String key alias.toLowerCase(Locale.ENGLISH);TYPE_ALIASES.put(key, value);}public T ClassT resolveAlias(String string) {String key string.toLowerCase(Locale.ENGLISH);return (ClassT) TYPE_ALIASES.get(key);} }在 TypeAliasRegistry 类型别名注册器中先做一些基本的类型注册以及提供 registerAlias 注册方法和 resolveAlias 获取方法。 3.7.3 配置项 Configuration.java package com.lino.mybatis.session;import com.lino.mybatis.binding.MapperRegistry; import com.lino.mybatis.datasource.druid.DruidDataSourceFactory; import com.lino.mybatis.mapping.Environment; import com.lino.mybatis.mapping.MappedStatement; import com.lino.mybatis.transaction.jdbc.JdbcTransaction; import com.lino.mybatis.transaction.jdbc.JdbcTransactionFactory; import com.lino.mybatis.type.TypeAliasRegistry;import java.util.HashMap; import java.util.Map;/*** description: 配置项* author: lingjian* createDate: 2022/11/5 16:27*/ public class Configuration {/*** 环境*/protected Environment environment;/*** 映射注册机*/protected MapperRegistry mapperRegistry new MapperRegistry(this);/*** 映射的语句存在Map里*/protected final MapString, MappedStatement mappedStatements new HashMap(16);/*** 类型别名注册机*/protected final TypeAliasRegistry typeAliasRegistry new TypeAliasRegistry();public Configuration() {typeAliasRegistry.registerAlias(JDBC, JdbcTransactionFactory.class);typeAliasRegistry.registerAlias(DRUID, DruidDataSourceFactory.class);}public void addMappers(String packageName) {mapperRegistry.addMappers(packageName);}public T void addMapper(ClassT type) {mapperRegistry.addMapper(type);}public T T getMapper(ClassT type, SqlSession sqlSession) {return mapperRegistry.getMapper(type, sqlSession);}public boolean hasMapper(Class? type) {return mapperRegistry.hasMapper(type);}public void addMappedStatement(MappedStatement ms) {mappedStatements.put(ms.getId(), ms);}public MappedStatement getMappedStatement(String id) {return mappedStatements.get(id);}public TypeAliasRegistry getTypeAliasRegistry() {return typeAliasRegistry;}public Environment getEnvironment() {return environment;}public void setEnvironment(Environment environment) {this.environment environment;} }添加 Environment 配置环境添加 TypeAliasRegistry 类型别名注册机添加初始化添加 JDBC 事务工厂和 DRUID 数据源工厂在 Configuration 配置选项中添加类型别名注册机通过构造函数添加 JDBC、DRUID 注册操作。整个 Mybatis 的操作都是使用 Configuration 配置项进行串联流程所有的内容都会在 Configuration 中进行连接。 3.8 解析数据源配置 通过在 XML 解析器 XMLConfigBuilder 中扩展对环境信息的解析。这里把数据源、事务类内容成为操作 SQL 环境。 解析后把配置信息写入到 Configuration 配置项中便于后续使用。 3.8.1 构建器基类 BaseBuilder.java package com.lino.mybatis.builder;import com.lino.mybatis.session.Configuration; import com.lino.mybatis.type.TypeAliasRegistry;/*** description: 构建器的基类建造者模式*/ public class BaseBuilder {protected final Configuration configuration;protected final TypeAliasRegistry typeAliasRegistry;public BaseBuilder(Configuration configuration) {this.configuration configuration;this.typeAliasRegistry this.configuration.getTypeAliasRegistry();}public Configuration getConfiguration() {return configuration;} }添加 TypeAliasRegistry 类型别名注册机 3.8.2 XML配置构建器 XMLConfigBuilder.java package com.lino.mybatis.builder.xml;import com.lino.mybatis.builder.BaseBuilder; import com.lino.mybatis.datasource.DataSourceFactory; import com.lino.mybatis.io.Resources; import com.lino.mybatis.mapping.BoundSql; import com.lino.mybatis.mapping.Environment; import com.lino.mybatis.mapping.MappedStatement; import com.lino.mybatis.mapping.SqlCommandType; import com.lino.mybatis.session.Configuration; import com.lino.mybatis.transaction.TransactionFactory; import com.lino.mybatis.type.TypeAliasRegistry; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.xml.sax.InputSource; import javax.sql.DataSource; import java.io.Reader; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** description: XML配置构建器建造者模式集成BaseBuilder*/ public class XMLConfigBuilder extends BaseBuilder {private Element root;private static final Pattern pattern Pattern.compile((#\\{(.*?)}));public XMLConfigBuilder(Reader reader) {// 1.调用父类初始化Configurationsuper(new Configuration());// 2.dom4j 处理xmlSAXReader saxReader new SAXReader();try {Document document saxReader.read(new InputSource(reader));root document.getRootElement();} catch (DocumentException e) {e.printStackTrace();}}/*** 解析配置类型别名、插件、对象工厂、对象包装工厂、设置、环境、类型转换、映射器** return Configuration*/public Configuration parse() {try {// 环境environmentsElement(root.element(environments));// 解析映射器mapperElement(root.element(mappers));} catch (Exception e) {throw new RuntimeException(Error parsing SQL Mapper Configuration. Cause: e, e);}return configuration;}private void environmentsElement(Element context) throws Exception {String environment context.attributeValue(default);ListElement environmentList context.elements(environment);for (Element e : environmentList) {String id e.attributeValue(id);if (environment.equals(id)) {// 事务管理器TransactionFactory txFactory (TransactionFactory) typeAliasRegistry.resolveAlias(e.element(transactionManager).attributeValue(type)).newInstance();// 数据源Element dataSourceElement e.element(dataSource);DataSourceFactory dataSourceFactory (DataSourceFactory) typeAliasRegistry.resolveAlias(dataSourceElement.attributeValue(type)).newInstance();ListElement propertyList dataSourceElement.elements(property);Properties props new Properties();for (Element property : propertyList) {props.setProperty(property.attributeValue(name), property.attributeValue(value));}dataSourceFactory.setProperties(props);DataSource dataSource dataSourceFactory.getDataSource();// 构建环境Environment.Builder environmentBuilder new Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);configuration.setEnvironment(environmentBuilder.build());}}}private void mapperElement(Element mappers) throws Exception {ListElement mapperList mappers.elements(mapper);for (Element e : mapperList) {String resource e.attributeValue(resource);Reader reader Resources.getResourceAsReader(resource);SAXReader saxReader new SAXReader();Document document saxReader.read(new InputSource(reader));Element root document.getRootElement();// 命名空间String namespace root.attributeValue(namespace);// SELECTListElement selectNodes root.elements(select);for (Element node : selectNodes) {String id node.attributeValue(id);String parameterType node.attributeValue(parameterType);String resultType node.attributeValue(resultType);String sql node.getText();// ? 匹配MapInteger, String parameter new HashMap(16);Matcher matcher pattern.matcher(sql);for (int i 1; matcher.find(); i) {String g1 matcher.group(1);String g2 matcher.group(2);parameter.put(i, g2);sql sql.replace(g1, ?);}String msId namespace . id;String nodeName node.getName();SqlCommandType sqlCommandType SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));// SQL语句初识化BoundSql boundSql new BoundSql(sql, parameter, parameterType, resultType);MappedStatement mappedStatement new MappedStatement.Builder(configuration, msId, sqlCommandType, boundSql).build();// 添加解析SQLconfiguration.addMappedStatement(mappedStatement);}// 注册Mapper映射器configuration.addMapper(Resources.classForName(namespace));}} }添加 environmentsElement 配置环境处理修改 mapperElement 中创建 MappedStatement 映射器语句类的初始化以 XMLConfigBuilder#parse 解析扩展对数据源解析操作 在 environmentsElement 方法中包括事务管理器解析和从注册器中读取到事务工程的实现类同理数据源也是从类型注册器中获取。最后把事务管理器和数据源的处理通过环境构建 Environment.Builder 存放到 Configuration 配置项中也就可以通过 Configuration 存在的地方都可以获取到数据源了。 3.9 SQL执行和结果封装 3.9.1 默认sqlSession实现类 DefaultSqlSession.java package com.lino.mybatis.session.defaults;import com.lino.mybatis.mapping.BoundSql; import com.lino.mybatis.mapping.Environment; import com.lino.mybatis.mapping.MappedStatement; import com.lino.mybatis.session.Configuration; import com.lino.mybatis.session.SqlSession; import java.lang.reflect.Method; import java.sql.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List;/*** description: 默认sqlSession实现类*/ public class DefaultSqlSession implements SqlSession {private Configuration configuration;public DefaultSqlSession(Configuration configuration) {this.configuration configuration;}Overridepublic T T selectOne(String statement) {return (T) (你被代理了! statement);}Overridepublic T T selectOne(String statement, Object parameter) {try {MappedStatement mappedStatement configuration.getMappedStatement(statement);Environment environment configuration.getEnvironment();Connection connection environment.getDataSource().getConnection();BoundSql boundSql mappedStatement.getBoundSql();PreparedStatement preparedStatement connection.prepareStatement(boundSql.getSql());preparedStatement.setLong(1, Long.parseLong(((Object[]) parameter)[0].toString()));ResultSet resultSet preparedStatement.executeQuery();ListT objList resultSet2Obj(resultSet, Class.forName(boundSql.getResultType()));return objList.get(0);} catch (Exception e) {e.printStackTrace();return null;}}private T ListT resultSet2Obj(ResultSet resultSet, Class? clazz) {ListT 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, LocalDateTime.class);} else {method clazz.getMethod(setMethod, value.getClass());}method.invoke(obj, value);}list.add(obj);}} catch (Exception e) {e.printStackTrace();}return list;}Overridepublic T T getMapper(ClassT type) {return configuration.getMapper(type, this);}Overridepublic Configuration getConfiguration() {return configuration;} }修改 selectOne引入配置环境和数据源将之前打印改为调用 JDBC 连接数据查询 SQL添加 resultSet2Obj 返回结果处理方法在 selectOne 方法中获取 Connection 数据源连接并简单的执行 SQL 语句并对执行的结果进行封装处理。 四、测试数据源的解析、创建和使用 4.1 创建 mybatis 数据库并添加数据库表 CREATE TABLEUSER(id bigint NOT NULL AUTO_INCREMENT COMMENT 自增ID,userId VARCHAR(9) COMMENT 用户ID,userHead VARCHAR(16) COMMENT 用户头像,createTime TIMESTAMP NULL COMMENT 创建时间,updateTime TIMESTAMP NULL COMMENT 更新时间,userName VARCHAR(64),PRIMARY KEY (id))ENGINEInnoDB DEFAULT CHARSETutf8;insert into user (id, userId, userHead, createTime, updateTime, userName) values (1, 10001, 1_04, 2022-11-07 00:00:00, 2022-11-07 00:00:00, 小零);创建一个数据库名为 mybatis 的数据库在数据库 mybatis 中创建表 user并添加测试数据 4.2 提供 DAO 接口 和 User 实体类 4.2.1 用户持久层 IUserDao.java package com.lino.mybatis.test.dao;import com.lino.mybatis.test.po.User;/*** Description: 用户持久层*/ public interface IUserDao {/*** 根据ID查询用户信息** param uId ID* return String 名称*/User queryUserInfoById(Long uId); }返回结果改为 User 实体类 4.2.2 用户类 User.java package com.lino.mybatis.test.po;import cn.hutool.core.date.DateTime; import java.time.LocalDateTime; import java.util.Date;/*** description: 用户实例类*/ public class User {private Long id;/*** 用户ID*/private String userId;/*** 头像*/private String userHead;/*** 用户名称*/private String userName;/*** 创建时间*/private Date createTime;/*** 更新时间*/private Date updateTime;public Long getId() {return id;}public void setId(Long id) {this.id id;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId userId;}public String getUserHead() {return userHead;}public void setUserHead(String userHead) {this.userHead userHead;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime createTime;}public Date getUpdateTime() {return updateTime;}public void setUpdateTime(Date updateTime) {this.updateTime updateTime;} }添加 userName 属性 4.3 配置数据源和配置Mapper 4.3.1 配置文件 mybatis-config-datasource.xml ?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typeDRUIDproperty namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://127.0.0.1:3306/mybatis?useUnicodetrue/property nameusername valueroot/property namepassword value123456//dataSource/environment/environmentsmappersmapper resourcemapper/User_Mapper.xml//mappers /configuration添加 environments 数据库配置信息。通过 mybatis-config-datasource.xml 配置数据源信息包括driver、url、username、passwordDataSource 配置的是 DRUID目前只实现了这个数据源。 4.3.2 用户接口配置文件 User_Mapper.xml ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.lino.mybatis.test.dao.IUserDaoselect idqueryUserInfoById parameterTypejava.lang.Long resultTypecom.lino.mybatis.test.po.UserSELECT id, userId, userHead, userNameFROM userWHERE id #{id}/select /mapper去除 createTime 查询字段, 添加 userName 查询字段。 4.4 单元测试 ApiTest /*** 测试映射器注册机*/ Test public void test_SqlSessionFactory() throws IOException {// 1.从SqlSessionFactory中获取SqlSessionSqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(mybatis-config-datasource.xml));SqlSession sqlSession sqlSessionFactory.openSession();// 2.获取映射器对象IUserDao userDao sqlSession.getMapper(IUserDao.class);// 3.测试验证User user userDao.queryUserInfoById(1L);logger.info(测试结果{}, JSON.toJSONString(user)); }测试结果 08:32:18.875 [main] INFO c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited 08:32:19.623 [main] INFO com.lino.mybatis.test.ApiTest - 测试结果{id:1,userHead:1_04,userId:10001,userName:小零哥}从测试结果看通过对数据源的解析、包装和使用已经可以对 SQL 语句进行执行和包装返回的结果信息了。 4.5 功能验证 ApiTest Test public void test_selectOne() throws IOException {// 解析XMLReader reader Resources.getResourceAsReader(mybatis-config-datasource.xml);XMLConfigBuilder xmlConfigBuilder new XMLConfigBuilder(reader);Configuration configuration xmlConfigBuilder.parse();// 获取 DefaultSqlSessionSqlSession sqlSession new DefaultSqlSession(configuration);// 执行查询默认是一个集合参数Object[] req {1L};Object result sqlSession.selectOne(com.lino.mybatis.test.dao.IUserDao.queryUserInfoById, req);logger.info(测试结果{}, JSON.toJSONString(result)); }对本章节新增的内容进行提取进行测试验证。新增内容解析内容的添加、处理 XML 配置中的数据源信息以及解析后可以在 DefaultSqlSession 中调用数据源执行 SQL 语句并返回结果。 测试结果 10:19:43.519 [main] INFO c.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited 10:19:44.306 [main] INFO com.lino.mybatis.test.ApiTest - 测试结果{id:1,userHead:1_04,userId:10001,userName:小灵哥}测试结果是通过的。从 XML 数据源元素配置的解析到 Configuration 资源的注册以及写入相关配置到配置项并在 DefaultSqlSession 中进行使用。同时这里跳过代理方式获取 Mapper 而是直接拿到 SqlSession 执行 selectOne 方法的方式进行处理这样更容易观察整个功能的迭代开发。 五、总结数据源的解析、创建和使用 以解析 XML 配置解析为入口添加数据源的整合和包装引出事务工厂对 JDBC 事务的处理并加载到环境配置中进行运用。通过数据源的引入就可以在 DefaultSqlSession 中从 Configuration 配置引入环境信息把对应的 SQL 语句提交给 JDBC 进行处理并简单封装结果数据。
http://www.zqtcl.cn/news/834968/

相关文章:

  • 教育培训网站抄袭网站是广西住房和城乡建设厅
  • 广州做网站建设的公司哪家好网站建设运营公司
  • 网站集约化建设 技术国内永久在线免费建站
  • 极简资讯网站开发有什么免费推广项目的好软件
  • 网站有哪几种类型如何让百度分享按钮在网站每个页面都有
  • 北京市昌平建设工程招标网站网站建设要学哪些软件有哪些方面
  • 部队内网网站建设方案诱导视频网站怎么做
  • 安徽省美好乡村建设网站郑州网站建设 论坛
  • 手机网站怎么建设软件外包公司绩效考核内容
  • 北京最大的火车站网站免费推广方式
  • 外贸网站建设系统工程公司名称大全
  • 手机视频网站建站吴江区经济开发区建设工程网站
  • 网站建设存在哪些问题学校网站手机站的建设
  • 婚恋网站设计手机免费制作网站模板
  • 北京网站建设与维护公司网络组建方案设计
  • 自己做网站好还是凡科樱花动漫做网站
  • 自己做外贸开通什么网站wordpress万能主题
  • 网站建设中添加图片链接cad线下培训班
  • 网站建站系统程序长宁区网站建设网站制
  • 合肥网站建设合肥做网站wordpress 关于页面
  • 软件开发公司赚钱吗北京网站优化解决方案
  • 泰安的网站建设公司哪家好国外ps网站
  • 网站建设制作方案做字典网站开发
  • 安徽道遂建设工程有限公司网站汽车之家网页
  • 仙居网站建设贴吧马鞍山钢铁建设集团有限公司网站
  • 编写网站 语言微网站开发语言
  • 深圳网站建设优化网站建设与维护培训
  • 张家港网站开发wordpress后台登录地址改
  • 郑州做网站的公司哪家好做网站运营工资是不是很低
  • 做网站电销公司开发个网站怎么做