0%

【Maven配置二】Web项目配置MyBatis框架并读取MySQL数据库

上一期中我们用intellij idea完成了Maven项目的配置,内嵌jetty插件构建服务器,并安装了jstl标签库。

我们知道可以使用jdbc对数据库进行增删改查,但是这样代码量很大,而且是硬编码,不够灵活多变,效率也不高。MyBatis为我们提供了更好的解决方案,让我们为Maven配置MyBatis框架。


提供数据库文件

我们来编写一个简单的数据表,表名为users,表中有idnameage三个列(此处的可视化软件是DataGrip):
在这里插入图片描述

配置xml文件

配置pom.xml

老规矩,要在Maven项目中使用jar,我们需要在pom.xml中引入依赖,我们为项目提供MyBatis框架和MySQL的连接:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>

配置mybatis-config.xml

接下来,在main/resources目录内(如果没有就创建一个)创建mybatis-config.xml.

前面的配置与jdbc很像,就是关于驱动、URL、用户名和密码的设置,而最后的<mappers>标签,则用于指定一个映射文件,我们可以把MySQL的代码写在mapper中,这样代码就可以反复调用,极大缩小工作量。

此处mapper路径直接指向UserMapper.xml,即对应的mapper文件就在mybatis-config.xml的同级目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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/hello_mysql?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>

配置mapper

根据mybatis-config<mapper>标签的配置,笔者同样在main/resources创建UserMapper.xml文件。

我在mapper中提供了两个方法,可以看到,方法写在<select>标签中:

  • selectUserById查询ID并返回对应的User
  • selectAllUser返回一个包含所有的User的列表。

介绍一下mapper中的参数:

  • namespace:命名空间,用于区分不同的mapper
  • id:相当于为<select>中方法提供别名,方便调用
  • parameterType:为<select>方法内的变量提供类型,MyBatis#{...}代替?,这里的Integer即指方法内的#{uid}是整数型
  • resultType:指定返回的类,需提供对应实体类的路径 (即便返回的是列表这里也提供列表的成员类型)
1
2
3
4
5
6
7
8
9
10
11
<?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="UserMapper">
<select id="selectUserById" parameterType="Integer" resultType="model.User">
select * from users where id=#{uid}
</select>
<select id="selectAllUser" resultType="model.User">
select * from users
</select>
</mapper>

提供实体类

可以注意到,mapper中提供的返回类型是model.User,这显然是一个路径,于是我们就需要在这个路径下提供一个实体类:

main/java/model内创建一个User类,指定数据库中对应的成员变量,并提供构造方法和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
package model;

public class User {
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

private int id;
private String name;
private int age;
}

这样,之前mapper文件中的resultType就可以找到对应的实体类了。


实现读取方法

我们有很多的读取方法,笔者在这里简单实现了一个Servlet来直接读取,在实际项目中,我们还是应该按照规范,通过Service层调用DAO层,再对数据库进行操作。

这是MyBatis的工作方法,先通过配置文件创建一个工厂,再用工厂得到结果:

1
2
3
4
5
6
7
graph LR
mybatis-config配置-->
mapper映像-->
SqlSessionFactoryBulider-->
SqlSessionFactory-->
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
42
43
44
package service;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import model.User;
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 javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//读取config配置文件
InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建一个SqlSessionFactory
SqlSessionFactory factory = builder.build(stream);
//得到一个SqlSession
SqlSession session = factory.openSession();

//通过SqlSession中的selectList方法返回一个User列表
List<User> userList = session.selectList("selectAllUser");
//请求转发,用于在主页显示数据表
req.setAttribute("userList", userList);
req.getRequestDispatcher(req.getContextPath() + "index.jsp").forward(req, resp);
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}

显示结果

此处不多介绍,因为与本文关系不大,简单的说就是提供了一个超链接跳转到servlet,再通过servlet为请求添加一个属性存放用户列表,最后使用jstlforEach标签显示出来:

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
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Hello Maven + SSM</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<h2>Hello World!</h2>
<a href=${pageContext.request.contextPath}"/sql">view by mybatis</a>
<c:if test="${!empty userList}">
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>

最后,我们就可以在主页得到结果啦:

在这里插入图片描述

附上目录表:

在这里插入图片描述