Mybatis源码分析系列之第一篇:回顾一下MyBatis的使用

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: Mybatis源码分析系列之第一篇:回顾一下MyBatis的使用


一:工具版本

MySQL驱动:5.1.48

MySQL:5

Mybatis:3.4.6

二:Mybatis开发回顾

1:Mybatis概念

Mybatis是一个半自动的ORM框架,解决的数据库的访问问题,是JDBC技术的封装

2:Mybatis搭建开发环境

1):引入依赖

<dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
     </dependency>
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.48</version>
     </dependency>

2):核心配置文件

准备核心配置文件都需要进行如下操作:

1. 数据源的设置 environments

2. 类型别名

3. mapper文件的注册

4. 编写Mapper文件

3):初始化配置

mybatis-config.xml

配置 environment

缩略版如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    </typeAliases>
    </plugins>
    </environments>
    </mappers>
</configuration>

详细版如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="com.baizhiedu.entity.User" alias="User"/>
        <typeAlias type="com.baizhiedu.entity.Account" alias="Account"/>
    </typeAliases>
    <plugins>
        <plugin interceptor="com.baizhiedu.plugins.LockInterceptor"/>
    </plugins>
    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"></property>
                <property name="username" value="root"></property>
                <property name="password" value="123456"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--<package name=""-->
        <mapper resource="UserDAOMapper.xml"/>
        <mapper resource="AccountDAOMapper.xml"/>
    </mappers>
</configuration>

4):开发步骤

  1. entity
  2. 类型别名
  3. table
  4. DAO接口
  5. Mapper文件
  6. Mapper文件的注册
  7. API编程
  8. 开发步骤 7步

三:一些细节说明

1:如何访问指定数据库

我们不指定的话,访问的就是默认数据库,指定databaseId就会访问指定数据源库

我们调用dao层中的方法执行对应的SQL语句的时候,到底会访问哪个数据库呢?这个是由决定的,我们把那个搞成默认的,他就访问的是哪个数据库。

<insert id="save" parameterType="Account" databaseId="default">
        insert into t_account (accountNo,balance) values(#{accountNo},#{balance})
    </insert>

如果在Mybatis当中涉及到多数据源

事务不好控制了。

XXXservice当中涉及到了ADAO.m1() 使用的default数据源,BDAO.m2中使用的是oRABLE数据源,怎么办

2:配置别名的作用

<typeAliases>
    <typeAlias type="com.baizhiedu.entity.User" alias="User"/>
    <typeAlias type="com.baizhiedu.entity.Account" alias="Account"/>
</typeAliases>

配置别名的作用就是在Mapper文件当中无需再写全限定名

3:Mapper.xml注册

<mappers>
        <!--<package name=""-->
        <mapper resource="UserDAOMapper.xml"/>
        <mapper resource="AccountDAOMapper.xml"/>
    </mappers>

4:API编写

@Test
    public void test1() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
        List<User> users = userDAO.queryAllUsersByPage();
        for (User user : users) {
            System.out.println("user = " + user);
        }
    }

或者像接下来这么写

@Test
    public void test2() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //namespace+id
        List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers");
                      /*   sqlSession.selectOne()
                           sqlSession.insert()
                           sqlSession.delete()
                           sqlSession.update()*/
       //这些方法是重载的,多个参数的是因为SQL当中需要传参。                
        for (User user : users) {
            System.out.println("user = " + user);
        }
    }

四:核心代码分析

核心代码实例:

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
两种方式功能等价 
实现效果 区别 
那种方式好?第一种方式好 表达概念更清晰 
第一种开发,本质上就是对第二种开发的封装。(代理设计模式)
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
List<User> users = userDAO.queryAllUsers();
List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers");
String name = "huxz";
public class User{
  private String name = "huxz";
}
Mybatis刚刚诞生的时候,对于数据库的操作都是第二种,没有第一种,在后续版本更迭的时候,
才有的第一种。第二种,本质上就是将第二种的实现方式进行了封装。通过代理设计模式进行封装的。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL Java 数据库连接
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
Mybatis源码分析系列之第三篇:Mybatis的操作类型对象
|
6月前
|
SQL XML Java
源码分析系列教程(08) - 手写MyBatis(注解版)
源码分析系列教程(08) - 手写MyBatis(注解版)
43 0
|
4月前
|
SQL Java 数据库连接
MyBatis源码篇:mybatis拦截器源码分析
MyBatis源码篇:mybatis拦截器源码分析
|
4月前
|
缓存 Java 数据库连接
|
4月前
|
SQL Java 数据库连接
|
5月前
|
设计模式 SQL Java
Mybatis源码分析系列之第四篇:Mybatis中代理设计模型源码详解
Mybatis源码分析系列之第四篇:Mybatis中代理设计模型源码详解
|
5月前
|
存储 SQL Java
Mybatis源码分析系列之第二篇:Mybatis的数据存储对象
Mybatis源码分析系列之第二篇:Mybatis的数据存储对象
|
9月前
|
Java 数据库连接 mybatis
mybatis采坑记及源码分析
问题描述 有些需求,需要把上一步批量操作返回的主键作为下个表的关联使用,这个时候用mybatis批量操作,mybatis批量操作有些版本不能返回主键,只能一个一个的插入,这样就降低了效率。 接口
44 0
|
10月前
|
SQL XML 缓存
Mybatis源码分析 2:解析XML并映射到Sql
# XMLStatementBuilder:对单个XNode节点进行解析,得到具体的SqlSource并以此生成MappedStatement ## parseStatementNode方法: ```JAVA private final MapperBuilderAssistant builderAssistant; // 记录了当前mapper的namespace等基础信息 private
88 0
Mybatis源码分析 2:解析XML并映射到Sql
|
10月前
|
SQL XML 缓存
mybatis源码分析
基于xml构建mybatis的源码分析