# mybatis-test **Repository Path**: LSZYAB/mybatis-test ## Basic Information - **Project Name**: mybatis-test - **Description**: mybatis源码测试案例 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-05-14 - **Last Updated**: 2024-01-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Getting Started - 官方文档[地址](https://mybatis.org/mybatis-3/zh/index.html) - 博客大牛[地址](https://www.cnblogs.com/zhjh256/p/8512392.html) ## 操作数据库主要步骤: 1. 注册数据库驱动,明确指定数据库账户、密码、连接库等信息 2. 通过驱动管理类 DriverManager 打开数据库连接会话通道 3. 数据库连接创建 Statement 对象 3. Statement 对象 执行sql语句,得到结果集对象ResultSet 4. 读取ResultSet对象信息,将信息转换到JavaBean中 5. 关闭流信息 ## 源码分析 - 在源码中也有大量的注释; - 图解如下 ![源码图](README.assets/Mybatis源码解读.png) ## 主要模块 - 树状图 ```shell script |-- annotations ## 注解模块 |-- binding ## 绑定模块(例如:1个mapper接口对应1个xml文件) |-- builder ## 构建配置中心模块 | |-- annotation | `-- xml |-- cache ## 缓存模块 | |-- decorators | `-- impl |-- cursor ## 游标模块 | `-- defaults |-- datasource ## 数据源模块(3种方式) | |-- jndi # 1.java naming and directory interface - java命令和目录接口 | |-- pooled # 2.连接池 | `-- unpooled # 3.非连接池 |-- exceptions ## 异常模块 |-- executor ## sql执行模块 | |-- keygen | |-- loader | |-- parameter | |-- result | |-- resultset | `-- statement |-- io ## 查找路径下的资源(虚拟文件系统(VFS:Virtual File System)) |-- jdbc ## |-- lang ## |-- logging ## 日志模块 | |-- commons | |-- jdbc | |-- jdk14 | |-- log4j | |-- log4j2 | |-- nologging | |-- slf4j | `-- stdout |-- mapping ## 参数返回值映射模块 |-- parsing ## 解析模块 |-- plugin ## 插件模块 |-- reflection ## 反射模块 | |-- factory | |-- invoker | |-- property | `-- wrapper |-- scripting ## sql编写脚本 | |-- defaults | `-- xmltags |-- session ## 会话管理模块 | `-- defaults |-- transaction ## 事务管理模块 | |-- jdbc | `-- managed `-- type ## 类型转换模块 ``` - 图展: ![image-20200604170013657](README.assets/image-20200604170013657.png) ## 案例分析: - 连接数据库的几种方式: ```java import com.lsz.mybatis.dao.TestMapper; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.junit.Test; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Map; /** * mybatis测试案例 *

* 官方文档: *

* @author lu shun zhi * @date 2020/5/29 17:22 */ public class TestMapperTest { /** * 方式一:从 XML 中构建 SqlSessionFactory */ @Test public void testXmlConfig() throws IOException { // mybatis 提供的方法,将文件读取到输入流中 InputStream input = Resources.getResourceAsStream("mybatis-config.xml"); // 将文件流信息传递给数据库会话工厂 SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sessionFactory = factoryBuilder.build(input); // 打开会话工厂 SqlSession sqlSession = sessionFactory.openSession(); TestMapper mapper = sqlSession.getMapper(TestMapper.class); Map student = mapper.userList(); System.out.println("student = " + student); } /** * 方式二:不使用 XML 构建 SqlSessionFactory * 1.mybatis类获得数据库驱动、用户名、密码等信息 * 2.根据驱动加载数据库包信息 * 3.建立连接,实现与 mysql数据库的会话 */ @Test public void testBeanConfig() { // 从javax.sql.DataSource接口实现类(org.apache.ibatis.datasource.unpooled.UnpooledDataSource)配置数据库连接信息 DataSource dataSource = new UnpooledDataSource("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test", "root","123456"); // 事务管理工厂类 TransactionFactory transactionFactory = new JdbcTransactionFactory(); // 环境配置类 Environment environment = new Environment("development", transactionFactory, dataSource); // 配置类 Configuration configuration = new Configuration(environment); configuration.addMapper(TestMapper.class); // 会话工厂,开启连接数据库会话 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration); SqlSession sqlSession = sessionFactory.openSession(); TestMapper mapper = sqlSession.getMapper(TestMapper.class); Map student = mapper.userList(); System.out.println("student = " + student); } /** * 方式三:使用java api下的sql包访问数据库 */ @Test public void testJavaApiConfig() { String JDBC_DRIVER = "com.mysql.jdbc.Driver"; String DB_URL = "jdbc:mysql://localhost:3306/test"; String USER = "root"; String PASS = "123456"; Connection conn = null; Statement stmt = null; try { // 注册 JDBC 驱动(Class.forName()反射初始加载jdbc驱动类) Class.forName(JDBC_DRIVER); // 打开链接 System.out.println("连接数据库..."); conn = DriverManager.getConnection(DB_URL, USER, PASS); // 执行查询 System.out.println("实例化Statement对象..."); stmt = conn.createStatement(); String sql; sql = "select * from sys_user"; ResultSet rs = stmt.executeQuery(sql); // 展开结果集数据库 while (rs.next()) { // 通过字段检索 int id = rs.getInt("id"); String name = rs.getString("user_name"); String url = rs.getString("password"); // 输出数据 System.out.print("ID: " + id); System.out.print(", 名字: " + name); System.out.print(", 密码: " + url); System.out.print("\n"); } // 完成后关闭 rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // 处理 JDBC 错误 se.printStackTrace(); } catch (Exception e) { // 处理 Class.forName 错误 e.printStackTrace(); } finally { // 关闭资源 try { if (stmt != null) stmt.close(); } catch (SQLException ignored) { // 什么都不做 } try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } } System.out.println("Goodbye!"); } } ``` ### 数据库连接方式1: - 代码 ```java public class TestMapperTest { @Test public void testXmlConfig() throws IOException { // mybatis 提供的方法,将文件读取到输入流中 InputStream input = Resources.getResourceAsStream("mybatis-config.xml"); // 将文件流信息传递给数据库会话工厂 SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sessionFactory = factoryBuilder.build(input); // 打开会话工厂 SqlSession sqlSession = sessionFactory.openSession(); TestMapper mapper = sqlSession.getMapper(TestMapper.class); Map student = mapper.userList(); System.out.println("student = " + student); } } ``` - 配置文件解析,mapper文件解析,sql组装 - 图片流程 ![sql组装](README.assets/sql语句组装.png) - sql组装测试案例[点击跳转](src/test/java/TestSqlNode.java)