以前博主寫過一篇介紹《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程序就已經完成啦~