目录
1、基础回顾
2、例子引入
3、映射文件
4、增删改查
4.1、add
4.2、delete
4.3、update
4.4、check
5、核心配置文件
5.1、properties
5.2、typeAliases
5.2.1、自定义
5.2.2、⭐MyBatis自带
5.3、environments
5.3.1、environment
5.3.2、transactionManager
5.3.3、dataSource
5.4、 mapper
6、API
6.1、SqlSessionFactoryBuilder
6.2、SqlSessionFactory
6.3、SqlSession
1、基础回顾
MyBatis基础:Java Web - MyBatis
下面用几张图片简单回顾:
原始的JDBC查询操作:
原始的JDBC插入操作:
2、例子引入
对于MyBatis的具体操作,这里以一个小的例子进行快速上手操作:
下面准备环境:
①创建Maven Model,在pom.xml引入坐标
pom.xml:
最重要的便是mybatis和mysql坐标:
总的pom文件如下:
<?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</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
<scope>runtime</scope>
</dependency>
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--日志坐标-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
②初始化数据库
SQL语句:
CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE user(
id INT(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50),
PRIMARY KEY(id)
);
DESCRIBE user;
③编写User实体类
package com.xzl.domain;
/**
* @author 逐梦苍穹
* @date 2023/8/23 17:44
*/
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
④编写核心配置文件mybatis-config.xml
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--通过properties标签加载外部properties文件-->
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xzl/domain/mapper/UserMapper.xml"/>
</mappers>
</configuration>
⑤编写SQL映射文件UserMapper.xml(后面这部分代码还会有变动,这里先保持不变)
⑥测试
这里为了方便测试,还需要一个log4j日志框架(也可以使用Logback):
log4j.properties:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
MyBatisTest:
/**
* @author 逐梦苍穹
* @date 2023/8/23 23:21
*/
public class MyBatisTest {
@Test
public void findAll_test1() throws IOException {
//加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获得sqlSession工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得sqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
List<User> userList = sqlSession.selectList("userMapper.findAll");
//打印结果
System.out.println(userList);
//释放资源
sqlSession.close();
}
}
测试结果:
3、映射文件
4、增删改查
涉及修改数据库内容的操作一定要手动提交事务!!mybatis默认不提交事务
基本流程:
加载核心配置文件
获得sqlSession工厂对象
获得sqlSession对象
执行sql语句
(提交事务)
释放资源
对前三步进行抽取:
4.1、add
Java代码:
映射文件:
这里涉及到一个主键自增的问题,没有办法封装对象,则采用先执行再封装的方式,例子如下:
注意事项:
- 插入语句使用insert标签
- 在映射文件中使用parameterType属性指定要插入的数据类型
- Sql语句中使用#{实体属性名}方式引用实体中的属性值
- 插入操作使用的API是sqlSession.insert("命名空间.id",实体对象);
- 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()
4.2、delete
Java代码:
映射文件:
注意事项:
- 删除语句使用delete标签
- Sql语句中使用#{任意字符串}方式引用传递的单个参数
- 删除操作使用的API是sqlSession.delete("命名空间.id",Object);
4.3、update
Java代码:
映射文件:
注意事项:
- 修改语句使用update标签
- 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);
4.4、check
5、核心配置文件
配置项 | 描述 |
configuration | 根元素,包含整个配置的主要部分 |
properties | 定义属性值,然后在配置中引用 |
settings | 配置 MyBatis 的全局设置 |
typeAliases | 定义 Java 类型的别名 |
typeHandlers | 配置自定义的类型处理器 |
objectFactory | 指定对象工厂的类名 |
plugins | 配置自定义的插件 |
environments | 配置不同的数据库环境 |
environment | 在 environments内部,定义具体的数据库环境 |
transactionManager | 指定事务管理器的类型 |
dataSource | 配置数据库连接的数据源 |
databaseIdProvider | 配置不同数据库的 SQL 语句和语法 |
mappers | 指定映射器(Mapper)的位置 |
5.1、properties
实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件
5.2、typeAliases
5.2.1、自定义
类型别名是为Java 类型设置一个名字,用于简化代码量。
原来:
在mybatis-config.xml设置别名:
设置别名后:
5.2.2、⭐MyBatis自带
上面是自定义的别名,mybatis框架已经为设置好一些常用的类型的别名:
别名 | 对应的Java类型 |
string | java.lang.String |
byte | java.lang.Byte |
long | java.lang.Long |
short | java.lang.Short |
int | java.lang.Integer |
integer | java.lang.Integer |
double | java.lang.Double |
float | java.lang.Float |
boolean | java.lang.Boolean |
char | java.lang.Character |
character | java.lang.Character |
date | java.util.Date |
decimal | java.math.BigDecimal |
bigdecimal | java.math.BigDecimal |
biginteger | java.math.BigInteger |
object | java.lang.Object |
list | java.util.List |
arraylist | java.util.ArrayList |
map | java.util.Map |
hashmap | java.util.HashMap |
5.3、environments
配置不同的数据库环境(如开发、测试、生产)
5.3.1、environment
支持多环境配置:
5.3.2、transactionManager
事务管理器(transactionManager)类型有两种:
①JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
②MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为false 来阻止它默认的关闭行为。
5.3.3、dataSource
数据源(dataSource)类型有三种:
①UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
②POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
③JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
5.4、 mapper
该标签的作用是加载映射的,加载方式有如下几种:
①使用相对于类路径的资源引用,例如:
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
②使用完全限定资源定位符(URL),例如:
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
③使用映射器接口实现类的完全限定类名,例如:
<mapper class="org.mybatis.builder.AuthorMapper"/>
④将包内的映射器接口实现全部注册为映射器,例如:
<package name="org.mybatis.builder"/>
6、API
6.1、SqlSessionFactoryBuilder
SqlSessionFactory build(InputStream inputStream) 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。
Resources 类帮助开发者从类路径下、文件系统或 一个 web URL 中加载资源文件。
6.2、SqlSessionFactory
SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:
方法 | 解释 |
openSession() | 会默认开启一个事务,但事务不会自动提交, 也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中 |
openSession(boolean autoCommit) | 参数为是否自动提交,如果设置为true, 那么不需要手动提交事务 |
6.3、SqlSession
SqlSession 实例在 MyBatis 中是非常强大的一个类。
在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
执行语句的方法主要有:
操作事务的方法主要有: