读取和解析配置文件
MyBatisUtil.java
package cn.qdsoft.util;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory factory;
static {
try {
Reader reader = Resources.getResourceAsReader("Configuration.xml");
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession open() {
return factory.openSession();
}
}
分析
Reader reader = Resources.getResourceAsReader("Configuration.xml");
读取Mybaits的主配置配置文件,并返回该文件的输入流,Mybatis所有的SQL语句都写在XML配置文件里面,所以第一步就需要读取这些XML配置文件,这个不难理解,关键是读取文件后怎么存放
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成
SqlSessionFactoryBuilder通过类名就可以看出这个类的主要作用就是创建一个SqlSessionFactory,通过输入mybatis配置文件的字节流或者字符流,生成XMLConfigBuilder,XMLConfigBuilder创建一个Configuration,Configuration这个类中包含了mybatis的配置的一切信息,mybatis进行的所有操作都需要根据Configuration中的信息来进行
简而言之,该代码主要是读取配置文件流并将这些配置信息存放到Configuration对象中,读取mappers节点的引用文件,并将这些文件的各个节点信息存放到Configuration对象
public static SqlSession open() {
return factory.openSession();
}
通过调用DefaultSqlSessionFactory的openSession方法返回一个SqlSession实例
根据Configuration对象的信息获取数据库连接,并设置连接的事务隔离级别等信息,将经过包装数据库连接对象SqlSession接口返回,DefaultSqlSession是SqlSession的实现类,所以这里返回的是DefaultSqlSession,SqlSession接口里面就是对外提供的各种数据库操作
编写接口测试类
package cn.qdsoft.dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import cn.qdsoft.util.MyBatisUtil;
public class UserDAOTest {
@Test
public void findAll() {
try (SqlSession session = MyBatisUtil.open()) {
UserDAO dao = session.getMapper(UserDAO.class);
dao.findAll().forEach(u -> System.out.println(u.getName()));
}
}
}
写好之后右击UserDAOTest.java Run as -> JUnit Test
写页面
这里用bootstrap美化了页面
<%@ page pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>用户列表</title>
<!-- Bootstrap -->
<link href="../bootstrap/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<table class='table table-bordered table-hover table-striped'>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<c:forEach items="${users }" var="p">
<tr>
<td>${p.name }</td>
<td>${p.age }</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
编写UserListServlet
package cn.qdsoft.web;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import cn.qdsoft.util.MyBatisUtil;
import cn.qdsoft.dao.UserDAO;
import cn.qdsoft.model.User;
@WebServlet("/user/list.do")
public class UserListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try (SqlSession session = MyBatisUtil.open()) {
// 从数据库取出所有用户
UserDAO dao = session.getMapper(UserDAO.class);
List<User> lists = dao.findAll();
// 保存到request对象
req.setAttribute("users", lists);
}
// 转发到 list.jsp
req.getRequestDispatcher("list.jsp").forward(req, resp);
}
}
项目右击 Run as -> maven build
成功之后在浏览器中打开