本篇主要介绍 SpringBoot集成MyBatis框架,以及使用mybatis框架进行简单的增删改查
1.ORM介绍 通俗点说”ORM思想”就是将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作,因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。目前最常用的ORM框架是Hibernate和Mybatis,SpringBoot默认集成Hibernate,如果需要集成Mybatis需要额外配置。
2.Mybatis介绍 ##简介
MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或者注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形式最终执行的SQL语句,最后将执行的SQL的结果映射成Java对象放回。
与其他的ORM框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis将会是一个不错的选择。
##MyBatis优点
1.SQL被统一提取出来,便于统一惯例和优化
2.SQL 和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试
3.提供映射标签,支持对象与数据库的 ORM 字段关系映射
4.提供对象关系映射标签,支持对象关系组件维护
5.灵活书写动态 SQL,支持各种条件来动态生成不同的 SQL
MyBatis缺点 1.编写 SQL 语句时工作量很大,尤其是字段多、关联表多时,更是如此
2.SQL 语句依赖于数据库,导致数据库移植性差
3.快速上手 3.1创建实体类User 1 2 3 4 5 6 7 public class User { private Integer id; private String name; private String address; private String sex; ..省略方法 }
3.2创建数据库 1 2 3 4 5 6 7 8 9 10 USE `test` ;DROP TABLE IF EXISTS `user` ;CREATE TABLE `user` ( `id` int (11 ) NOT NULL AUTO_INCREMENT, `name` varchar (32 ) NOT NULL , `address` varchar (32 ) NOT NULL , `sex` varchar (8 ) NOT NULL , PRIMARY KEY (`id` ) ) ENGINE =InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET =utf8; insert into `user` (`id` ,`name` ,`address` ,`sex` ) values (1 ,'jack' ,'BeiJing' ,'nv' ),(2 ,'tom' ,'Xi\' an',' na');
3.3引入相关包 1.MyBatis-Spring-Boot-Starter (依赖上面两个包)
mybatis-spring-boot-starter
主要提供了两种解决方案,一种是简化后的 XML 配置版,一种是使用注解解决一切问题。
1 2 3 4 5 6 <dependency > <groupId > org.mybatis.spring.boot</groupId > <artifactId > mybatis-spring-boot-starter</artifactId > <version > 1.3.1</version > </dependency >
2.commons-lang3(提供了很多工具类具体可参照文章https://blog.csdn.net/u012240455/article/details/79014224 )
1 2 3 4 5 <dependency > <groupId > org.apache.commons</groupId > <artifactId > commons-lang3</artifactId > <version > 3.6</version > </dependency >
3.4修改application.xml配置 添加:
1 2 3 mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=com.neo.entity
mybatis.config-locations:配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性。
mybatis.mapper-locations:配置 Mapper 对应的 XML 文件路径
mybatis.type-aliases-package:配置项目中实体类包路径
##3.5配置启动类
Spring Boot 启动时数据源会自动注入到 SqlSessionFactory 中,使用 SqlSessionFactory 构建 SqlSessionFactory,再自动注入到 Mapper 中,最后我们直接使用 Mapper 即可。
配置方式:
添加注解@MapperScan
1 2 3 4 5 6 7 8 9 10 @SpringBootApplication @EntityScan (basePackages="cn.itcast.sprintBootDemo.domain" )@EnableJpaRepositories (basePackages = {"cn.itcast.sprintBootDemo.repository" })@MapperScan ("cn.itcast.sprintBootDemo.mapper" )public class SprintBootDemoApplication { public static void main (String[] args) { SpringApplication.run(SprintBootDemoApplication.class , args ) ; } }
或者直接在 Mapper 类上面添加注解@Mapper
,建议使用上面那种,不然每个 Mapper 加个注解会很麻烦。
3.6在resource目录添加Mybatis.xml 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > <typeAliases > <typeAlias alias ="Integer" type ="java.lang.Integer" /> <typeAlias alias ="Long" type ="java.lang.Long" /> <typeAlias alias ="HashMap" type ="java.util.HashMap" /> <typeAlias alias ="LinkedHashMap" type ="java.util.LinkedHashMap" /> <typeAlias alias ="ArrayList" type ="java.util.ArrayList" /> <typeAlias alias ="LinkedList" type ="java.util.LinkedList" /> </typeAliases > </configuration >
3.7在mapper包下创建UserMapper接口 1 2 3 4 public interface UserMapper { List<User> findAll () ; User findUserById (Integer id) ; }
3.8创建UserMapper.xml 该文件的路径必须和对应的UserMapper.java文件在同一目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?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" > <?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 ="cn.itcast.sprintBootDemo.mapper.UserMapper" > <resultMap id ="BaseResultMap" type ="cn.itcast.sprintBootDemo.domain.User" > <id column ="id" property ="id" jdbcType ="BIGINT" /> <result column ="name" property ="name" jdbcType ="VARCHAR" /> <result column ="address" property ="address" jdbcType ="VARCHAR" /> <result column ="sex" property ="sex" jdbcType ="VARCHAR" /> </resultMap > <select id ="findAll" resultMap ="BaseResultMap" > SELECT * FROM `user`; </select > <select id ="findUserById" resultMap ="BaseResultMap" parameterType ="java.lang.Integer" > SELECT * from `user` where id = #{id}; </select > </mapper >
4.查询全部 刚才快速上手中的UserMapper接口中定义了两个查询功能,直接测试
1 2 3 4 5 6 7 8 9 10 11 12 13 @RunWith (SpringRunner.class ) @EntityScan (basePackages ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testUser () { List<User> users = userMapper.findAll(); System.out.println(users.size()); } }
这块的注解经常会报“could not autowire”,Eclipse 却没有问题,其实代码是正确的,这是 Idea 的误报。可以选择降低 Autowired 检测的级别,不要提示就好。
单击 File | Settings | Editor | Inspections 命令,使用搜索功能找到 Autowiring for Bean Class 选项,将 Severity 的级别由之前的 error 改成 warning 即可。
#5.根据条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 @RunWith (SpringRunner.class ) @EntityScan (basePackages ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testUser () { User user = userMapper.findUserById(1 ); System.out.println(user); } }
#6.添加/删除/修改
添加接口
添加配置文件
1 2 3 4 5 6 7 <insert id ="save" parameterType ="cn.itcast.sprintBootDemo.domain.User" > INSERT INTO `user` (name, address, sex) VALUES (#{name}, #{address}, #{sex}) </insert >
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @RunWith (SpringRunner.class ) @EntityScan (basePackages ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testSave () { User u = new User(); u.setAddress("河北" ); u.setSex("nan" ); u.setName("张三" ); userMapper.save(u); } }
7.注意事项 1.UserMapper.xml和UserMapper.java必须在同一目录中
2.UserMaper.xml的namespace的值是UserMapper接口的全路径
3.UserMapper.xml中的id值必须和UserMapper的接口中的方法对应