当前位置: 代码迷 >> 综合 >> Re:从零开始的Mybatis快速入门(图文并茂)
  详细解决方案

Re:从零开始的Mybatis快速入门(图文并茂)

热度:25   发布时间:2024-03-06 12:00:43.0

文章目录

  • Re:从零开始的Mybatis快速入门(图文并茂)
    • 一、创建项目
      • 1. New Project
      • 2. 导入依赖
      • 3. 项目结构
      • 4. 创建实体类
        • 1)安装 lombok插件
        • 2)导入Lombok依赖
        • 3)创建实体类
      • 5. 创建sql表
      • 6. 创建Mapper
        • 1)创建接口
        • 2)创建xml
        • 3)修改sqlMapConfig
      • 6.配置数据源
        • 1)导入依赖
        • 2)修改sqlMapConfig
      • 7.运行项目
    • 二、配置文件SqlMapConfig.xml
      • 1.properties
        • 1)指定properties属性
        • 2)加载资源属性文件
      • 2.settings
      • 3.typeAliases(类型别名)
      • 4.plugins(插件)
        • 1)插件介绍
        • 2)插件原理
        • 3)自定义插件
        • 4)pageHelper分页插件
      • 5.mapper(映射器)
        • 1)引入xml
        • 2)引入接口
    • 三、使用代理开发
      • 1.传统开发方式
      • 2.代理方式
    • 项目地址

Re:从零开始的Mybatis快速入门(图文并茂)

一、创建项目

1. New Project

在这里插入图片描述

项目名称和位置
在这里插入图片描述

2. 导入依赖

<?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.example</groupId><artifactId>mybatis-demo</artifactId><version>1.0-SNAPSHOT</version><!-- 设置jdk为1.8 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.encoding>UTF-8</maven.compiler.encoding><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency></dependencies></project>

3. 项目结构

|-- src|-- main|   |-- java|   |   |-- com|   |       |-- example|   |           |-- entity|   |           |   |-- People.java|   |           |-- mapper|   |           |   |-- PeopleMapper.java|   |           |-- test|   |           |   |-- PeopleTest.java|   |-- resources|       |-- mapper|       |   |-- PeopleMapper.xml|       |-- sqlMapConfig.xml|-- test|-- java

在这里插入图片描述

4. 创建实体类

1)安装 lombok插件

![](https://img-blog.csdnimg.cn/img_convert/ed1a761b07647b3f0992294fb0cdfbcc.png#align=left&display=inline&height=460&margin=[object Object]&originHeight=920&originWidth=1291&size=0&status=done&style=none&width=646)

2)导入Lombok依赖

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope>
</dependency>

3)创建实体类

@Data
@NoArgsConstructor
public class People {
    private Integer id;private String name;private LocalDateTime createTime;
}

5. 创建sql表

CREATE TABLE `mydb`.`people`  (`id` int(11) UNIQUE AUTO_INCREMENT,`name` varchar(255) NULL,`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在这里插入图片描述

6. 创建Mapper

1)创建接口

package com.example.mapper;import com.example.entity.People;
import java.util.List;public interface PeopleMapper {
    List<People> findAll();}

2)创建xml

<?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.example.mapper.PeopleMapper"><resultMap id="BaseResultMap" type="com.example.entity.People"><id column="id" jdbcType="INTEGER" property="id" /><result column="name" jdbcType="VARCHAR" property="name" /><result column="create_time" jdbcType="TIMESTAMP" property="createTime" /></resultMap><sql id="Base_Column_List">id, `name`, create_time</sql><select id="findAll" resultMap="BaseResultMap">select <include refid="Base_Column_List"/> from people</select></mapper>

3)修改sqlMapConfig

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--加载sql映射文件--><mappers>       <mapper resource="mapper/PeopleMapper.xml"/></mappers></configuration>

6.配置数据源

1)导入依赖

注意数据库版本

--MySQL8.x--驱动:com.mysql.cj.jdbc.Driver--url:"jdbc:mysql://localhost:3306/database_name?characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true"--MySQL5.x--驱动:com.mysql.jdbc.Driver--url:"jdbc:mysql://localhost:3306/database_name"

选择对应版本的依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version>
</dependency>

2)修改sqlMapConfig

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--配置程序的运行环境,可以1到多个--><environments default="development"><environment id="development"><!--配置事务管理器来支持事务的处理,默认jdbc事务处理--><transactionManager type="JDBC"/><!--配置数据源连接池--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;allowMultiQueries=true&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--加载sql映射文件--><mappers>        <mapper resource="mapper/PeopleMapper.xml"/></mappers></configuration>

7.运行项目

public class PeopleTest {
    @Testpublic void findAll() throws IOException {
    //加载核心文件InputStream resourceAsSteam = Resources.getResourceAsStream("sqlMapConfig.xml");//创建sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsSteam);//创建sqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//调用接口:第一个参数为方法的完全限定名{位置信息+映射文件当中的id}List<People> list = sqlSession.selectList("com.example.mapper.PeopleMapper.findAll");list.stream().forEach(System.out::println);}}

在这里插入图片描述

二、配置文件SqlMapConfig.xml

SqlMapConfig.xml中配置的内容和顺序如下:

  • properties 属性
  • settings 设置
  • typeAliases 类别名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境
    • environment 环境变量
      • transactionManager 事务管理器
      • dataSource 数据源
  • databaseIdprovider 数据库厂商标识
  • mappers 映射器

1.properties

1)指定properties属性

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;allowMultiQueries=true&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></properties><!--配置程序的运行环境,可以1到多个--><environments default="development"><environment id="development"><!--配置事务管理器来支持事务的处理,默认jdbc事务处理--><transactionManager type="JDBC"/><!--配置数据源连接池--><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--加载sql映射文件--><mappers><mapper resource="mapper/PeopleMapper.xml"/></mappers></configuration>

2)加载资源属性文件

resource 下创建 jdbcConfig.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false
username=root
password=123456

加载 jdbcConfig.properties

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="jdbcConfig.properties"/><!--配置程序的运行环境,可以1到多个--><environments default="development"><environment id="development"><!--配置事务管理器来支持事务的处理,默认jdbc事务处理--><transactionManager type="JDBC"/><!--配置数据源连接池--><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><!--加载sql映射文件--><mappers><mapper resource="mapper/PeopleMapper.xml"/></mappers></configuration>

2.settings

<settings><!--开启驼峰命名规则--><setting name="mapUnderscoreToCamelCase" value="true"/><!--开启全局延迟加载功能--><setting name="lazyLoadingEnabled" value="true"/>
</settings>

3.typeAliases(类型别名)

别名使用的时候 与大小写无关

<typeAliases><!--单个别名定义--><typeAlias type="com.example.entity.People" alias="people"/><!--批量别名定义--><package name="com.example.entity"/>
</typeAliases>

4.plugins(插件)

一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。
这样的好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作。以MyBatis为例,我们可基于MyBati s插件机制实现分页、分表,监控等功能。由于插件和业务 无关,业务也无法感知插件的存在。因此可以无感植入插件,在无形中增强功能。

1)插件介绍

Mybati s作为一个应用广泛的优秀的ORM开源框架,这个框架具有强大的灵活性,在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插 件扩展机制。Mybatis对持久层的操作就是借助于四大核心对象。MyBatis支持用插件对四大核心对象进 行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的 动态代理实现的,换句话说,MyBatis中的四大对象都是代理对象。

默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • 执行器 Executor (update、query、commit、rollback等方法);
  • SQL语法构建器 StatementHandler (prepare、parameterize、batch、updates query等方法);
  • 参数处理器 ParameterHandler (getParameterObject、setParameters方法);
  • 结果集处理器 ResultSetHandler (handleResultSets、handleOutputParameters等方法);

2)插件原理

在四大对象创建的时候:

  • 每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll(parameterHandler);
  • 获取到所有的Interceptor (拦截器)(插件需要实现的接口);调用 interceptor.plugin(target); 返回 target 包装后的对象;
  • 插件机制,我们可以使用插件为目标对象创建一个代理对象;AOP (面向切面)我们的插件可以为四大对象创建出代理对象,代理对象就可以拦截到四大对象的每一个执行;**

3)自定义插件

Mybatis 插件接口-Interceptor

  • intercept() 插件的核心方法
  • plugin() 生成target的代理对象
  • setProperties() 传递插件所需参数
@Intercepts({
     //注意看这个大花括号,也就这说这里可以定义多个@Signature对多个地方拦截,都用这个拦截器@Signature(type= StatementHandler.class,  //这是指拦截哪个接口method = "prepare",  //这个接口内的哪个方法名,不要拼错了args = {
    Connection.class, Integer .class}),  // 这是拦截的方法的入参,按顺序写到这,不要多也不要少,如果方法重载,可是要通过方法名和入参来确定唯一的})
public class MyPlugin implements Interceptor {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());  //这里是每次执行操作的时候,都会进行这个拦截器的方法内//此方法时拦截后要执行的方法@Overridepublic Object intercept(Invocation invocation) throws Throwable {
    System.out.println("此方法被拦截了"+ invocation.getClass());return invocation.proceed();//执行原方法}/** * 主要是为了把这个拦截器生成一个代理放到拦截器链中 * Description包装目标对象 为目标对象创建代理对象 * @Param target为要拦截的对象 * @Return代理对象 */@Overridepublic Object plugin(Object target) {
    Object wrap = Plugin.wrap(target, this);System.out.println("此方法拦截了"+wrap.getClass());return wrap;}@Overridepublic void setProperties(Properties properties) {
    //读取配置文件中传过来的属性System.out.println("插件配置的初始化参数:"+properties);}
}

放入到sqlMapConfig里

<plugins><plugin interceptor="com.example.interceptor.MyPlugin"><property name="name" value="victor"/><!--插件的属性--></plugin>
</plugins>

4)pageHelper分页插件

https://github.com/pagehelper/Mybatis-PageHelper

MyBati s可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。

开发步骤:
① 导入通用PageHelper的依赖
② 在mybatis核心配置文件中配置PageHelper插件
③ 测试分页数据获取

<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
</dependency>
 <!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"><!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --><property name="reasonable" value="true"/>
</plugin>
    @Testpublic void findAll() throws IOException {
    InputStream resourceAsSteam = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsSteam);SqlSession sqlSession = sqlSessionFactory.openSession();PageHelper.startPage(1, 2, "id");  //第1页,每页显示2条记录,按id排序List<People> list = sqlSession.selectList("com.example.mapper.PeopleMapper.findAll");PageInfo pageInfo = new PageInfo<>(list);list.stream().forEach(System.out::println);System.out.println("总页数" + pageInfo.getPages());System.out.println("总记录数" + pageInfo.getTotal());System.out.println("当前页" + pageInfo.getPageNum());System.out.println("当前页显示的记录数" + pageInfo.getPageSize());System.out.println("上一页" + pageInfo.getPrePage());System.out.println("下一页" + pageInfo.getNextPage());}

5.mapper(映射器)

1)引入xml

<mappers><!--加载单个映射文件--><mapper resource="mapper/PeopleMapper.xml"/>
</mappers>

2)引入接口

<mappers><!--以下两种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。--><mapper class="com.example.mapper.PeopleMapper"/><!--引入单个接口--><package name="com.example.mapper.PeopleMapper"/><!--引入包下的所有接口-->
</mappers>

三、使用代理开发

1.传统开发方式

编写 PeopleDao 接口

public interface PeopleDao {
    List<People> findAll();
}

编写 PeopleDaoImpl 实现类

public class UserDaoImpl implements PeopleDao {
     public List<People> findAll() throws IOException {
     InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<People> list = sqlSession.selectList("peopleMapper.findAll"); sqlSession.close(); return list; } 
}

编写 service 类

public List<People> findAll() throws IOException {
     PeopleDao peopleDao = new PeopleDaoImpl(); List<People> list = peopleDao.findAll(); System.out.println(list); 
}

2.代理方式

采用 Mybatis 的代理开发方式实现 DAO 层的开发,这种方式是我们后面进入企业的主流。
Mapper 接口开发方法只需要程序员编写Mapper 接口(相当于Dao 接口),由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper 接口开发需要遵循以下规范:
1) Mapper.xml文件中的namespace与mapper接口的全限定名相同
2) Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3) Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
4) Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
**

public interface PeopleMapper {
    People findById(int id);
}
<mapper namespace="com.example.mapper.PeopleMapper"><select id="findById" parameterType="int" resultType="com.example.entity.People" >sleect id,name,create_timefrom mydb.peoplewhere id = #{id}</select></mapper>

测试方式

    @Testpublic void findAll3() throws IOException {
    //使用动态代理开发InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); PeopleMapper peopleMapper = sqlSession.getMapper(PeopleMapper.class);People people= peopleMapper.findById(1);System.out.println(people);}
People(id=1, name=赵云, createTime=2020-08-05T12:53:39)

项目地址

https://gitee.com/yudonz/mybatis-demo.git

  相关解决方案