<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="abc">
<!-- 这个id是这条SQL语句的唯一标识,这个ID就代表了这条SQL语句-->
<insert id="insertCar">
insert into
t_car(id,car_num,brand,guide_price,produce_time,car_type)
values
(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
select
*
from
t_car
where
id = #{id};
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="abc">
<!-- 这个id是这条SQL语句的唯一标识,这个ID就代表了这条SQL语句-->
<insert id="insertCar">
insert into
t_car(id,car_num,brand,guide_price,produce_time,car_type)
values
(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType});
</insert>
<select id="selectById" resultType="com.powernode.mybatis.pojo.Car">
select
*
from
t_car
where
id = #{id};
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<environments default="MybatisDB">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:13306/powernode" />
<property name="username" value="root" />
<property name="password" value="abc123" />
</dataSource>
</environment>
<environment id="MybatisDB">
<transactionManager type="MANAGED" />
<dataSource type="JNDI">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:13306/powernode" />
<property name="username" value="root" />
<property name="password" value="abc123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"></mapper>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<environments default="MybatisDB">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:13306/powernode" />
<property name="username" value="root" />
<property name="password" value="abc123" />
</dataSource>
</environment>
<environment id="MybatisDB">
<transactionManager type="MANAGED" />
<dataSource type="JNDI">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:13306/powernode" />
<property name="username" value="root" />
<property name="password" value="abc123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="CarMapper.xml"></mapper>
</mappers>
</configuration>
<?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>org.god.ibatis</groupId>
<artifactId>godbatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
<?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>org.god.ibatis</groupId>
<artifactId>godbatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
package org.god.ibatis.utils;
import java.io.InputStream;
public class Resources
{
//godBatis提供的资源工具类,完成类路径中资源的加载
private Resources(){}
//工具类的构造方法都是私有化的,因为方法都是静态的
//为了避免new对象,所以构造方法私有化
public static InputStream getResourceAsStream(String resource)
{
//从类路径下加载资源
//从类路径中获取资源作为一个输入流
return ClassLoader.getSystemClassLoader().getResourceAsStream(resource);
}
}
package org.god.ibatis.utils;
import java.io.InputStream;
public class Resources
{
//godBatis提供的资源工具类,完成类路径中资源的加载
private Resources(){}
//工具类的构造方法都是私有化的,因为方法都是静态的
//为了避免new对象,所以构造方法私有化
public static InputStream getResourceAsStream(String resource)
{
//从类路径下加载资源
//从类路径中获取资源作为一个输入流
return ClassLoader.getSystemClassLoader().getResourceAsStream(resource);
}
}
package org.god.ibatis.core;
public class Const
{
private Const(){}
//整个框架的常量类
public static final String UN_POOLED_DATASOURCE = "UNPOOLED";
public static final String POOLED_DATASOURCE = "POOLED";
public static final String JNDI_DATASOURCE = "JNDI";
public static final String JDBC_TRANSACTION = "JNDI";
public static final String MANAGED_TRANSACTION = "MANAGED";
}
package org.god.ibatis.core;
public class Const
{
private Const(){}
//整个框架的常量类
public static final String UN_POOLED_DATASOURCE = "UNPOOLED";
public static final String POOLED_DATASOURCE = "POOLED";
public static final String JNDI_DATASOURCE = "JNDI";
public static final String JDBC_TRANSACTION = "JNDI";
public static final String MANAGED_TRANSACTION = "MANAGED";
}
package org.god.ibatis.core;
import java.sql.Connection;
public interface Transaction
{
//事务管理器接口
//所有的事务管理都应该遵循此规范
//JDBC和MANAGED事务管理器都应该实现这个接口
//Transaction事务管理器通过事务方法
//提交事务,回滚事务,关闭事务
void openConnection();
//真正的开启数据库连接
void commit();
//获取数据库连接对象的方法
Connection getConnection();
void rollback();
void close();
}
package org.god.ibatis.core;
import java.sql.Connection;
public interface Transaction
{
//事务管理器接口
//所有的事务管理都应该遵循此规范
//JDBC和MANAGED事务管理器都应该实现这个接口
//Transaction事务管理器通过事务方法
//提交事务,回滚事务,关闭事务
void openConnection();
//真正的开启数据库连接
void commit();
//获取数据库连接对象的方法
Connection getConnection();
void rollback();
void close();
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JdbcTransaction implements Transaction
{
//Jdbc事务管理器
//godBatis只实现这个
//我们控制事务需要调用connection的方法实现
//需要调用连接对象的方法
//我们的连接对象是从数据源来的
//数据源属性必须要有,不然无法做事务的操作
private DataSource dataSource = null;
//数据源属性,是获取Connection对象的,所以这个数据源要实现DataSource
//我们只需要三个实现即可,POOLED,UNPOOLED,JNDI
public JdbcTransaction(DataSource dataSource, boolean autoCommit) {
//创建事务管理器对象
this.dataSource = dataSource;
this.autoCommit = autoCommit;
}
//将connection对外暴露,可以执行SQL语句,必须在同一个事务管理器下,是同一个连接
@Override
public Connection getConnection() {
return connection;
}
//因为openConnection已经创建对象了,就不会再生成新的连接,就能保证是同一个连接对象了
private Connection connection;
@Override
public void openConnection()
{
if (connection != null)
{
try
{
connection = dataSource.getConnection();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
}
private boolean autoCommit;
//自动提交的标记,
@Override
public void commit()
{
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void rollback()
{
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void close()
{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JdbcTransaction implements Transaction
{
//Jdbc事务管理器
//godBatis只实现这个
//我们控制事务需要调用connection的方法实现
//需要调用连接对象的方法
//我们的连接对象是从数据源来的
//数据源属性必须要有,不然无法做事务的操作
private DataSource dataSource = null;
//数据源属性,是获取Connection对象的,所以这个数据源要实现DataSource
//我们只需要三个实现即可,POOLED,UNPOOLED,JNDI
public JdbcTransaction(DataSource dataSource, boolean autoCommit) {
//创建事务管理器对象
this.dataSource = dataSource;
this.autoCommit = autoCommit;
}
//将connection对外暴露,可以执行SQL语句,必须在同一个事务管理器下,是同一个连接
@Override
public Connection getConnection() {
return connection;
}
//因为openConnection已经创建对象了,就不会再生成新的连接,就能保证是同一个连接对象了
private Connection connection;
@Override
public void openConnection()
{
if (connection != null)
{
try
{
connection = dataSource.getConnection();
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
}
private boolean autoCommit;
//自动提交的标记,
@Override
public void commit()
{
try {
connection.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void rollback()
{
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void close()
{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.sql.Connection;
public class ManagedTransaction implements Transaction
{
//godBatis对这个类就不实现了
private DataSource dataSource;
@Override
public void openConnection() {
}
@Override
public void commit() {
}
@Override
public Connection getConnection() {
return null;
}
@Override
public void rollback() {
}
@Override
public void close() {
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.sql.Connection;
public class ManagedTransaction implements Transaction
{
//godBatis对这个类就不实现了
private DataSource dataSource;
@Override
public void openConnection() {
}
@Override
public void commit() {
}
@Override
public Connection getConnection() {
return null;
}
@Override
public void rollback() {
}
@Override
public void close() {
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类UNPOOLED
//不使用连接池,每一次都新建Connection对象
public class UnPooledDataSource implements DataSource {
//数据库驱动,值从配置文件中来
private String url;
private String username;
private String password;
public UnPooledDataSource() {}
public UnPooledDataSource(String driver, String url, String username, String password) {
//直接注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
//创建一个数据源对象
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Connection getConnection() throws SQLException {
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类UNPOOLED
//不使用连接池,每一次都新建Connection对象
public class UnPooledDataSource implements DataSource {
//数据库驱动,值从配置文件中来
private String url;
private String username;
private String password;
public UnPooledDataSource() {}
public UnPooledDataSource(String driver, String url, String username, String password) {
//直接注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
//创建一个数据源对象
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Connection getConnection() throws SQLException {
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类JNDI
//使用第三方的数据库连接池获取Connection对象
public class JndiDataSource implements DataSource
{
@Override
public Connection getConnection() throws SQLException {
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类JNDI
//使用第三方的数据库连接池获取Connection对象
public class JndiDataSource implements DataSource
{
@Override
public Connection getConnection() throws SQLException {
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类POOLED
//使用GodBatis内置的数据库连接池获取对象
public class PooledDataSource implements DataSource {
@Override
public Connection getConnection() throws SQLException {
//从数据库连接池中获取connection对象
//需要自己写一个连接池(自己封装)
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import javax.sql.DataSource;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
//数据源的实现类POOLED
//使用GodBatis内置的数据库连接池获取对象
public class PooledDataSource implements DataSource {
@Override
public Connection getConnection() throws SQLException {
//从数据库连接池中获取connection对象
//需要自己写一个连接池(自己封装)
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
}
package org.god.ibatis.core;
import java.util.Map;
public class SqlSessionFactory
{
//一个数据库对应一个SqlSessionFactory对象
//通过这个对象可以开启会话,建立与数据库的连接
//一个SqlSessionFactory对象可以开启多个SqlSession会话
//所以这个事务管理器应该是一个接口,面向接口编程
protected SqlSessionFactory(){}
public SqlSessionFactory(Transaction transaction, Map<String, MappedStatement> mappedStatements) {
this.transaction = transaction;
this.mappedStatements = mappedStatements;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
public Map<String, MappedStatement> getMappedStatements() {
return mappedStatements;
}
public void setMappedStatements(Map<String, MappedStatement> mappedStatements) {
this.mappedStatements = mappedStatements;
}
//事务管理器属性
private Transaction transaction;
//存放sql对象的map集合,key是SqlId,Value是对应的SQL标签对象
private Map<String,MappedStatement> mappedStatements;
}
package org.god.ibatis.core;
import java.util.Map;
public class SqlSessionFactory
{
//一个数据库对应一个SqlSessionFactory对象
//通过这个对象可以开启会话,建立与数据库的连接
//一个SqlSessionFactory对象可以开启多个SqlSession会话
//所以这个事务管理器应该是一个接口,面向接口编程
protected SqlSessionFactory(){}
public SqlSessionFactory(Transaction transaction, Map<String, MappedStatement> mappedStatements) {
this.transaction = transaction;
this.mappedStatements = mappedStatements;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
public Map<String, MappedStatement> getMappedStatements() {
return mappedStatements;
}
public void setMappedStatements(Map<String, MappedStatement> mappedStatements) {
this.mappedStatements = mappedStatements;
}
//事务管理器属性
private Transaction transaction;
//存放sql对象的map集合,key是SqlId,Value是对应的SQL标签对象
private Map<String,MappedStatement> mappedStatements;
}