SpringBoot整合Mybatis

mybatis

ORM框架.几个重要的概念:

  • Mapper配置 : 可以使用基于XML的Mapper配置文件来实现,也可以使用基于Java注解的Mybatis注解来实现,甚至可以直接使用Mybatis提供的API实现.
  • Mapper接口 : 自行定义的一个数据操作接口,也就是通常说的DAO接口.早期接口需要自己自定义实现,现在Mybatis会自动为Mpper接口创建动态代理对象. Mapper接口的方法通常与Mapper配置文件中的select,insert,update,delete等XML结点存在--对应关系
  • Executor : Mybatis中所有的Mapper语句都是通过Executor进行的,Executor是Mybatis的一个核心接口.
  • SqlSession : 是Mybatis的关键对象,是执行持久化操作的独享.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession案例来直接执行被映射的SQL语句.
  • SqlSessionFactory : 是Mybatis的关键对象,是单个数据库映射关系经过编译后的内存镜像. SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象获得,而SqlSessionFactoryBuilder则可以从XML配置文件和一个预先定制的Configuration的实例构建出来.

工作流程 :

  • 首先加载 Mapper 配置的 SQL 映射文件,或者是注解的相关 SQL 内容。
  • 创建会话工厂,MyBatis 通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。
  • 创建会话。根据会话工厂,MyBatis 就可以通过它来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含了对数据库操作的增、删、改、查方法。
  • 创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。
  • 封装 SQL 对象。在这一步,执行器将待处理的 SQL 信息封装到一个对象中(MappedStatement),该对象包括 SQL 语句、输入参数映射信息(Java 简单类型、HashMap 或 POJO)和输出结果映射信息(Java 简单类型、HashMap 或 POJO)。
  • 操作数据库。拥有了执行器和 SQL 信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。

加载接口,SqlSessionFactoryBuilder构建SqlSessionFactory,SqlSessionFactory创建爱你Sqsession,SqlSession创建Executor,Executor封装SQL对象,最后再操作数据库,返回操作结果,结束.

SpringBoot集成Mybatis
  1. 引入依赖
  1. <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId>
  5. <version>2.0.0</version>
  6. </dependency>
  1. 添加配置
  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.jdbc.Driver
  4. url: jdbc:mysql://39.105.167.131:3306/smile_boot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
  5. username: root
  6. password: Nrblwbb7$
  7. mybatis:
  8. config-location: classpath:mybatis/mybatis-config.xml
  9. mapper-locations: classpath:mybatis/mapper/*.xml
  10. type-aliases-package: con.mybatis.springboot_mybatis.model
  • mybatis.config-location,配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性;
  • mybatis.mapper-locations,配置 Mapper 对应的 XML 文件路径;
  • mybatis.type-aliases-package,配置项目中实体类包路径;
  • spring.datasource.*,数据源配置。

Spring Boot 启动时数据源会自动注入到 SqlSessionFactory 中,使用 SqlSessionFactory 构建 SqlSession,再自动注入到 Mapper 中,最后我们直接使用 Mapper 即可。

  1. 启动类添加注解
  1. @SpringBootApplication
  2. @MapperScan("com.mybatis.springboot_mybatis.mapper")
  3. public class SpringbootMybatisApplication {
  4. }
  1. mybatis-config.xml的配置

mybatis-config.xml 主要配置常用的 typeAliases,设置类型别名,为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <typeAliases>
  5. <typeAlias alias="Integer" type="java.lang.Integer" />
  6. <typeAlias alias="Long" type="java.lang.Long" />
  7. <typeAlias alias="HashMap" type="java.util.HashMap" />
  8. <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
  9. <typeAlias alias="ArrayList" type="java.util.ArrayList" />
  10. <typeAlias alias="LinkedList" type="java.util.LinkedList" />
  11. </typeAliases>
  12. </configuration>
  1. 编写代码进行测试

model类(也就是实体类,对性别进行了枚举)


  1. public class User implements Serializable {
  2. private static final long serialVersionUID = 1L;
  3. private Long id;
  4. private String userName;
  5. private String passWord;
  6. private UserSexEnum userSex;
  7. private String nickName;
  8. public User() {
  9. super();
  10. }
  11. public User(String userName, String passWord, UserSexEnum userSex) {
  12. super();
  13. this.passWord = passWord;
  14. this.userName = userName;
  15. this.userSex = userSex;
  16. }
  17. public Long getId() {
  18. return id;
  19. }
  20. public void setId(Long id) {
  21. this.id = id;
  22. }
  23. public String getUserName() {
  24. return userName;
  25. }
  26. public void setUserName(String userName) {
  27. this.userName = userName;
  28. }
  29. public String getPassWord() {
  30. return passWord;
  31. }
  32. public void setPassWord(String passWord) {
  33. this.passWord = passWord;
  34. }
  35. public UserSexEnum getUserSex() {
  36. return userSex;
  37. }
  38. public void setUserSex(UserSexEnum userSex) {
  39. this.userSex = userSex;
  40. }
  41. public String getNickName() {
  42. return nickName;
  43. }
  44. public void setNickName(String nickName) {
  45. this.nickName = nickName;
  46. }
  47. @Override
  48. public String toString() {
  49. return "UserEntity{" +
  50. "id=" + id +
  51. ", userName='" + userName + '\'' +
  52. ", passWord='" + passWord + '\'' +
  53. ", userSex=" + userSex +
  54. ", nickName='" + nickName + '\'' +
  55. '}';
  56. }
  57. }

枚举类:

  1. public enum UserSexEnum {
  2. MAN, WOMAN
  3. }

操作类(也就是实体的简化类还有其他的分页实体类,也就是平常所说的vm):

  1. public class UserParam extends PageParam{
  2. private String userName;
  3. private String userSex;
  4. public String getUserName() {
  5. return userName;
  6. }
  7. public void setUserName(String userName) {
  8. this.userName = userName;
  9. }
  10. public String getUserSex() {
  11. return userSex;
  12. }
  13. public void setUserSex(String userSex) {
  14. this.userSex = userSex;
  15. }
  16. }

  1. public class PageParam {
  2. private int beginLine; //起始行
  3. private Integer pageSize = 3;
  4. private Integer currentPage=0; // 当前页
  5. public int getBeginLine() {
  6. return pageSize*currentPage;
  7. }
  8. public Integer getPageSize() {
  9. return pageSize;
  10. }
  11. public void setPageSize(Integer pageSize) {
  12. this.pageSize = pageSize;
  13. }
  14. public Integer getCurrentPage() {
  15. return currentPage;
  16. }
  17. public void setCurrentPage(Integer currentPage) {
  18. this.currentPage = currentPage;
  19. }
  20. @Override
  21. public String toString() {
  22. return "PageParam{" +
  23. "beginLine=" + beginLine +
  24. ", pageSize=" + pageSize +
  25. ", currentPage=" + currentPage +
  26. '}';
  27. }
  28. }

0代表第一页,1代表第2页

mapper类 :

  1. public interface UserMapper {
  2. List<User> getAll();
  3. List<User> getList(UserParam userParam);
  4. int getCount(UserParam userParam);
  5. User getOne(Long id);
  6. void insert(User user);
  7. int update(User user);
  8. int delete(Long id);
  9. }

mapper的xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.mybatis.springboot_mybatis.mapper.UserMapper" >
  4. <resultMap id="BaseResultMap" type="com.mybatis.springboot_mybatis.model.User" >
  5. <id column="id" property="id" jdbcType="BIGINT" />
  6. <result column="userName" property="userName" jdbcType="VARCHAR" />
  7. <result column="passWord" property="passWord" jdbcType="VARCHAR" />
  8. <result column="user_sex" property="userSex" javaType="com.mybatis.springboot_mybatis.enums.UserSexEnum"/>
  9. <result column="nick_name" property="nickName" jdbcType="VARCHAR" />
  10. </resultMap>
  11. <sql id="Base_Column_List" >
  12. id, userName, passWord, user_sex, nick_name
  13. </sql>
  14. <sql id="Base_Where_List">
  15. <if test="userName != null and userName != ''">
  16. and userName = #{userName}
  17. </if>
  18. <if test="userSex != null and userSex != ''">
  19. and user_sex = #{userSex}
  20. </if>
  21. </sql>
  22. <select id="getAll" resultMap="BaseResultMap" >
  23. SELECT
  24. <include refid="Base_Column_List" />
  25. FROM users
  26. </select>
  27. <select id="getList" resultMap="BaseResultMap" parameterType="com.mybatis.springboot_mybatis.param.UserParam">
  28. select
  29. <include refid="Base_Column_List" />
  30. from users
  31. where 1=1
  32. <include refid="Base_Where_List" />
  33. order by id desc
  34. limit #{beginLine} , #{pageSize}
  35. </select>
  36. <select id="getCount" resultType="Integer" parameterType="com.mybatis.springboot_mybatis.param.UserParam">
  37. select
  38. count(1)
  39. from users
  40. where 1=1
  41. <include refid="Base_Where_List" />
  42. </select>
  43. <select id="getOne" parameterType="Long" resultMap="BaseResultMap" >
  44. SELECT
  45. <include refid="Base_Column_List" />
  46. FROM users
  47. WHERE id = #{id}
  48. </select>
  49. <insert id="insert" parameterType="com.mybatis.springboot_mybatis.model.User" >
  50. INSERT INTO
  51. users
  52. (userName,passWord,user_sex)
  53. VALUES
  54. (#{userName}, #{passWord}, #{userSex})
  55. </insert>
  56. <update id="update" parameterType="com.mybatis.springboot_mybatis.model.User" >
  57. UPDATE
  58. users
  59. SET
  60. <if test="userName != null">userName = #{userName},</if>
  61. <if test="passWord != null">passWord = #{passWord},</if>
  62. nick_name = #{nickName}
  63. WHERE
  64. id = #{id}
  65. </update>
  66. <delete id="delete" parameterType="Long" >
  67. DELETE FROM
  68. users
  69. WHERE
  70. id =#{id}
  71. </delete>
  72. </mapper>

注意修改自己的包名和接口路径等等,这里不考虑多数据源,多数据源看pdf

测试类

  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class MybatisXmlTest {
  4. @Resource
  5. private UserMapper userMapper;
  6. @Test
  7. public void testInsert() {
  8. userMapper.insert(new User("aa", "a123456", UserSexEnum.MAN));
  9. userMapper.insert(new User("bb", "b123456", UserSexEnum.WOMAN));
  10. userMapper.insert(new User("cc", "b123456", UserSexEnum.WOMAN));
  11. Assert.assertEquals(3, userMapper.getAll().size());
  12. }
  13. @Test
  14. public void testUpdate() {
  15. long id=1l;
  16. User user = userMapper.getOne(id);
  17. if(user!=null){
  18. System.out.println(user.toString());
  19. user.setNickName("wzlove");
  20. userMapper.update(user);
  21. Assert.assertTrue(("wzlove".equals(userMapper.getOne(id).getNickName())));
  22. }else {
  23. System.out.println("not find user id="+id);
  24. }
  25. }
  26. @Test
  27. public void testDelete() {
  28. int count=userMapper.delete(3l);
  29. if(count>0){
  30. System.out.println("delete is sucess");
  31. }else {
  32. System.out.println("delete if failed");
  33. }
  34. }
  35. @Test
  36. public void findAll(){
  37. UserParam userParam = new UserParam();
  38. userParam.setCurrentPage(0);
  39. userParam.setPageSize(1);
  40. List<User> list = userMapper.getList(userParam);
  41. System.out.println(list.get(0));
  42. Assert.assertEquals(1,list.size());
  43. }
  44. }

源码请查看 : https://github.com/MissWangLove/SpringBoot

SpringBoot整合Mybatis之xml的更多相关文章

  1. SpringBoot 整合 Mybatis + Mysql——XML配置方式

    一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...

  2. SpringBoot整合MyBatis之xml配置

    现在业界比较流行的数据操作层框架 MyBatis,下面就讲解下 Springboot 如何整合 MyBatis,这里使用的是xml配置SQL而不是用注解.主要是 SQL 和业务代码应该隔离,方便和 D ...

  3. SpringBoot系列-整合Mybatis(XML配置方式)

    目录 一.什么是 MyBatis? 二.整合方式 三.实战 四.测试 本文介绍下SpringBoot整合Mybatis(XML配置方式)的过程. 一.什么是 MyBatis? MyBatis 是一款优 ...

  4. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

  5. springboot整合mybatis时无法读取xml文件解决方法(必读)

    转    http://baijiahao.baidu.com/s?id=1588136004120071836&wfr=spider&for=pc 在springboot整合myba ...

  6. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  7. SpringBoot整合Mybatis【非注解版】

    接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 ​ 选择Spring Initializr,配置JDK版本 ​ 输入项目名 ​ 选择构建web项目所需的state ...

  8. springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)

    这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...

  9. springboot整合mybatis出现的一些问题

    springboot整合mybatis非常非常的简单,简直简单到发指.但是也有一些坑,这里我会详细的指出会遇到什么问题,并且这些配置的作用 整合mybatis,无疑需要mapper文件,实体类,dao ...

随机推荐

  1. 网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践

    基础问题回答 (1)杀软是如何检测出恶意代码的? 答:分析恶意程序的行为特征,分析其代码流将其性质归类于恶意代码. (2)免杀是做什么? 答:一般是对恶意软件做处理,让它不被杀毒软件所检测,也是渗透测 ...

  2. 20155216 Exp5 MSF基础应用

    Exp5 MSF基础应用 基础问题回答 1.用自己的话解释什么是exploit,payload,encode? exploit : Exploit的英文意思就是利用,在做攻击时,通常称为漏洞利用. 一 ...

  3. TPM及TSS协议栈的安装使用

    TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ...

  4. JavaScript 变量提升

    变量提升(Hoisting):在ES6之前,函数声明和变量声明总是被JavaScript解释器隐式地提升(hoist)到包含他们的作用域的最顶端. 注意: 1. JavaScript 仅提升声明,而不 ...

  5. 计算机基础知识 一 Basic knowledge of computers One

    计算机硬件由CPU(Central Processing Unit).存储器.输入设备.输出设备组成. CPU通常由控制单元(控制器)和算数逻辑单元(运算器)组成. 运算器:负责进行算数运算和逻辑运算 ...

  6. webstorm开发微信小程序代码提醒(webstorm开发工具)

    使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: File---sett ...

  7. PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789177.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  8. Python学习-将Python3.3.4还原成Python2.6版本

    http://blog.csdn.net/dream_angel_z/article/details/45724515

  9. HDU Ignatius's puzzle

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1098] 分析: 数学归纳法 f(1) = 18 + ka; 假设f(x) = 5x^13+13x^5+k ...

  10. [沈航软工教学] 学生项目Coding地址汇总

    同学们把自己的coding主页链接贴在评论里,要求格式"班号+学号+coding主页链接",如: "1301+13061193 + https://coding.net/ ...