PartⅠ Mybatis面向接口编程

*编写顺序:properties->mybatis-config.xml,mapper接口->对应的xml,mybatis-config.xml引入对应mapper映射的映射包文件*

简介

历史

  • Apache 的 开源项目 ibatis → 后成为 MyBatis。

特性

  • 定制化SQL:即可以自己手写SQL语句。
  • 支持存储过程
  • 支持高级映射:即POJO和数据库字段的映射方式可以自定义哦。
  • 封装了JDBC代码,和结果集的处理过程 → 不用手写JDBC代码和结果集处理的过程啦。

官方下载&文档

https://github.com/mybatis/mybatis-3

VS其他持久层框架

  • JDBC:

    对于已经打包部署的项目,需要重新编辑代码再打包部署,非常麻烦。

  • Hibernate 和 JPA

  • MyBatis

    xml 中编写SQL语句

快速开始(简单介绍各个部分)

开发环境

  • IDE:IDEA: 2022.2
  • 构建工具:maven 3.8.6
  • MySQL版本:MySQL8
  • MyBatis 版本:MyBatis 3.5.11

Maven

根据你自己项目的类型创建具体Maven项目即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--    Mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>

核心配置文件(最少配置)

习惯上命名:mybatis-config.xml,非强制。将来整合Spring的时候可以省略。 这里目的为了能运行即可,详细配置内容看后续。

作用:1. 配置链接数据库的环境 2. 配置MyBatis

放置位置:src/main/resources

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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>

<!--
配置链接数据库的环境
default : 选择那个环境有效
-->
<environments default="development">
<environment id="development">

<!-- 事务管理器 -->
<transactionManager type="JDBC"></transactionManager>

<!-- 数据源 即连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.23.128:3307/ssm?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf-8amp;autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

<!-- 引入 MyBatis 的映射文件 : 存放SQL语句 和 POJO的映射方式 -->
<mappers>
<mapper resource="mappers/UserMapper.xml"></mapper>
</mappers>
</configuration>

Mapper 接口

相当于DAO,但是不用创建实现类,MyBatis会创建代理类,并执行映射文件当中的SQL。

起名规则:POJO的名字 + Mapper

1
2
3
4
5
package com.atguigu.mybatis.mapper;

public interface UserMapper {
int insertUser();
}

映射文件

Mapper 接口当中的一个抽象方法 对应 映射文件当中的一个SQL语句。

起名规则:POJO名字 + Mapper.xml

放置位置:src/main/resources/UserMapper.xml

这里我们写一条固定的插入SQL,参数如何传递请请看后方比较详细的笔记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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">

<!-- namespace :对应的mapper接口 -->
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">
<!--
id : 对应接口的方法名称.
-->
<select id="insertUser">
INSERT INTO t_user VALUES (NULL, 'admin', '123456', 23, '男', '12345@qq.com');
</select>
</mapper>

测试功能

下方代码:从开始到创建 SqlSessionFactory 只用创建一次即可,因此可以单独封装即可。 openSession() 获得 SqlSession默认是不自动提交事务,因此需要自己手动提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.atguigu.mybatis.test;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.atguigu.mybatis.mapper.UserMapper;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisTest {
@Test
public void testInsert() throws IOException {
// 获取核心配置文件的输入流
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");

// 获取SqlSessionFactoryBuilder 对象 -> 工厂构建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

// 创建 SqlSession 工厂 -> 创建会话
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);

// 获取 会话 对象 -> MyBatis 提供的操作数据库的对象
SqlSession sqlSession = sqlSessionFactory.openSession();

// 获得Mapper接口的代理类 -> 操纵Mapper类执行数据库操作
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 执行SQL操作
Integer rows = userMapper.insertUser();
System.out.println("rows = " + rows);

// 提交事务 -> 事务是默认开启的
sqlSession.commit();

// 关闭资源
sqlSession.close();
}
}

log4j

日志级别:FATAL(致命)> ERROR(错误)>WARN(警告)INFO(信息)> DEBUG(调试) 从左到右打印的内容越来越详细.

1
2
3
4
5
6
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

resources/log4j.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5d %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>

<logger name="java.sql">
<level value="debug"/>
</logger>
<logger name="org.apache.ibatis" >
<level value="info"/>
</logger>

<!-- 默认配置,级别为debug 且根据name为log.console和 log.file两个appender输出-->
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>

核心配置文件详解

environments

可以配置多个环境,比如测试环境和开发环境 ; 使用id区分,不能重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   <environments default="development">

<environment id="development">

<!-- 事务管理器 -->
<transactionManager type="JDBC"></transactionManager>

<!-- 数据源 即连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.23.128:3306/ssm?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf-8amp;autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>

<environment id="test">

<!-- 事务管理器 -->
<transactionManager type="JDBC"></transactionManager>

<!-- 数据源 即连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.23.128:3306/ssm?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf-8amp;autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

transactionManager

事务管理器,使用type来设置事务管理方式。

  • type:

    JDBC:表示使用JDBC原生事务管理方式,即可以手动的开启关闭事务,手动的提交和回滚。

    MANAGED:被管理的,例如交给Spring管理。

DataSource

设置数据源,使用type 设置数据源的类型。

  • type

    POOLED:使用数据库连接池

    UNPOOLED:不使用数据库连接池,链接直接重新创建

    JNDI:表示使用上下文当中的数据源(了解下)

引入jdbc.properties

resources 下创建 jdbc.properties 文件

1
2
3
4
jdbc.url=jdbc:mysql://192.168.23.128:3306/ssm?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.user=root
jdbc.password=123456

核心配置文件当中引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>

<!-- 引入 properties 文件 -->
<properties resource="jdbc.properties"></properties>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

<mappers>
<mapper resource="mappers/UserMapper.xml"></mapper>
</mappers>
</configuration>

typeAliases

类型别名,在 Mapper 的 resultType 属性中可以使用简单类型别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>

<!-- 引入 properties 文件 -->
<properties resource="jdbc.properties"></properties>

<!-- 别名 -->
<typeAliases>
<typeAlias type="com.atguigu.mybatis.pojo.User" alias="user"></typeAlias>

<!-- 也可以指定一个包下面的别名, 且不区分大小写, 跟上方 typeLias 不能同时使用 -->
<package name="com.atguigu.mybatis.pojo"></package>
</typeAliases>

<!-- ... -->
</configuration>

在 Mapper.xml 文件中使用

1
2
3
<select id="getAllUser" resultType="user">
SELECT * FROM t_user;
</select>