当前位置:   article > 正文

【SpringBoot】| ORM 操作 MySQL(集成MyBatis)_springboot mysql

springboot mysql

目录

一:ORM 操作 MySQL 

1. 创建 Spring Boot 项目

2. @MapperScan

3. mapper文件和java代码分开管理

4. 事务支持


一:ORM 操作 MySQL 

使用MyBatis框架操作数据, 在SpringBoot框架集成MyBatis,使用步骤:

(1)mybatis起步依赖 : 完成mybatis对象自动配置, 对象放在容器中

(2)pom.xml 指定把src/main/java目录中的xml文件包含到classpath中

(3)创建实体类Student

(4)创建Dao接口 StudentDao , 创建一个查询学生的方法

(5)创建Dao接口对应的Mapper文件, xml文件, 写sql语句

(6)创建Service层对象, 创建StudentService接口和它的实现类。 去dao对象的方法,完成数据库的操作

(7)创建Controller对象,访问Service。

(8)写application.properties文件,配置数据库的连接信息。

1. 创建 Spring Boot 项目

(1)准备数据库表

字段及其类型

 插入数据

 (2)创建一个SpringBoot项目

选择Spring Web依赖

MybatisFramework依赖、MySQL Driver依赖

(3)生成的pom.xml配置和手动添加的resource插件配置

注:resource插件配置是表示将src/java/main下的或者说子包下的*.xml配置文件最终加载到target/classes目录下。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.9</version>
  9. <relativePath/>
  10. </parent>
  11. <groupId>com.zl</groupId>
  12. <artifactId>study-springboot-mysql</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <properties>
  15. <java.version>1.8</java.version>
  16. </properties>
  17. <dependencies>
  18. <!--web的起步依赖-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <!--mybatis的起步依赖-->
  24. <dependency>
  25. <groupId>org.mybatis.spring.boot</groupId>
  26. <artifactId>mybatis-spring-boot-starter</artifactId>
  27. <version>2.3.0</version>
  28. </dependency>
  29. <!--mysql驱动依赖-->
  30. <dependency>
  31. <groupId>com.mysql</groupId>
  32. <artifactId>mysql-connector-j</artifactId>
  33. <scope>runtime</scope>
  34. </dependency>
  35. <!--测试-->
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. </dependencies>
  42. <build>
  43. <!--手动添加resources插件-->
  44. <resources>
  45. <resource>
  46. <!--指定目录-->
  47. <directory>src/main/java</directory>
  48. <!--指定目录下的文件-->
  49. <includes>
  50. <include>**/*.xml</include>
  51. </includes>
  52. </resource>
  53. </resources>
  54. <!--plugins插件-->
  55. <plugins>
  56. <plugin>
  57. <groupId>org.springframework.boot</groupId>
  58. <artifactId>spring-boot-maven-plugin</artifactId>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </project>

(4)实体类

准备一个实体类,类的属性名与数据库中的字段名保持一致。

  1. package com.zl.pojo;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private Integer age;
  6. public Student() {
  7. }
  8. public Student(Integer id, String name, Integer age) {
  9. this.id = id;
  10. this.name = name;
  11. this.age = age;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Student{" +
  16. "id=" + id +
  17. ", name='" + name + '\'' +
  18. ", age=" + age +
  19. '}';
  20. }
  21. public Integer getId() {
  22. return id;
  23. }
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public Integer getAge() {
  34. return age;
  35. }
  36. public void setAge(Integer age) {
  37. this.age = age;
  38. }
  39. }

(5)创建Dao接口

需要在类上加@Mapper注解:告诉MyBatis这是一个dao接口,创建此接口的代理对象。

  1. package com.zl.dao;
  2. import com.zl.pojo.Student;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper //用来创建代理对象的
  5. public interface StudentDao {
  6. // 根据id进行查询
  7. Student selectById(@Param("stuId") Integer id);
  8. }

(6)在Dao接口下创建一个同名的StudentDao.xml文件

注:前面我们配置的resource配置就是为这个StudentDao.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="com.zl.dao.StudentDao">
  6. <!--编写sql语句,id是这条sql语句的唯一表示-->
  7. <select id="selectById" resultType="com.zl.pojo.Student">
  8. select id,name,age from t_student where id = #{stuId}
  9. </select>
  10. </mapper>

(7)编写Service接口和对应的实现类

StudentService接口

  1. package com.zl.service;
  2. import com.zl.pojo.Student;
  3. public interface StudentService {
  4. // 方法调用
  5. Student queryStudent(Integer id);
  6. }

StudentService接口实现类,编写业务逻辑

  1. package com.zl.service.impl;
  2. import com.zl.dao.StudentDao;
  3. import com.zl.pojo.Student;
  4. import com.zl.service.StudentService;
  5. import org.springframework.stereotype.Service;
  6. import javax.annotation.Resource;
  7. @Service // 交给Spring容器管理
  8. public class StudentServiceImpl implements StudentService {
  9. // 调用Dao
  10. @Resource // 给属性赋值
  11. private StudentDao studentDao;
  12. @Override
  13. public Student queryStudent(Integer id) {
  14. Student student = studentDao.selectById(id);
  15. return student;
  16. }
  17. }

(8)创建controller去调用service

  1. package com.zl.controller;
  2. import com.zl.pojo.Student;
  3. import com.zl.service.StudentService;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import javax.annotation.Resource;
  8. @Controller
  9. public class StudentController {
  10. @Resource
  11. public StudentService studentService;
  12. @RequestMapping("/student/query")
  13. @ResponseBody
  14. public String queryStudent(Integer id){
  15. Student student = studentService.queryStudent(id);
  16. return student.toString();
  17. }
  18. }

(9)连接数据库,需要application.properties配置

useUnicode使用unicode编码,characterEncoding字符集是utf-8,serverTimezone时区。

  1. server.port=9090
  2. server.servlet.context-path=/orm
  3. #连接数据库的配置
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
  6. spring.datasource.username=root
  7. spring.datasource.password=123

(10)执行结果

2. @MapperScan

如果有多个Dao接口,那么需要在每个Dao接口上都加入@Mapper注解,比较麻烦!

StudentDao接口

  1. package com.zl.dao;
  2. import com.zl.pojo.Student;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface StudentDao {
  6. // 根据id进行查询
  7. Student selectById(Integer id);
  8. }

UserDao接口

  1. package com.zl.dao;
  2. import com.zl.pojo.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface UserDao {
  6. // 根据id进行查询
  7. SUser selectById(Integer id);
  8. }

也可以在主类上(启动类上)添加注解包扫@MapperScan("com.zl.dao")

注:basePackages是一个String数组,可以写多个要扫描的包。

  1. package com.zl;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan(basePackages = "com.zl.dao")
  7. public class Application {
  8. public static void main(String[] args) {
  9. SpringApplication.run(Application.class, args);
  10. }
  11. }

细节:

如果我们导入一个项目,对于IDEA是不能识别resources的,图标如下:

右击鼠标----》Mark Directory as-----》 Resources Root即可

此时的图标如下: 

3. mapper文件和java代码分开管理

现在的xml文件和java代码是放在同一个包下管理的!

 也可以分开存储,把xml文件放到resources目录下!在resources下创建一个mapper目录,把所有的*.xml全都放进去;但是此时就找不到了,需要我们去配置指定。

 此时需要在application.properties文件里指定:

  1. #指定mapper文件的位置
  2. mybatis.mapper-locations=classpath:mapper/*.xml

注:此时低版本的Springboot可能出现application.properties文件没有编译到target/classes目录的情况下,此时就需要修改resources插件配置:

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <includes>
  5. <include>**/*.properties</include>
  6. <include>**/*.xml</include>
  7. </includes>
  8. </resource>
  9. </resources>

要想看到SQL语句的信息,需要在application.properties中添加日志框架

  1. #指定mybatis的日志,使用StdOutImpl输出到控制台
  2. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

此时就可以看到SQL语句的日志信息

4. 事务支持

Spring框架中的事务:

(1)使用管理事务的对象: 事务管理器(接口, 接口有很多的实现类)

例:使用Jdbc或mybatis访问数据库,使用的事务管理器:DataSourceTransactionManager

(2)声明式事务: 在xml配置文件或者使用注解说明事务控制的内容

控制事务: 隔离级别,传播行为, 超时时间等

(3)事务处理方式:

①Spring框架中的@Transactional;

②aspectj框架可以在xml配置文件中,声明事务控制的内容;

SpringBoot使用事务非常简单,底层依然采用的是 Spring 本身提供的事务管理

①在业务方法的上面加入@Transactional , 加入注解后,方法有事务功能了。

②在主启动类的上面 ,加入@EnableTransactionManager,开启事务支持。

注:只加上@Transactional也能完成事务的功能,对于@EnableTransactionManager建议也加上。

第一步:创建一个SpringBoot项目,引入:Spring Web、MybatisFramework、MySQL Driver

第二步:使用mybatis逆向工程插件生成个pojo类、dao接口

①添加Mybatis逆向工程的插件

注:这个插件是需要MySQL驱动依赖的,如果这里没有引入MySQL驱动的依赖,那么下面的generatorConfig.xml配置中就需要<classPathEntry>标签去指定连接数据库的JDBC驱动包所在位置,指定到你本机的完整路径 ,例如:<classPathEntry location="E:\mysql-connector-java-5.1.38.jar"/>。

  1. <!--mybatis逆向⼯程插件-->
  2. <plugin>
  3. <!--插件的GAV坐标-->
  4. <groupId>org.mybatis.generator</groupId>
  5. <artifactId>mybatis-generator-maven-plugin</artifactId>
  6. <version>1.4.1</version>
  7. <configuration>
  8. <!--配置文件的位置,放在项目根目录下必须指定一下-->
  9. <!--<configurationFile>GeneratorMapper.xml</configurationFile>-->
  10. <!--允许覆盖-->
  11. <overwrite>true</overwrite>
  12. </configuration>
  13. <!--插件的依赖-->
  14. <dependencies>
  15. <!--mysql驱动依赖-->
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <version>5.1.23</version>
  20. </dependency>
  21. </dependencies>
  22. </plugin>

②编写generatorConfig.xml配置文件

注:如果下面的generatorConfig.xml配置文件放到src的resources目录下,那么配置文件的名字必须是generatorConfig.xml(不区分大小写),并且不需要上面的<configurationFile>标签去指定。

注:如果我们把generatorConfig.xml配置文件直接放到项目的根目录下(和src同级目录),那么此时generatorConfig.xml配置文件的名字随意,但是必须使用上面的<configurationFile>标签去指定一下(两者保持一致即可)。

注:当然也可以不直接放到项目的根目录下,例如:放到src/main目录下,那么对于<configurationFile>标签就需要指定src/main/generatorConfig.xml(两者也要保持一致)

注:对于高版本的MySQL驱动,对于URL后面必须跟上时区,但是在xml中是无法识别&,所以需要使用&去替换,例如:

connectionURL="jdbc:mysql://localhost:3306/springdb?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=GMT%2B8"

最终会生成*.xml配置,要想让它最终编译后放到target/classes中,就需要配置处理资源目录

  1. <!--处理资源目录-->
  2. <resources>
  3. <resource>
  4. <directory>src/main/java</directory>
  5. <includes>
  6. <include>**/*.xml</include>
  7. <include>**/*.properties</include>
  8. </includes>
  9. </resource>
  10. <resource>
  11. <directory>src/main/resources</directory>
  12. <includes>
  13. <include>**/*.xml</include>
  14. <include>**/*.properties</include>
  15. </includes>
  16. </resource>
  17. </resources>

 generatorConfig.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <!-- 指定连接数据库的JDBC驱动包所在位置,如果前面插件中指定了,这里就不要指定了 -->
  7. <!--<classPathEntry location="E:\mysql-connector-java-5.1.38.jar"/>-->
  8. <!--
  9. targetRuntime有两个值:
  10. MyBatis3Simple:生成的是基础版,只有基本的增删改查。
  11. MyBatis3:生成的是增强版,除了基本的增删改查之外还有复杂的增删改查。
  12. -->
  13. <context id="DB2Tables" targetRuntime="MyBatis3Simple">
  14. <!--防止生成重复代码-->
  15. <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
  16. <commentGenerator>
  17. <!--是否去掉生成日期-->
  18. <property name="suppressDate" value="true"/>
  19. <!--是否去除注释-->
  20. <property name="suppressAllComments" value="true"/>
  21. </commentGenerator>
  22. <!--连接数据库信息-->
  23. <jdbcConnection driverClass="com.mysql.jdbc.Driver"
  24. connectionURL="jdbc:mysql://localhost:3306/springboot"
  25. userId="root"
  26. password="123">
  27. </jdbcConnection>
  28. <!-- 生成pojo包名和位置 -->
  29. <javaModelGenerator targetPackage="com.zl.pojo" targetProject="src/main/java">
  30. <!--是否开启子包-->
  31. <property name="enableSubPackages" value="true"/>
  32. <!--是否去除字段名的前后空白-->
  33. <property name="trimStrings" value="true"/>
  34. </javaModelGenerator>
  35. <!-- 生成SQL映射文件的包名和位置 -->
  36. <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
  37. <!--是否开启子包-->
  38. <property name="enableSubPackages" value="true"/>
  39. </sqlMapGenerator>
  40. <!-- 生成Mapper接口的包名和位置 -->
  41. <javaClientGenerator
  42. type="xmlMapper"
  43. targetPackage="com.zl.mapper"
  44. targetProject="src/main/java">
  45. <property name="enableSubPackages" value="true"/>
  46. </javaClientGenerator>
  47. <!-- 表名和对应的实体类名-->
  48. <table tableName="t_Student" domainObjectName="Student"/>
  49. </context>
  50. </generatorConfiguration>

双击插件,执行结果如下:

第三步:编写application.properties配置

注:如果StudentMapper.xml的目录与StudentMapper目录保持一致,就不需要以下这个配置mybatis.mapper-locations=classpath:mapper/*.xml;这里我们是自己定义的mapper目录,把mapper.xml文件放进去了,所以需要我们指定出来它的位置!

  1. #设置端口
  2. server.port=8082
  3. #配置项目根路径context-path
  4. server.servlet.context-path=/myboot
  5. #配置数据库
  6. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  7. spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
  8. spring.datasource.username=root
  9. spring.datasource.password=123
  10. #配置mybatis
  11. mybatis.mapper-locations=classpath:mapper/*.xml
  12. #配置日志
  13. mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

第四步:编写service接口和实现类

StudentService接口

  1. package com.zl.service;
  2. import com.zl.pojo.Student;
  3. public interface StudentService {
  4. int addStudent(Student student);
  5. }

StudentService接口的实现类StudentServiceImpl

  1. package com.zl.service.impl;
  2. import com.zl.mapper.StudentMapper;
  3. import com.zl.pojo.Student;
  4. import com.zl.service.StudentService;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Transactional;
  7. import javax.annotation.Resource;
  8. @Service // 交给Spring容器管理
  9. public class StudentServiceImpl implements StudentService {
  10. @Resource // 属性赋值
  11. private StudentMapper studentDao;
  12. @Transactional // 事务控制
  13. @Override
  14. public int addStudent(Student student) {
  15. System.out.println("准备执行sql语句");
  16. int count = studentDao.insert(student);
  17. System.out.println("已完成sql语句的执行");
  18. // 模拟异常,回滚事务
  19. int sum = 10 / 0;
  20. return count;
  21. }
  22. }

第五步:编写controller类去调用service

  1. package com.zl.controller;
  2. import com.zl.pojo.Student;
  3. import com.zl.service.StudentService;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import javax.annotation.Resource;
  8. @Controller
  9. public class StudentController {
  10. @Resource
  11. private StudentService studentService;
  12. @RequestMapping("/addStudent")
  13. @ResponseBody
  14. public String addStudent(String name,Integer age){
  15. Student s = new Student();
  16. s.setName(name);
  17. s.setAge(age);
  18. int count = studentService.addStudent(s);
  19. return "添加的Student个数是:"+count;
  20. }
  21. }

第六步:在启动类上面加上包扫描注解和启动事务管理器注解

  1. package com.zl;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.transaction.annotation.EnableTransactionManagement;
  6. @SpringBootApplication
  7. @MapperScan(basePackages = "com.zl.mapper") // 添加包扫描
  8. @EnableTransactionManagement // 启动事务管理器
  9. public class Application {
  10. public static void main(String[] args) {
  11. SpringApplication.run(Application.class, args);
  12. }
  13. }

第七步:进行测试

有异常发生,会回滚事务,无法插入数据

 无异常发生,正常插入数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/518241
推荐阅读
相关标签
  

闽ICP备14008679号