1. 程式人生 > 實用技巧 >5. SpringBoot整合mybatis框架

5. SpringBoot整合mybatis框架

  • Spring框架整合mybatis回顧
    • 引入依賴
      • spring mybatis
      • mybatis-spring
      • jar
      • mysql
      • druid
      • lombook
      • log4j
    • 建表
    • 開發實體類
    • DAO介面
    • Mapper對映檔案
    • 書寫Service介面
    • 書寫Service實現類 @Service @Transactional 注入DAO相關物件
    • 配置spring.xml
      • 引入小配置檔案
      • 開啟註解掃描
      • 建立資料來源物件 DruidDataSource driverClassName url username pwssword
      • 建立sqlSessionFactory 注入Datasource 注入Mapper配置檔案位置
      • 建立DAO MapperScannerconfigurer 注SqlSessionFactory 注入DAO介面所在包,SqlSessionFactory.opensession().getMapper(UserDAO.class)
      • 建立事務管理器 DAtaSourceTransactionManager 注入DataSource
      • 開啟註解事務生效

  • SpringBoot整合mybatis
    • 引入依賴
      • mybatis-springboot-starter (自動依賴mybatis核心)
      • mysql
      • druid
      • lombook
<!-- 引入Mysql的驅動 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.38</version>
</dependency>


<!-- 引入mybatis依賴 -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.3</version>
</dependency>


<!-- 引入druid依賴 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.22</version>
</dependency>

<!-- 引入lombok,不是必須的,
提供了簡單的註解的形式來幫助我們簡化消除一些必須有但顯得很臃腫的 java 程式碼 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency>
    • 配置springboot配置檔案整合mybatis
      • 引入小配置檔案和開啟註解掃描都SpringBoot自動做完了
      • 下面是,建立資料來源物件 DruidDataSource driverClassName url username pwssword
      • 還有建立sqlSessionFactory 注入Datasource 注入Mapper配置檔案位置
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/project?useSSL=false&characterEncoding=UTF-8 username: mysql password: 123456 mybatis: mapper-locations: classpath:com/asimple/mapper/*.xml # The name is the same as the class name or the letter of the class name. User|user type-aliases-package: com.asimple.entity # SqlSessionFactory as other name
    • 入口類加入DAO介面的掃描註解 @MapperScan(DAO地址)
// Application.java
@SpringBootApplication
@MapperScan("com.asimple.dao")
public class Application {
//main函式 public static void main(String[] args){ //啟動SpringBoot應用 //引數1:入口類的類物件, 引數2:main函式引數 SpringApplication.run(Application.class, args); } }
    • 建表
      • 使用Navicat在Mysql資料庫中,新建test中的表 user用作實驗,表中包含三條user資料
    • 實體類
      • entity包中新建user類
package com.asimple.entity;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

@Data
@Accessors(chain = true)
//使用者類
public class User {
    private String U_id;
    private String U_pwd;public User(){}

    public User(String u_id, String u_pwd) {
        U_id = u_id;
        U_pwd = u_pwd;
    }public String getU_id() {
        return U_id;
    }

    public void setU_id(String u_id) {
        U_id = u_id;
    }

    public String getU_pwd() {
        return U_pwd;
    }

    public void setU_pwd(String u_pwd) {
        U_pwd = u_pwd;
    }
}
    • DAO介面
      • 新建BaseDAO介面,用於其他DAO實現
package com.asimple.dao;

import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface BaseDAO<T> {

    //增加資料
    void save(T t);

    //更新資料
    void update(T t);

    //刪除資料
    void delete(String id);

    //通過id查詢
    T findById(String id);

    //查詢所有的資訊
    List<T> findAll();

    //統計資訊的總條數
    Long findTotalCounts();

    //這裡得@Param是因為要用mybatis傳多個引數,所以用@Param傳過來
    //@Param是mybatis所提供的(org.apache.ibatis.annotations.Param),作為Dao層的註解
    //作用是用於傳遞引數,從而可以與SQL中的的欄位名相對應,一般在2=<引數數<=5時使用最佳
    //引數1:起始條數    引數2:每頁顯示記錄資料
    List<T> findByPage(@Param("start") Integer start, @Param("size") Integer size);

}
      • 新建UserDAO介面,繼承上述的BaseDAO介面(介面繼承介面,類繼承類,類實現介面)
package com.asimple.dao;

import com.asimple.entity.User;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserDAO extends BaseDAO<User>{
    @Override
    void save(User user);

    @Override
    void delete(String id);

    @Override
    User findById(String id);

    @Override
    void update(User user);

    @Override
    List<User> findAll();

    @Override
    Integer findTotalCounts();

    @Override
    List<User> findByPage(Integer start, Integer size);
}
    • Mapper配置檔案
      • 由於上面配置mybatis的時候,寫的是type-aliases-package: com.asimple.entity
      • 所以在resources的目錄下新建com/asimple/mapper,在mapper中新建UserDAOMapper.xml(這裡的Mapper是自己手動建立的Templates ,UserDAOMapper.xml的名字不一定要跟DAO一樣,重要的是裡面的<mapper>你寫的是UserDAO就行)
<?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="com.asimple.dao.UserDAO">

     <!-- parameterType: 傳入引數,沒有的話也沒關係,resultType: 返回型別,會自動匹配欄位屬性,可以是類,也可以是基本變數等等
      實體類的屬性最好跟資料庫一樣,不容易出錯
-->   <insert id="save" parameterType="com.asimple.entity.User"> insert into user values(#{U_id}, #{U_pwd}) </insert> <select id="findAll" resultType="com.asimple.entity.User"> select * from user </select> </mapper>
    • Service介面(業務層)
      • 新建 service 包
      • 新建 UserService 介面(這邊只舉例兩個方法)
      • 新建userServiceImpl,Service實現類 @Service @Transactional 注入DAO
package com.asimple.service;

import com.asimple.entity.User;

import java.util.List;

public interface UserService {

    void save(User user);

    List<User> findAll();
}
package com.asimple.service;

import com.asimple.dao.UserDAO;
import com.asimple.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDAO userDAO;

    @Override
    public void save(User user) {
        userDAO.save(user);
    }

    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<User> findAll() {
        List<User> list = userDAO.findAll();
        return list;
    }
}
    • 書寫Controller類並跳轉html頁面
package com.asimple.controller;

import com.asimple.entity.User;
import com.asimple.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //查詢所有資料,並轉發給前端
    @RequestMapping("/findAll")
    public String findAll(Model model) {
        List<User> users = userService.findAll();
        model.addAttribute("users", users);
        return "showAll";
    }

    //從前端獲取資料,儲存註冊使用者資訊
    @PostMapping("/save")
    public String save(
            @RequestParam(value = "id", required = false) String id,
            @RequestParam(value = "pwd", required = false) String pwd
    ){
        System.out.println("------------- save User ---------------");
        userService.save(user);

        //註冊完跳轉登入介面    
        return "login";
    }

}
    • Thymeleaf 模板的 .html 檔案,這裡新建名為 thymeleaf.html檔案,存放位置src/main/resources/templates/thymeleaf.html
<!DOCTYPE HTML>
<!-- 匯入thymeleaf -->
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <!-- th:href = '@{/css/success.css}' 中的css前面的 / 不能省略,會報錯 -->
    <link type='text/css' rel='styleSheet' th:href='@{/css/success.css}'/>
    <script th:src="@{/js/test.js}"></script>
</head>

<body>
    <!-- form表單提交 action="控制器的地址,類似網頁" method="提交方式,推薦post"-->
    <form th:action="@{/user/save}" method="post">
        <table cellpadding="0" cellspacing="0" border="0">
            <tr>
                Id:<input type="text" name="id">
            </tr>
            <tr>
                Pwd:<input type="password" name="pwd">
            </tr>
        </table>
        <!-- 使用submit提交表單 -->
        <input type="submit" value="提交">
    </form>

    <!-- 從連結跳轉Controller,在/zq 專案目錄下相對定位,我的專案目錄是/zq, http://localhost:8989/zq/ -->
    <a th:href="@{/user/findAll}">查詢所有使用者</a>

</body>

</html>