WEB開發----spring boot與mybatis整合

上一篇已經完成了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());
            }
        }*/
    }

最終實現效果
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章