Mybatis——文件配置与实例构造

情景

数据库中有一个简单数据表,用于储存用户的账户以及登录密码

需要通过Mybatis对该数据表插入新数据

为了实现这目的,我们需要:

  • 文件配置
  • 写一点Java类

文件配置

文件配置涉及两个文件:

mybatis-config.xml:所有使用Mybatis的项目通用的配置文件,包含全局配置信息

UserMapper.xml:自定义映射器的配置文件

全局配置

首先配置mybatis-config.xml,该文件需要置于Maven项目文件的src/java/resources路径中。

mybatis-config.xml包含了Mybatis的所有的配置信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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>
<settings>
<!-- changes from the defaults for testing -->
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
</configuration>

配置数据库连接

在数据库之前,先连接数据库。Mybatis使用JDBC驱动连接MySQL,mybatis-config.xml的数据库连接信息填在环境配置中,环境配置的结构如下

  • environments(环境配置)
    • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)

按照下列模板填写数据库连接信息:

1
2
3
4
5
6
7
8
9
10
11
<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/XXX?serverTimezone=UTC"/>
<property name="username" value="XXX"/>
<property name="password" value="XXX"/>
</dataSource>
</environment>
</environments>

环境配置具体内容有点多,之后再详谈(逃

配置映射器

数据库连接配置完成,数据库连上了,如何操作数据库?

使用映射器,用映射器定义SQL映射,从而对数据库进行增删改查。

当然,在本例中只需要进行增——插入操作,所以我们需要建立一个映射器去实现插入操作,起名为UserMapper,UserMapper对应一个配置文件UserMapper.xml

在编写映射器之前,我们需要先在全局配置文件mybatis-config.xml中定位映射器配置文件,Mybatis提供<mappers>声明自定义映射器的配置文件位置。

在刚刚填写的数据库连接信息下插入声明UserMapper.xml文件位置的信息:

1
2
3
<mappers>
<mapper resource="mappers/UserMapper.xml" />
</mappers>

自定义映射器的配置文件与全局配置文件应在同一目录,本项目中UserMapper.xmlresources/mapper路径下。

映射器配置

我们最终执行的是一个简单的插入操作,所以我们需要在UserMapper.xml建立一个插入映射<insert>

1
2
3
4
<insert id="insertUser" parameterType="User">
INSERT INTO DBTEST(USER_NAME, PASS_WORD) VALUES (#{username},#{password})
<!-- 这里sql结尾不能加分号,否则报“ORA-00911”的错误 -->
</insert>

id需要和映射器中的方法名对应,所以后面在构造映射器时,我们需要在映射器中写一个名为insertUser的方法。

parameterType代表传入的参数类型,这里我们选择自定义类型User作为传入参数的类型。

usernamepassword都是User中的私有属性,代表插入的用户民与密码。

User的具体实现会在下一个部分说明。

写一点JAVA类

完成文件配置后,为了达到通过Java程序插入数据的目的,还得写一点Java类:

映射器:UserMapper

Java Bean:User

数据工厂:MyBatisUtil

构造映射器UserMapper

UserMapper是数据库映射接口,在UserMapper.xml声明了一个idinsertUser映射,因此我们需要在UserMapper中写一个与之对应的方法:

1
2
3
public interface UserMapper {
public void insertUser(User user);
}

编写Java Bean:User

通过User将欲插入的数据传给映射器UserMapper

User包含两个私有属性:

  • username
  • password

对应数据表中用户名与密码。

编写对应的getset方法:

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
public class User {
private String username;
private String password;

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;
}


public User(String username, String password) {
super();
this.username = username;
this.password = password;
}

public User() {
super();
}

}

数据工厂MyBatisUtil

有了映射器,传递数据的Java Bean,Mybatis还需要实例化一个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
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

public class MyBatisUtil {
private final static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
System.out.println(e.getMessage());

}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}

public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}

SqlSessionFactoryBuilder 会根据我们之前配置的配置文件构造一个SqlSessionFactory,所以我们不需要重复构造SqlSessionFactory,只用通过数据工厂MyBatisUtil传入我们需要调用的映射器,就可以获得SqlSessionFactory返回对应的SqlSession,从而对数据库进行操纵。

很麻烦对吗,是的很麻烦。

这么做当然是值得的,我们成功降低了耦合!!!

OK,到这里我们已经完成所有准备工作,芜湖!接下来只需要编写一个测试程序来进行插入操作!

实践

在搞事之前,先在测试类中声明一个数据工厂sqlSessionFactory

1
2
3
4
static SqlSessionFactory sqlSessionFactory = null;
static {
sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
}

编写一个testAdd方法用以插入数据:

1
2
3
4
5
6
7
8
9
10
11
public static void testAdd() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // (1)
User user = new User("mybatis","114514"); // (2)
userMapper.insertUser(user); // (3)
sqlSession.commit(); // (4)
} finally {
sqlSession.close(); // (5)
}
}

(1)映射器UserMappersqlSessionFactory获取了对应的SqlSession

(2)实例化一个User对象user,user包含了需要插入到数据表的用户名与密码(“mybatis”,”114514”);

(3)映射器UserMapper调用对应<insert id="insertUser">insertUser方法,传入user对象;

(4)SqlSession向数据库提交刚刚的插入操作;

(5)关闭SqlSession与数据库的连接.

大功告成,数据库那一头不出意外应该可以看到新插入的数据。