前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis源码解析2—— 实例搭建

Mybatis源码解析2—— 实例搭建

作者头像
IT可乐
发布2021-08-23 17:33:33
2150
发布2021-08-23 17:33:33
举报
文章被收录于专栏:IT可乐IT可乐

  大家好,我是可乐。

  上篇文章给大家撸了一遍用 JDBC 直接操作数据库的实例,还只是简单写了一个查询的接口,其代码量就已经很大了,并且可乐还给大家分析了直接使用 JDBC 带来的一些问题,总之是一种反人类的操作,为了让这种操作人类正常化,我们选择使用 ORM 框架。

  本篇文章给大家从头搭建一遍,如何基于 XML 配置,使用 Mybatis 进行增删改查操作。

  看到这,可能有读者就要问了,what?

  我现在使用 Springboot 多爽,还要这些复杂的配置干啥?

  可乐这里要说的是,Springboot 用起来是爽,它啥都给你封装好了,但是很多细节问题你可能并不知道,后续撸 Mybatis 的源码流程也是基于此,所以大家一定要过一遍 Mybatis 原始的执行方式。

  项目源码地址:https://github.com/YSOcean/mybatisproject

  这里可乐不会介绍各种配置含义,需要的可以直接参考官网,更加权威,你值得拥有:https://mybatis.org/mybatis-3/zh/configuration.html

1、创建库表

  以 Mysql 数据库为例,表比较简单,这里可乐就直接放图和建表语句了。

-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
  `pid` int NOT NULL AUTO_INCREMENT,
  `pname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `page` int DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
​
-- ----------------------------
-- Records of person
-- ----------------------------
BEGIN;
INSERT INTO `person` VALUES (1, 'itcoke', 11);
INSERT INTO `person` VALUES (2, 'IT可乐', 22);
COMMIT;

2、创建工程

  通过 IDEA 创建一个工程,并导入相应的jar包。

  以 maven 为例,配置 MySQL 和 Mybatis 即可。

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
​
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

  整个项目结构可以参考我的GitHub地址:https://github.com/YSOcean/mybatisproject

3、创建与表对应的实体类对象

 1 package com.itcoke.bean;
 2 ​
 3 public class Person {
 4 ​
 5     private Long pid;
 6 ​
 7     private String pname;
 8 ​
 9     private Integer page;
10 ​
11     public Long getPid() {
12         return pid;
13     }
14 ​
15     public void setPid(Long pid) {
16         this.pid = pid;
17     }
18 ​
19     public String getPname() {
20         return pname;
21     }
22 ​
23     public void setPname(String pname) {
24         this.pname = pname;
25     }
26 ​
27     public Integer getPage() {
28         return page;
29     }
30 ​
31     public void setPage(Integer page) {
32         this.page = page;
33     }
34 ​
35     @Override
36     public String toString() {
37         return "Person{" +
38                 "pid=" + pid +
39                 ", pname='" + pname + '\'' +
40                 ", page=" + page +
41                 '}';
42     }
43 }

4、编写数据库配置文件 mybatis-config.xml

关于配置文件的详细介绍,可以参考官网:https://mybatis.org/mybatis-3/zh/configuration.html

<?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>
​
    <!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境  -->
    <!-- 默认使用的环境 ID,名字随意,但是要匹配下面其中一个环境 ID -->
    <environments default="development">
        <!-- 环境ID -->
        <environment id="development">
            <!--事务管理器
                一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
                二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
                    比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
                    因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
                    <transactionManager type="MANAGED">
                        <property name="closeConnection" value="false"/>
                    </transactionManager>
              -->
            <transactionManager type="JDBC"/>
            <!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis-study"/>
                <property name="username" value="root"/>
                <property name="password" value="root1234"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

5、定义person表映射文件

官方权威地址:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

<?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="com.itcoke.mapper.PersonMapper">
​
​
    <!-- 根据 id 查询 person 表中的数据
       id:唯一标识符,此文件中的id值不能重复
       resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
       parameterType:参数类型,也就是查询条件的类型
    -->
    <select id="selectPersonById"
            resultType="com.itcoke.bean.Person" parameterType="java.lang.Long" >
        <!-- 这里和普通的sql 查询语句差不多,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着 -->
        select * from person where pid = #{pid}
    </select>
​
​
​
    <!-- 根据 id 更新 person 表的数据 -->
    <update id="updatePersonById" parameterType="com.itcoke.bean.Person">
        update person p
        <trim prefix="set" suffixOverrides=",">
            <if test="pname != null and pname != ''">
                p.pname = #{pname},
            </if>
            <if test="page != null and page != ''">
                p.page = #{page},
            </if>
        </trim>
​
        where pid=#{pid}
    </update>
​
​
    <!-- 向 person 表插入一条数据 -->
    <insert id="insertPerson" parameterType="com.itcoke.bean.Person">
        insert into person(pname,page)
        value(#{pname},#{page})
    </insert>
​
​
​
    <!-- 根据 id 删除 person 表的数据 -->
    <delete id="deletePersonById" parameterType="Long">
        delete from person where pid=#{pid}
    </delete>
​
</mapper>

6、向 mybatis-config.xml 中注册映射文件

<mappers>
    <!-- 注册PersonMapper.xml文件 -->
    <mapper resource="com/itcoke/mapper/PersonMapper.xml"/>
</mappers>

7、编写测试类

 1 package com.itcoke;
 2 ​
 3 ​
 4 import com.itcoke.bean.Person;
 5 import com.itcoke.mapper.PersonMapper;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.Before;
11 import org.junit.Test;
12 ​
13 import java.io.IOException;
14 import java.io.InputStream;
15 ​
16 public class MybatisprojectApplicationTests {
17     // 定义SqlSessionFactory
18     SqlSessionFactory sessionFactory = null;
19 ​
20     @Before
21     public void init() {
22         //定义mybatis全局配置文件
23         String resource = "mybatis-config.xml";
24         //加载 mybatis 全局配置文件
25         InputStream inputStream = null;
26         try {
27             inputStream = Resources.getResourceAsStream(resource);
28         } catch (IOException e) {
29             e.printStackTrace();
30         }
31         //构建sqlSession的工厂
32         sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
33 ​
34     }
35 ​
36     //根据id查询person表数据
37     @Test
38     public void testSelectPersonById() {
39         /*这个字符串由 PersonMapper.xml 文件中 两个部分构成
40             <mapper namespace="com.itcoke.mapper.PersonMapper"> 的 namespace 的值
41             <select id="selectPersonById" > id 值
42         */
43         String namespace = "com.itcoke.mapper.PersonMapper";
44         String method = "selectPersonById";
45         //根据 sqlSessionFactory 产生 session
46         SqlSession sqlSession = sessionFactory.openSession();
47         Person person = sqlSession.selectOne(namespace + "." + method, 1L);
48         System.out.println(person);
49         sqlSession.close();
50     }
51 ​
52 ​
53     //根据id更新person表数据
54     @Test
55     public void testUpdatePersonById() {
56         String statement = "com.itcoke.mapper.PersonMapper.updatePersonById";
57         Person p = new Person();
58         p.setPid(2L);
59         p.setPage(18);
60         //根据 sqlSessionFactory 产生 session
61         SqlSession sqlSession = sessionFactory.openSession();
62         sqlSession.update(statement, p);
63         sqlSession.commit();
64         sqlSession.close();
65     }
66 ​
67 ​
68     //向 person 表插入数据
69     @Test
70     public void testInsertPerson() {
71         String statement = "com.itcoke.mapper.PersonMapper.insertPerson";
72         Person p = new Person();
73         p.setPname("可乐");
74         p.setPage(18);
75         //根据 sqlSessionFactory 产生 session
76         SqlSession sqlSession = sessionFactory.openSession();
77         sqlSession.insert(statement, p);
78         sqlSession.commit();
79         sqlSession.close();
80     }
81 ​
82     //根据id更新person表数据
83     @Test
84     public void testDeletePersonById() {
85         String statement = "com.itcoke.mapper.PersonMapper.deletePersonById";
86         Person p = new Person();
87         p.setPid(4L);
88         //根据 sqlSessionFactory 产生 session
89         SqlSession sqlSession = sessionFactory.openSession();
90         sqlSession.delete(statement, p);
91         sqlSession.commit();
92         sqlSession.close();
93     }
94 }

9、通过接口

  在上面的例子中,我们发现 statement 每次都要自己书写拼接,很容易就写错了,这时候 MyBatis 提供了接口注册方式。

  ①、在 mapper 包下面新建一个 PersonMapper 接口

  注意要和 PersonMapper.xml 同名,且在同一个包下,因为要和 namespace 相同。

 1 package com.itcoke.mapper;
 2 ​
 3 import com.itcoke.bean.Person;
 4 ​
 5 ​
 6 public interface PersonMapper {
 7 ​
 8     Person selectPersonById(long pid);
 9 ​
10     void updatePersonById(Person person);
11 ​
12     void insertPerson(Person person);
13 ​
14     void deletePersonById(long pid);
15 }

  ②、测试

 1 //根据id查询person表数据
 2 //通过接口代理的方式
 3 @Test
 4 public void testInterfaceSelectPersonById() {
 5     //根据 sqlSessionFactory 产生 session
 6     SqlSession sqlSession = sessionFactory.openSession();
 7     PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
 8     Person person = mapper.selectPersonById(1L);
 9     System.out.println(person);
10     sqlSession.close();
11 }

8、小结

  至此,我们从头到尾撸了一遍利用 Mybatis 进行增删改查,后面便会深入底层,梳理架构。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、创建库表
  • 2、创建工程
  • 3、创建与表对应的实体类对象
  • 4、编写数据库配置文件 mybatis-config.xml
  • 5、定义person表映射文件
  • 6、向 mybatis-config.xml 中注册映射文件
  • 7、编写测试类
  • 9、通过接口
  • 8、小结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档