本笔记根据mybatis官方文档顺序学习,根据本笔记可快速掌握mybatis的使用。
1 快速开始
1.1 快速开始
1.1.1 安装
使用MyBatis之前必须要安装mybatis-x.x.x.jar驱动文件到类路径中,如果使用的是Maven工程,则只需要导入下面的依赖即可:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
1.1.2 从XML文件中构建SqlSessionFactory
每个MyBatis应用都需要围绕着SqlSessionFactory。一个SqlSessionFactory实例必须通过SqlSessionFactoryBuilder来创建。SqlSessionFactoryBuilder可以从XML配置文件中构建SqlSessionFactory实例,也可以从配置类中构建SqlSessionFactory实例。
从XML配置文件中构建SqlFactory实例非常简单。MyBatis包含一个工具类,叫做Resources,它包含许多方法,这些方法使从类路径和其他位置加载资源变得更简单。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
这个XML配置文件包含了MyBatis的核心配置,我们可以将它称作为MyBatis核心配置文件,这个核心配置包括获得数据库连接实例的数据源
(DataSource
),以及一个TransactionManager
,用于确定事务的范围和控制方式。这里有一个简单的示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<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>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
虽然XML配置文件中还有许多内容,上面这个示例指出了配置文件中最重要的部分。请注意验证XML文档所需的XML头。environment
元素的主体包含用于事务管理和连接池(Dtype标签
)的环境配置。mappers元素包含一个映射器列表——包含SQL代码和映射定义的XML文件和/或带注释的Java接口类。(即对应的mapper映射文件)
1.1.3 从SqlSessionFactory获取SqlSession
已经有了SqlSessionFactory,可以获取实例SqlSession。SqlSession包含了对数据库执行SQL命令所需的所有方法。可以直接针对SqlSession实例执行映射的SQL语句。例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
Account account = session.selectOne(
"com.xlb.mapper.AccountMapper.findById", 1);
}
虽然这种方法是有效的,并且对于MyBatis以前版本的用户来说很熟悉,但现在有了一种更清晰的方法。使用一个接口(例如BlogMapper.class)来正确地描述一个给定语句的参数和返回值,你现在可以执行更干净、更类型安全的代码,没有容易出错的字符串字面量和类型转换。例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
AccountMapper mapper = session.getMapper(AccountMapper.class);
Account account= mapper.findById(1);
}
注意:上面这两种方法都可以获取到数据库中的数据,2.1.4的第一种方法通过findById来获取数据,其中第一个参数是需要调用的具体方法的字符串路径,第二个参数是给该方法传入的参数。通过这种方法可以直接获得实体数据。第二种方法是先通过session实例获得一个实体类的映射接口,然后通过这个接口来访问数据库中的数据。上面两种获取SqlSession的方法只需要掌握第二种即可。
1.1.4 探索Mapper映射的SQL语句
MyBatis提供的全套功能可以通过使用基于XML的映射语言来实现,正是这种映射语言使MyBatis多年来非常流行。如果您以前使用过MyBatis,那么您将熟悉这个概念,但是对XML映射文档进行了许多改进,这些改进将在后面介绍。下面是一个满足上述SqlSession调用的基于XML的映射语句的例子。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xlb.mapper.AccountMapper">
<select id="findById" resultType="Account">
select * from tbl_account where id = #{id}
</select>
</mapper>
虽然对于这个简单的示例来说,这看起来开销很大,它实际上很轻。您可以在单个映射器XML文件中定义任意多的映射语句,这样就可以充分利用XML头和doctype声明. 文件的其余部分是不言自明的。它在名称空间中为映射语句“findById”定义了一个名称“com.xlb.mapper.AccountMapper”,允许你通过完整的限定名来调用该方法,正如我们在上面的例子中所做的那样:
Account account = session.findById(
"com.xlb.mapper.AccountMapper.findById", 1);
请注意,这与在完全限定的Java类上调用方法是多么相似,这是有原因的。该名称可以直接映射到与名称空间同名的Mapper类,并使用与名称、参数和返回类型匹配的方法作为映射的选择语句。这允许你非常简单地调用Mapper接口的方法,就像你在上面看到的那样,如下:
BlogMapper mapper = session.getMapper(AccountMapper.class);
Account account = mapper.findById(101);
第二种方法不依赖于字符串字面值,因此更安全。
2 搭建MyBatis项目测试
2.1 准备工作
准备一个数据库表:数据库叫mybatis,表叫tbl_account(数据库名和表明你随意叫)
# 创建数据库
create database mybatis;
# 创建数据库表
CREATE TABLE tbl_account(
id int primary key auto_increment,
name varchar(35),
money double
);
使用IDEA创建MyBatis项目
创建一个Maven项目
导入相关依赖
<?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>com.xlb</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
</dependencies>
</project>
创建数据库表对应的实体类
package com.xlb.domain;
public class Account {
private Integer id;
private String name;
private double money;
public Account(Integer id, String name, double money) {
this.id = id;
this.name = name;
this.money = money;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
创建连接数据库时具体连接的哪个数据库信息的文件
jdbc.driver=com.mysql.cj.jdbc.Driver //数据库驱动
jdbc.url=jdbc:mysql://localhost:3306/mybatis //你连接的数据库名称
jdbc.username=root //你连接的数据库的用户名
jdbc.password=****** //你的数据库的密码
注:这个文件不是必须的,你也可以直接将这些信息写在MyBatis的核心配置文件中,只是将这些敏感信息额外保存到一个文件一方面容易管理,另一方面更加安全。
创建MyBatis的核心配置文件
<?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>
<package name="com.xlb.domain"/>
</typeAliases>
<!--数据源-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--映射文件扫描包路径-->
<mappers>
<mapper resource="mappers/AccountMapper.xml" />
</mappers>
</configuration>
注意这个核心配置文件,你需要把上面package对应属性的路径改成自己的路径,mapper和properties标签对应的resource属性同样改成自己的路径。
创建mapper接口类
package com.xlb.mapper;
import com.xlb.domain.Account;
import java.util.List;
public interface AccountMapper {
//增删改查
void save(Account account);
void deleteById(Integer id);
void update(Account account);
Account findById(Integer id);
List<Account> findAll();
}
创建业务层接口
package com.xlb.service;
import com.xlb.domain.Account;
import java.util.List;
public interface AccountService {
//增删改查
void save(Account account);
void deleteById(Integer id);
void update(Account account);
Account findById(Integer id);
List<Account> findAll();
}
创建业务层实现
package com.xlb.service.impl;
import com.xlb.dao.AccountDao;
import com.xlb.domain.Account;
import com.xlb.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
public class AccountImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public void save(Account account) {
accountDao.save(account);
}
@Override
public void deleteById(Integer id) {accountDao.deleteById(id);
}
@Override
public void update(Account account) {
}
@Override
public Account findById(Integer id) {
return accountDao.findById(id);
}
@Override
public List<Account> findAll() {
return accountDao.findAll();
}
}
创建Mapper接口映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xlb.mapper.AccountMapper">
<select id="findById" resultType="Account">
select * from tbl_account where id = #{id}
</select>
</mapper>
2.2 测试
创建main方法测试
import com.xlb.dao.AccountDao;
import com.xlb.domain.Account;
import com.xlb.mapper.AccountMapper;
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 java.io.IOException;
import java.io.InputStream;
public class main {
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream in = Resources.getResourceAsStream("application.xml");
SqlSessionFactory sqlSessionFactory = builder.build(in);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
Account data = mapper.findById(1);
System.out.println(data);
}
}
注意:
- Mapper接口类的名字必须和Mapper映射文件的名字保持一致,例如本例中的Mapper接口叫做AccountMapper,本例中的Mapper映射文件叫做AccountMapper.xml
- MyBatis核心配置文件的名字没有固定要求,加载时指定你写的名字即可,一般可叫做mybatis-config.xml,application.xml等
- MyBatis的核心配置文件中设置扫描包路径时,如果使用的是resource标签,则需要使用目录对应的斜线
/
来指定目录层级,如果使用的是package属性,则需要使用.
来分开目录层级。