最近准备学习的下一阶段数据库开发相关,于是便开始了折腾。
本文主要从新手向介绍一个基于Spring Boot2.x,MySQL和myBatis完成简单的用Web操作数据库的演示程序,然后采用两种实现方式:

  1. 全注解实现SQL持久化方式
  2. 全xml实现SQL持久化方式

主要支持以下功能:

  • 数据库自动建表,如本例中的用户表。
  • 数据库CRUD(创建读取更新删除)操作。
  • 通过http get操作user表。

    1.环境准备

    IntelliJ IDEA旗舰版

    这里建议使用专业版的IDEA,因为它自带数据库操作功能(数据库),可以连接本地MySQL数据库,通过SQL语句操作数据库以及可视化数据库内容。非常方便,从而节省了一个MySQL Workbench的安装。 IDEA Ultimate是科学研究版,没有许可证的个人用户可以参考下Jetbrains系列产品2019.2.4最新激活方法[持续更新]。这也是我之前刷沸点看到的,不然我只能在公司里用专业版的IDEA ,感谢大神分享。
    【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图1【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图2

    的MySQL

    可以通过官方网站下载MySQL社区下载,安装过程中的设置类型通过IntelliJ IDEA Ultimate有数据库的功能,这里直接选择仅服务器即可。如果,你想用MySQL Workbench,可以选择默认的开发版本,会一并安装MySQL工作台。
    所使用的数据表是类似如下的内容:

    1. CREATE TABLE `user` (
    2. `id` int(13) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(33) NOT NULL,
    4. `age` int(3) NOT NULL,
    5. `money` double NOT NULL,
    6. PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    8. 复制代码

    Maven + JDK8

    建议使用Spring Boot JDK 1.8或更高版本和Maven 3.2+。

    2.项目结构

    1. +---src
    2. | +---main
    3. | | +---java
    4. | | | \---hello
    5. | | | | MainApplication.java
    6. | | | |
    7. | | | +---bean
    8. | | | | User.java
    9. | | | |
    10. | | | +---controller
    11. | | | | UserController.java
    12. | | | |
    13. | | | +---dao
    14. | | | | UserDao.java
    15. | | | |
    16. | | | \---service
    17. | | | UserService.java
    18. | | |
    19. | | \---resources
    20. | | application.properties
    21. | | mysql.properties
    22. | | \---mapper
    23. | | UserMapper.xml(xml实现特有)
    24. pom.xml
    25. 复制代码

    3.内容解析

  • pom.xml

pom中需要添加boot-starter-web的依赖,MySQL连接的依赖,myBatis的依赖。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mybatis.spring.boot</groupId>
  8. <artifactId>mybatis-spring-boot-starter</artifactId>
  9. <version>1.3.2</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>mysql</groupId>
  13. <artifactId>mysql-connector-java</artifactId>
  14. </dependency>
  15. </dependencies>
  16. 复制代码
  • 属性配置

application.properties,连接本地MySQL数据库相关配置。

  1. server.port=8333
  2. # 数据库为sakila
  3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sakila?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
  4. spring.datasource.username=root
  5. spring.datasource.password=123456
  6. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  7. 复制代码

mysql.properties,项目中使用的数据集表名,支持修改。

  1. # 自定义所使用的mysql表的表名配置
  2. mysql.tableName=user
  3. 复制代码
  • 用户类用户

用户类(POJO)用户,类成员变量对应数据库表中的各个分区。

  1. public class User {
  2. private int id;
  3. private String name;
  4. private int age;
  5. private double money;
  6. // Set Get方法省略
  7. }
  8. 复制代码
  • 道层

这里要注意mybatis动态调用表名和分段名分别是使用$ {}和#{},具体的区别可以参考mybatis动态调用表名和替换名

  1. /**
  2. * 基于注解实现数据库 CRUD(create read update delete)
  3. */
  4. @Mapper
  5. public interface UserDao {
  6. /**
  7. * 创建一个新表,如果表明不存在
  8. */
  9. @Update("create table if not exists ${tableName}(\n" +
  10. "id int(13) not null auto_increment,\n" +
  11. "`name` varchar(33) not null,\n" +
  12. "age int(3) not null,\n" +
  13. "money double not NULL,\n" +
  14. "PRIMARY KEY (id)\n" +
  15. ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8")
  16. void createTable(@Param("tableName")String tableName);
  17. /**
  18. * 插入用户信息
  19. */
  20. @Insert("INSERT INTO ${tableName}(name, age, money) VALUES(#{name}, #{age}, #{money})")
  21. void insertUser(@Param("tableName")String tableName, @Param("name") String name, @Param("age") Integer age,
  22. @Param("money") Double money);
  23. /**
  24. * 通过名字查询用户信息
  25. */
  26. @Select("SELECT * FROM ${tableName} WHERE name = #{name}")
  27. List<User> findUserByName(@Param("tableName")String tableName, @Param("name") String name);
  28. /**
  29. * 查询所有用户信息
  30. */
  31. @Select("SELECT * FROM ${tableName}")
  32. List<User> findAllUser(@Param("tableName")String tableName);
  33. /**
  34. * 根据 id 更新用户信息
  35. */
  36. @Update("UPDATE ${tableName} SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
  37. void updateUser(@Param("tableName")String tableName, @Param("name") String name, @Param("age") Integer age,
  38. @Param("money") Double money, @Param("id") int id);
  39. /**
  40. * 根据 id 删除用户信息
  41. */
  42. @Delete("DELETE from ${tableName} WHERE name = #{name}")
  43. void deleteUser(@Param("tableName")String tableName, @Param("name") String name);
  44. /**
  45. * 删除user表里面的所有数据
  46. */
  47. @Delete("DELETE from ${tableName} WHERE 1 = 1")
  48. void deleteAllUserData(@Param("tableName")String tableName);
  49. }
  50. 复制代码
  • 服务层

UserService.java使用链接数据层(DAO),并实现CRUD的业务逻辑。另外这里的自动建表的表名是通过自定义配置文件mysql.properties中配置的。

  1. @Service
  2. @PropertySource({"classpath:mysql.properties"})
  3. public class UserService {
  4. @Autowired
  5. private UserDao userDao;
  6. @Value("${mysql.tableName}")
  7. private String tableName;
  8. /**
  9. * 如果表不存在则创建表
  10. */
  11. public void createTable() {
  12. userDao.createTable(tableName);
  13. }
  14. /**
  15. * 根据名字查找用户
  16. */
  17. public List<User> selectUserByName(String name) {
  18. return userDao.findUserByName(tableName, name);
  19. }
  20. /**
  21. * 查找所有用户
  22. */
  23. public List<User> selectAllUser() {
  24. return userDao.findAllUser(tableName);
  25. }
  26. /**
  27. * 插入两个用户
  28. */
  29. public void insertService() {
  30. userDao.insertUser(tableName, "Ace", 22, 3000.0);
  31. userDao.insertUser(tableName, "Blink", 19, 3000.0);
  32. }
  33. /**
  34. * 插入某个指定用户
  35. */
  36. public void insertOneService(String name, int age, double money) {
  37. userDao.insertUser(tableName, name, age, money);
  38. }
  39. /**
  40. * 通过名字更新用户信息
  41. */
  42. @Transactional
  43. public void updateService(String name, int age, double money) {
  44. List<User> users = userDao.findUserByName(tableName, name);
  45. if (users.isEmpty()) {
  46. return;
  47. }
  48. List<Integer> ids = users.stream().map(User::getId).collect(Collectors.toList());
  49. ids.forEach(id -> userDao.updateUser(tableName, name, age, money, id));
  50. }
  51. /**
  52. * 根据id 删除用户
  53. */
  54. public void deleteService(String name) {
  55. userDao.deleteUser(tableName, name);
  56. }
  57. /**
  58. * 清除表内所有数据
  59. */
  60. public void clearService() {
  61. userDao.deleteAllUserData(tableName);
  62. }
  63. /**
  64. * 模拟事务。由于加上了 @Transactional注解,如果转账中途出了意外 Ace 和 Blink 的钱都不会改变。
  65. */
  66. @Transactional
  67. public void changemoney() {
  68. userDao.updateUser(tableName,"Ace", 22, 2000.0, 3);
  69. // 模拟转账过程中可能遇到的意外状况
  70. int temp = 1 / 0;
  71. userDao.updateUser(tableName,"Blink", 19, 4000.0, 4);
  72. }
  73. }
  74. 复制代码

基于全xml实现只需要修改UserDao.java并添加如下的UserMapper.xml就可以了,其他代码和配置完全和注解版本一致。
UserDao.java

  1. /**
  2. * 基于xml实现数据库 CRUD(create read update delete)
  3. */
  4. @Mapper
  5. public interface UserDao {
  6. /**
  7. * 创建一个新表,如果表明不存在
  8. */
  9. void createTable(@Param("tableName")String tableName);
  10. /**
  11. * 插入用户信息
  12. */
  13. void insertUser(@Param("tableName")String tableName, String name, Integer age, Double money);
  14. /**
  15. * 通过名字查询用户信息
  16. */
  17. List<User> findUserByName(@Param("tableName")String tableName, String name);
  18. /**
  19. * 查询所有用户信息
  20. */
  21. List<User> findAllUser(@Param("tableName")String tableName);
  22. /**
  23. * 根据 id 更新用户信息
  24. */
  25. void updateUser(@Param("tableName")String tableName, String name, Integer age, Double money, int id);
  26. /**
  27. * 根据 id 删除用户信息
  28. */
  29. void deleteUser(@Param("tableName")String tableName, String name);
  30. /**
  31. * 删除user表里面的所有数据
  32. */
  33. void deleteAllUserData(@Param("tableName")String tableName);
  34. }
  35. 复制代码

UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="hello.dao.UserDao">
  6. <update id="createTable">
  7. create table if not exists ${tableName}(
  8. id int(13) not null auto_increment,
  9. `name` varchar(33) not null,
  10. age int(3) not null,
  11. money double not null,
  12. primary key (id)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
  13. </update>
  14. <!--这里的name, age 和 money可以自动匹配insertUser(String name, Integer age, Double money)的入参-->
  15. <insert id="insertUser">
  16. insert into ${tableName}(name, age, money) values(#{name}, #{age}, #{money})
  17. </insert>
  18. <select id="findUserByName" resultType="hello.bean.User">
  19. SELECT * FROM ${tableName} WHERE name = #{name}
  20. </select>
  21. <select id="findAllUser" resultType="hello.bean.User">
  22. select * from ${tableName}
  23. </select>
  24. <update id="updateUser">
  25. update ${tableName} set name = #{name}, age = #{age}, money = #{money} where id = #{id}
  26. </update>
  27. <delete id="deleteUser">
  28. delete from ${tableName} where name = #{name}
  29. </delete>
  30. <delete id="deleteAllUserData">
  31. delete from ${tableName} where 1 = 1
  32. </delete>
  33. </mapper>
  34. 复制代码
  • 控制器层

实现CRUD http请求对应的控制器接口

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. // http://localhost:8333/user/insert?name=ace&age=18&money=0
  7. @GetMapping("/insert")
  8. public List<User> insert(@RequestParam(value = "name", required = true) String name,
  9. @RequestParam(value = "age", required = true) int age,
  10. @RequestParam(value = "money", required = true) double money) {
  11. userService.insertOneService(name, age, money);
  12. return userService.selectAllUser();
  13. }
  14. // http://localhost:8333/user/query?name=ace
  15. @GetMapping("/query")
  16. public List<User> queryByName(@RequestParam(value = "name", required = false) String name) {
  17. if (name == null) {
  18. return userService.selectAllUser();
  19. }
  20. return userService.selectUserByName(name);
  21. }
  22. // http://localhost:8333/user/update?name=ace&age=18&money=999
  23. @GetMapping("/update")
  24. public List<User> update(@RequestParam(value = "name", required = true) String name,
  25. @RequestParam(value = "age", required = true) int age,
  26. @RequestParam(value = "money", required = true) double money) {
  27. userService.updateService(name, age, money);
  28. return userService.selectUserByName(name);
  29. }
  30. // http://localhost:8333/user/delete?name=ace
  31. @GetMapping("/delete")
  32. public String delete(@RequestParam(value = "name", required = true) String name) {
  33. userService.deleteService(name);
  34. return "OK";
  35. }
  36. // http://localhost:8333/user/clear
  37. @GetMapping("/clear")
  38. public List<User> testClear() {
  39. userService.clearService();
  40. return userService.selectAllUser();
  41. }
  42. @GetMapping("/changemoney")
  43. public List<User> testchangemoney() {
  44. userService.insertService();
  45. userService.changemoney();
  46. return userService.selectAllUser();
  47. }
  48. }
  49. 复制代码
  • Spring Boot启动类

MainApplication.java通过继承CommandLineRunner在Spring Boot启动的时候,在表自动创建完后会在表中插入一些数据。

  1. @SpringBootApplication
  2. public class MainApplication implements CommandLineRunner {
  3. public static void main(String[] args) {
  4. SpringApplication.run(MainApplication.class, args);
  5. }
  6. @Autowired
  7. UserService userService;
  8. @Override
  9. public void run(String... args) throws Exception {
  10. userService.createTable();
  11. userService.insertService();
  12. }
  13. }
  14. 复制代码

4.功能演示

  1. 数据库表自动创建,可以通过专业版IDEA的数据库功能看到用户表的自动创建。
  2. 查询查询,这里如果要显示一下的json格式,需要给Chrome安装上JsonViewer插件。
    【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图3
  3. 插入数据insert

【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图4 4.更新数据更新 【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图5 5.删除数据删除 【20200220】Spring Boot 2.x   myBatis全注解和全xml实现CRUD及自动建表 - 图6
作者:BlinkAce
链接:https://juejin.im/post/5dcffe53e51d453fc123be07
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。