Spring Boot 2.x + myBatis全xml實現CRUD及自動建表

以前博主寫過一篇介紹《Spring Boot 2.x + myBatis全註解實現CRUD及自動建表》的文章,此次會寫基於xml配置的demo。主要支持的功能和以前同樣:
(1) 數據庫自動建表,如本例中的user表。
(2) 數據庫CRUD(create read update delete)操做。
(3) 經過http get操做user表。java

就自動建表功能來看,本文實現自動建表功能的方式要相較於以前全註解的方式更加簡潔:
(1)首先沒有借用第三方的依賴,而且少了不少配置的代碼,是直接經過mybatis支持的框架進行的。
(2)再者,本文的實現是將建表功能以xml mapper中的sql語句的方式實現的,理論上與其餘的插入,查詢,修改,刪除的sql mapper的方式並無什麼區別。
(3)最後,因爲是經過sql語句實現的,理論上這種實現方式也能夠經過sql語句實現不少其餘的功能,好比刪除數據表等等。mysql

環境準備:
(1) IDEA(建議使用Ultimate版本,會自帶經過IDEA操做database的功能)
(2) MySQL
(3) Maven + JDK8web

項目目錄結構:spring

+---main
|   +---java
|   |   \---hello
|   |       |   MainApplication.java
|   |       |   
|   |       +---bean
|   |       |       User.java
|   |       |       
|   |       +---controller
|   |       |       UserController.java
|   |       |       
|   |       +---dao
|   |       |       UserDao.java
|   |       |       
|   |       \---service
|   |               UserService.java
|   |               
|   \---resources
|       |   application.properties
|       |   
|       \---mapper
|               UserMapper.xml
|               
pom.xml

數據庫和用戶表:
默認的使用數據庫是MySQL下的sakila,這個能夠經過修改application.properties裏的配置更改本地數據庫名。
user表用的是相似以下語句中建立的:sql

CREATE TABLE `user` (
    `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
    `name` varchar(33) DEFAULT NULL COMMENT '姓名',
    `age` int(3) DEFAULT NULL COMMENT '年齡',
    `money` double DEFAULT NULL COMMENT '帳戶餘額',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

pom.xml數據庫

<?xml version="1.0" encoding="UTF-8"?>
<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>MybatisDemo2</groupId>
    <artifactId>MybatisDemo2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
</project>

配置 application.properties,鏈接本地MySQL數據庫,以及xml mapperapache

server.port=8333
# 數據庫爲sakila
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sakila?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 配置映射文件加載
mybatis.mapper-locations=classpath*:mapper/*.xml

User.javasegmentfault

package hello.bean;

public class User {

    private int id;

    private String name;

    private int age;

    private double money;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
}

UserDao.java
Dao 層開發基於全xml實現數據庫CRUD操做mybatis

package hello.dao;

import hello.bean.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 基於xml實現數據庫 CRUD(create read update delete)
 */
@Mapper
public interface UserDao {


    /**
     * 建立一個新表,若是代表不存在
     */
    void createTable(@Param("tableName")String tableName);

    /**
     * 插入用戶信息
     */
    void insertUser(String name, Integer age, Double money);

    /**
     * 經過名字查詢用戶信息
     */
    List<User> findUserByName(String name);

    /**
     * 查詢全部用戶信息
     */
    List<User> findAllUser();

    /**
     * 根據 id 更新用戶信息
     */
    void updateUser(String name, Integer age, Double money, int id);

    /**
     * 根據 id 刪除用戶信息
     */
    void deleteUser(String name);

    /**
     * 刪除user表裏面的全部數據
     */
    void deleteAllUserData();
}

UserService.java
Service層app

package hello.service;

import hello.bean.User;
import hello.dao.UserDao;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    /**
     * 若是表不存在則建立表
     */
    public void createTable(String tableName) {
        userDao.createTable(tableName);
    }

    /**
     * 根據名字查找用戶
     */
    public List<User> selectUserByName(String name) {
        return userDao.findUserByName(name);
    }

    /**
     * 查找全部用戶
     */
    public List<User> selectAllUser() {
        return userDao.findAllUser();
    }

    /**
     * 插入兩個用戶
     */
    public void insertService() {
        userDao.insertUser("Ace", 22, 3000.0);
        userDao.insertUser("Blink", 19, 3000.0);
    }

    /**
     * 插入某個指定用戶
     */
    public void insertOneService(String name, int age, double money) {
        userDao.insertUser(name, age, money);
    }

    /**
     * 經過名字更新用戶信息
     */
    @Transactional
    public void updateService(String name, int age, double money) {
        List<User> users = userDao.findUserByName(name);
        if (users.isEmpty()) {
            return;
        }
        List<Integer> ids = users.stream().map(User::getId).collect(Collectors.toList());
        ids.forEach(id -> userDao.updateUser(name, age, money, id));
    }

    /**
     * 根據id 刪除用戶
     */
    public void deleteService(String name) {
        userDao.deleteUser(name);
    }

    /**
     * 清除表內全部數據
     */
    public void clearService() {
        userDao.deleteAllUserData();
    }

    /**
     * 模擬事務。因爲加上了 @Transactional註解,若是轉帳中途出了意外 Ace 和 Blink 的錢都不會改變。
     */
    @Transactional
    public void changemoney() {
        userDao.updateUser("Ace", 22, 2000.0, 3);
        // 模擬轉帳過程當中可能遇到的意外情況
        int temp = 1 / 0;
        userDao.updateUser("Blink", 19, 4000.0, 4);
    }
}

UserMapper.xml
配置了mapper映射,實現SQL語句操做數據庫CRUD操做。這裏若是SQL語句中的變量與MySQL保留關鍵字重複了,能夠加單引號如name。這裏實現了基於SQL語句進行新建表的mapper方法。理論上,SQL語句是默認用大寫單詞書寫。可是爲了閱讀方便,這裏全部的SQL語句都使用小寫編寫了。

<?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="hello.dao.UserDao">

    <update id="createTable">
        create table if not exists ${tableName}(
        id int(13) not null auto_increment,
        `name` varchar(33) not null,
        age int(3) not null,
        money double not null,
        primary key (id)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    </update>

<!--這裏的name, age 和 money能夠自動匹配insertUser(String name, Integer age, Double money)的入參-->
    <insert id="insertUser">
        insert into user(name, age, money) values(#{name}, #{age}, #{money})
    </insert>

    <select id="findUserByName" resultType="hello.bean.User">
        SELECT * FROM user WHERE name = #{name}
    </select>

    <select id="findAllUser" resultType="hello.bean.User">
        select * from user
    </select>

    <update id="updateUser">
        update user set name = #{name}, age = #{age}, money = #{money} where id = #{id}
    </update>

    <delete id="deleteUser">
        delete from user where name = #{name}
    </delete>

    <delete id="deleteAllUserData">
        delete from user where 1 = 1
    </delete>
</mapper>

MainApplication.java
Spring Boot啓動類,經過繼承CommandLineRunner在Spring Boot啓動的時候,在表自動建立完後會在表中插入一些數據。

package hello;

import hello.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 這份demo須要本地安裝mySQL,並會在Spring Boot啓動的時候自動在sakila數據庫下新建一個user的表
 */
@SpringBootApplication
public class MainApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

    @Autowired
    UserService userService;

    @Override
    public void run(String... args) throws Exception {
        userService.createTable("user");
        userService.insertService();
    }
}

功能演示:
(1)查詢query

(2)插入數據insert

(3)更新數據update

(4)刪除數據delete
截止目前,一個基於Spring Boot 2.x,mySQL和myBatis完成簡單的用Web操做數據庫的全xml實現demo程序就已經完成啦~

相關文章
相關標籤/搜索