上一篇已經完成了spring boot項目的搭建Spring Boot項目快速搭建 ,接下來這篇要跟mybatis來進行整合
1. mybatis訪問數據庫
1.1 首先對pom.xml文件進行修改,加入必要的jar包支持
<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>test-spring-boot</groupId>
<artifactId>test-springboot-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- spring boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<!-- spring boot web支持:mvc,aop... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 對jsp的支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!-- mybatis-spring-boot驅動 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 在application.properties文件中完成對數據庫的配置信息,本文采用的mysql數據庫
#修改服務器端口號
server.port=8081
#返回的前綴 目錄對應src/main/webapp下
spring.mvc.view.prefix: /
#返回的後綴
spring.mvc.view.suffix: .jsp
#mysql連接
spring.datasource.url = jdbc:mysql://localhost:3306/testsql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
#-- 數據庫是Oracle的設定格式 --
#jdbc.driverClassName=[驅動名稱]
#jdbc.url=jdbc:oracle:thin:@[數據庫地址或IP]:[端口]:[實例名]
#jdbc.username=[用戶名]
#jdbc.password=[密碼]
#【示例】
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:functionsampledb
#jdbc.username=xxxxx
#jdbc.password=xxxxx
#-- 數據庫是PostgreSQL的設定格式 --
#jdbc.driverClassName=[驅動名稱]
#jdbc.url=jdbc:postgresql://[數據庫地址或IP]:[端口號]/[數據庫名稱]
#jdbc.username=[用戶名]
#jdbc.password=[密碼]
#【示例】
#jdbc.driverClassName=org.postgresql.Driver
#jdbc.url=jdbc:postgresql://localhost:5432/functionsampledb
#jdbc.username=postgres
#jdbc.password=sa
1.3 然後新增接口RootMapper,實體Root,及Service層代碼文件
RootMapper接口
package com.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.pojo.Root;
@Mapper
public interface RootMapper {
int deleteByPrimaryKey(Integer rootId);
int insert(Root record);
int insertSelective(Root record);
@Select("select root_id as rootId,root_pid as rootPid,root_name as rootName from root where root_id = #{rootId}")
Root selectByPrimaryKey(@Param("rootId") Integer rootId);
int updateByPrimaryKeySelective(Root record);
int updateByPrimaryKey(Root record);
}
Root實體類
package com.pojo;
public class Root {
private Integer rootId;
private Integer rootPid;
private String rootName;
public Integer getRootId() {
return rootId;
}
public void setRootId(Integer rootId) {
this.rootId = rootId;
}
public Integer getRootPid() {
return rootPid;
}
public void setRootPid(Integer rootPid) {
this.rootPid = rootPid;
}
public String getRootName() {
return rootName;
}
public void setRootName(String rootName) {
this.rootName = rootName == null ? null : rootName.trim();
}
@Override
public String toString() {
return "Root [rootId=" + rootId + ", rootPid=" + rootPid + ", rootName=" + rootName + "]";
}
}
Service接口:
public interface RootService {
/**
* 通過id主鍵查詢數據
* @return
*/
public Root selectByPrimaryKey(Integer id);
}
serviceImpl實現:
@Service("rootService")
public class RootServiceImpl implements RootService {
@Autowired
private RootMapper rootMapper;
@Override
public Root selectByPrimaryKey(Integer id) {
// TODO Auto-generated method stub
return this.rootMapper.selectByPrimaryKey(id);
}
}
1.4 Controller層完成與前臺的交互
@Controller
@RequestMapping("/root")
public class RootController {
private static Logger logger = Logger.getLogger(RootController.class);
@Autowired
private RootService rootservice = null;
@GetMapping(value = "/rootId/{id}")
@ResponseBody
public String rootById(@PathVariable("id") String id ) {
logger.info("通過id進行Root查詢,id是:" + id);
Root root = rootservice.selectByPrimaryKey(Integer.parseInt(id));
if (root == null) {
return "no data!";
} else {
System.out.println(root.getRootName());
return root.getRootName();
}
}
}
1.5 前臺index.jsp頁面,放於src/main/webapp下面
交互採用了ajax異步請求,需要引入jquery.js支持,將它放在src/main/resource下的static/js下面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.1.js"></script>
<title>index頁面</title>
</head>
<body>
id:<input type="text" id="txtId"><span id="contentSpan"></span><br/>
<input type="button" value="查詢" id="searchBtn"><input type="button" value="查詢所有" id="searchAllBtn">
<script type="text/javascript">
$(function() {
$("#searchBtn").click(function() {
var id = $("#txtId").val();
$.get("${pageContext.request.contextPath}/root/rootId/"+id,"", function (data) {
$("#contentSpan").text(data.toString());
})
})
});
</script>
</body>
</html>
最終目錄結構:
運行App.class文件,在瀏覽器輸入地址http://127.0.0.1:8081/index.jsp
測試效果:
1.6 這樣的話,訪問數據庫的sql語句是寫在接口dao方法上面的,與平常寫在***Mapper.xml還不一樣,然後需要繼續修改文件,把sql語句寫到xml文件中
在src/main/resource文件夾下面添加一個config文件夾,在裏面添加一個application.yml文件:進行mapper文件夾下面的xml掃描
mybatis:
mapperLocations: classpath:mapper/*.xml
如果使用多個數據源DataSource的話,需要繼續配置,Spring Boot配置多個DataSource
2. 數據信息分頁PageHelper
2.1 添加數據分頁查詢–PageHelper
最後我們添加一個mybatis-config.xml配置文件,裏面包含數據分頁插件
<?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>
<property name="dialect" value="mysql" />
</properties>
<settings>
<!-- 這個配置使全局的映射器啓用或禁用緩存。系統默認值是true,設置只是爲了展示出來 -->
<setting name="cacheEnabled" value="true" />
<!-- 全局啓用或禁用延遲加載。當禁用時,所有關聯對象都會即時加載。 系統默認值是true,設置只是爲了展示出來 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 允許或不允許多種結果集從一個單獨的語句中返回(需要適合的驅動)。 系統默認值是true,設置只是爲了展示出來 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!--使用列標籤代替列名。不同的驅動在這方便表現不同。參考驅動文檔或充分測試兩種方法來決定所使用的驅動。 系統默認值是true,設置只是爲了展示出來 -->
<setting name="useColumnLabel" value="true" />
<!--允許 JDBC 支持生成的鍵。需要適合的驅動。如果設置爲 true 則這個設置強制生成的鍵被使用,儘管一些驅動拒絕兼容但仍然有效(比如
Derby)。 系統默認值是false,設置只是爲了展示出來 -->
<setting name="useGeneratedKeys" value="false" />
<!--配置默認的執行器。SIMPLE 執行器沒有什麼特別之處。REUSE 執行器重用預處理語句。BATCH 執行器重用語句和批量更新 系統默認值是SIMPLE,設置只是爲了展示出來 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!--設置超時時間,它決定驅動等待一個數據庫響應的時間。 系統默認值是null,設置只是爲了展示出來 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 設置數據庫類型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種數據庫-->
<property name="dialect" value="mysql" />
<property name="offsetAsPageNum" value="true" />
<property name="rowBoundsWithCount" value="true" />
<property name="pageSizeZero" value="true" />
<property name="reasonable" value="true" />
</plugin>
</plugins>
</configuration>
在application.yml文件添加對mybatis-config.xml的掃描:
mybatis:
mapperLocations: classpath:mapper/*Mapper.xml
configLocation: classpath:/mybatis-config.xml
pom.xml添加PageHelper的jar(pom.xml文件已經有了)
<!-- pagehelper分頁插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
這樣就已經設置好了PageHelper分頁工具了
2.2 分頁插件測試
在dao接口層添加一個全部查詢的方法(爲了方便,直接在方法上面添加註解執行sql):
@Select("select root_id as rootId,root_pid as rootPid,root_name as rootName from root ")
List<Root> selectAll();
在Service層進行dao層方法的調用,無需業務邏輯,就不貼代碼了
最後在Controller層添加測試方法:
@GetMapping(value = "/rootAll")
@ResponseBody
public void rootAll(Model model) {
logger.info("查詢所有的root數據" );
PageHelper.startPage(1, 3, "root_name");
List<Root> roots = rootservice.selectAll();
//方法一
Page<Root> rootPage = (Page<Root>)roots;
if (rootPage == null) {
System.out.println("no data!");
} else {
//輸出總的數量
System.out.println(rootPage.getTotal());
for(Root r:rootPage){
System.out.println(r.getRootName());
}
}
/* 方法二
PageInfo<Root> pages = new PageInfo<Root>(roots);
if (pages.getList() == null) {
System.out.println("no data!");
} else {
System.out.println(pages.getTotal());
for(Root r:pages.getList()){
System.out.println(r.getRootName());
}
}*/
}
在頁面訪問該方法就可以獲取到分頁的數據了,也可以通過字段排序查詢,並且直接獲取到表中總的數據
2.3 分頁查詢功能
首先該項目沒有使用其他前段框架,數據使用table來表格來顯示,使用jstl對後臺獲取的集合數據進行遍歷,所以先修改pom.xml文件添加jstl支持
jstl標籤的使用需要在jsp頁面添加支持<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
該功能要實現首頁,下一頁上一頁,末頁,每頁顯示幾條數據等功能.
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
然後創建一個頁面,用於顯示數據信息的頁面:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
</style>
</head>
<body>
<table style="border:1px #ccc solid;width:600px">
<thead style="background:#ddd">
<tr>
<td>RootID</td>
<td>RootName</td>
<td>RootPID</td>
</tr>
</thead>
<tbody>
<c:forEach var="r" items="${rootPage }">
<tr class="trCls">
<td>${r.rootId }</td>
<td>${r.rootName }</td>
<td>${r.rootPid }</td>
</tr>
</c:forEach>
</tbody>
</table>
<input id="first" type="button" value="首頁" />
<input id="back" type="button" value="上一頁" />
<input id="next" type="button" value="下一頁" />
<input id="end" type="button" value="末頁" />
<label>nowPage:<span style="color:red" id="nowPage">${pageNum }</span></label>/
<label>sumPage:<span style="color:red" id="sumPage">${pages }</span></label>
<label>total:<b>${total }</b></label>
<script type="text/javascript">
$(function(){
$("tbody>tr:even").css("background","#faffff");
$("tbody>tr:odd").css("background","#fffaff");
//首頁
$("#first").click(function() {
var pageSize = $("#pageSize").val();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":"1","pageSize":pageSize,"orderBy":""});
});
//末頁
$("#end").click(function() {
var end = $("#sumPage").text();
var pageSize = $("#pageSize").val();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":end,"pageSize":pageSize,"orderBy":""});
});
//上一頁
$("#back").click(function() {
var pageNum = parseInt($("#nowPage").text())-1;
var pageSize = $("#pageSize").val();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":pageNum,"pageSize":pageSize,"orderBy":""});
});
//下一頁
$("#next").click(function() {
var pageNum = parseInt($("#nowPage").text())+1;
var pageSize = $("#pageSize").val();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":pageNum,"pageSize":pageSize,"orderBy":""});
});
})
</script>
</style>
</body>
</html>
上面的頁面是用來引用的,類似於一個gird,需要在index.jsp中顯示,
修改index.jsp頁面
<%@ page language="java" contentType="text/html; charset=utf-8"
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>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.1.js"></script>
<title>index頁面</title>
</head>
<body>
id:<input type="text" id="txtId"><span id="contentSpan"></span><br/>
<input type="button" value="search" id="searchBtn"><input type="button" value="searchAll" id="searchAllBtn">
<label id="pageSizeLabel" style="display:none;margin-left:350px">每頁數據:</label>
<select id="pageSize" style="display:none">
<option>3</option>
<option>5</option>
<option>10</option>
<option>20</option>
</select>
<div id="rootListBody">
</div>
<script type="text/javascript">
$(function() {
//通過id查詢名字
$("#searchBtn").click(function() {
var id = $("#txtId").val();
$.get("${pageContext.request.contextPath}/root/rootId/"+id,"", function (data) {
$("#contentSpan").text(data.toString());
})
});
//查詢所有,有分頁
$("#searchAllBtn").click(function() {
$("#pageSizeLabel,#pageSize").show();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":"","pageSize":"3","orderBy":""});
});
//分頁下拉框
$("#pageSize").change(function(){
var pageSize = $("#pageSize").val();
var pageNum = $("#nowPage").text();
$("#rootListBody").load("${pageContext.request.contextPath}/root/rootAll",
{"pageNum":pageNum,"pageSize":pageSize,"orderBy":""});
})
});
</script>
</body>
</html>
最後修改Controller層的分頁查詢方法:
@PostMapping(value = "/rootAll")
public String rootAll(Model model,HttpServletRequest request) {
Integer pageNum = request.getParameter("pageNum") != "" ? Integer.parseInt(request.getParameter("pageNum")) : 1;
Integer pageSize = request.getParameter("pageSize") != "" ? Integer.parseInt(request.getParameter("pageSize")) : 3;
String orderBy = request.getParameter("orderBy") != "" ? request.getParameter("orderBy") : null;
logger.info("查詢所有的root數據:第"+pageNum+"頁,每頁"+pageSize+"條,排序字段:"+orderBy);
PageHelper.startPage(pageNum, pageSize);
if(orderBy != null && !orderBy.equals(""))
PageHelper.orderBy("orderBy");
List<Root> roots = rootservice.selectAll();
Page<Root> rootPage = (Page<Root>)roots;
if (rootPage !=null) {
model.addAttribute("rootPage", rootPage);
model.addAttribute("total", rootPage.getTotal());
model.addAttribute("pageNum", rootPage.getPageNum());
model.addAttribute("pages", rootPage.getPages());
}
return "/page-list-root";
/* PageInfo<Root> pages = new PageInfo<Root>(roots);
if (pages.getList() == null) {
System.out.println("no data!");
} else {
System.out.println(pages.getTotal());
for(Root r:pages.getList()){
System.out.println(r.getRootName());
}
}*/
}
最終實現效果