0%

MyBatis安装、配置

MyBatis安装、配置

1 简介

1.1 概述

  • MyBatis是一个半自动化的持久化层框架

1.2 为什么要使用MyBatis

  • 对于开发人员而言,核心SQL还是需要自己优化
  • SQL和Java编码分开,功能边界清晰,一个专注业务,一个专注数据

1.2.1 JDBC

  • SQL夹在Java代码块里,耦合度高导致硬编码内伤
  • 维护不易,且实际开发需求中SQL频繁修改的情况是多见的

1.2.2 Hibernate

  • 长难SQL对于Hibernate而言处理也不容易
  • 内部自动产生的SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量自动的POJO进行部分映射时比较困难,导致数据库性能下降

2 idea导入MyBatis

  • 使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>

“x.x.x”替换成对应的版本号

3 Hello world

3.1 创建MySQL数据表、添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
create table employees (
id int(11) primary key auto_increment,
last_name varchar(255),
gender char(1),
email varchar(255)
)

insert into employees (id, last_name, gender, email) values (1, "tom", 0, "136xxxx@qq.com")

select * from employees e
id|last_name|gender|email |
--+---------+------+--------------+
1|tom |0 |136xxxx@qq.com|

3.2 从 XML 中构建 SqlSessionFactory

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
42
43
44
45
46
47
48
package com.lnhoo;

public class Employee {
private Integer id;
private String lastName;
private char gender;
private String email;

public void setId(Integer id) {
this.id = id;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public void setGender(char gender) {
this.gender = gender;
}

public void setEmail(String email) {
this.email = email;
}

@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", gender=" + gender +
", email='" + email + '\'' +
'}';
}
}
// 测试类
public class MyBatisTest {
@Test
public void testMapper() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
Employee employee = (Employee) session.selectOne("com.lnhoo.EmployeeMapper.selectEmployee", 1);
System.out.println(employee);
}
}
}
  • 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

3.3 mybatis-config.xml

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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="******"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>
  • XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)

3.4 Mapper配置文件

1
2
3
4
5
6
7
8
9
<?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.lnhoo.EmployeeMapper">
<select id="selectEmployee" resultType="com.lnhoo.Employee">
select id id, last_name lastName, gender gender, email email from employees where id = #{id}
</select>
</mapper>
  • 在数据库表中的字段last_name对应于Employee类中的lastName属性,因为命名不一致,所以需要在SQL语句中将last_name字段起别名为lastName

3.5 接口式编程

3.5.1 定义接口

1
2
3
public interface EmployeeMapper {
Employee getEmployeeById(Integer id);
}
  • 在接口中定义方法的参数和返回值

3.5.2 定义Mapper

1
2
3
4
5
6
7
8
9
<?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.lnhoo.dao.EmployeeMapper">
<select id="getEmployeeById" resultType="com.lnhoo.Employee">
select id id, last_name lastName, gender gender, email email from employees where id = #{id}
</select>
</mapper>
  • 通过xml文件配置接口和SQL语句的绑定关系
  • mapper标签的namespace属性必须和Mapper接口的全路径一致
  • select标签的id属性必须和接口中定义的方法名一致,resultType属性填返回对象所属类的全路径

3.5.3 调用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyBatisTest {
@Test
public void testMapper() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
Employee employee = employeeMapper.getEmployeeById(1);
System.out.println(employee);
}
}
}
  • 将接口和xml配置文件绑定后,MyBatis会自动为接口创建动态代理对象,由代理对象去执行增删改查