同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 mybatis时的SqlSessionFactoryBean都没看到,那spring boot 把这些参数都放在了 mybatis-spring boot autoconfigure.jar 包中的MybatisAutoConfiguration 这个类中,使用 @ConditionalOnMissingBean这个注解,当环境中缺少 sqlsessionFactory sqlsessionTemplate时会自动注入

Example

使用spring boot 的starter pom

需要导入 mybatis-spring-boot-starter 和 数据库连接相关的配置

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.ibigsea</groupId>
  5. <artifactId>bootdao</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>bootdao</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <boot.version>1.3.1.RELEASE</boot.version>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-web</artifactId>
  18. <version>${boot.version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.mybatis.spring.boot</groupId>
  22. <artifactId>mybatis-spring-boot-starter</artifactId>
  23. <version>1.1.1</version>
  24. </dependency>
  25. <!-- mysql 驱动 -->
  26. <dependency>
  27. <groupId>mysql</groupId>
  28. <artifactId>mysql-connector-java</artifactId>
  29. <version>5.1.38</version>
  30. </dependency>
  31. <!-- 数据库连接池 -->
  32. <dependency>
  33. <groupId>com.alibaba</groupId>
  34. <artifactId>druid</artifactId>
  35. <version>1.0.5</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-test</artifactId>
  40. <version>${boot.version}</version>
  41. <scope>test</scope>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-maven-plugin</artifactId>
  49. </plugin>
  50. </plugins>
  51. </build>
  52. </project>

是不是很方便,mybatis的starter pom里面依赖了mybatis和spring相关的jar

只需导入一个就OK了

这里采用的是阿里巴巴的druid数据连接池

为了方便使用 yml配置文件

application.yml

  1. ---
  2. spring:
  3. profiles : dev
  4. datasource:
  5. name: mydb
  6. type: com.alibaba.druid.pool.DruidDataSource
  7. url: jdbc:mysql://127.0.0.1:3306/mytestdb
  8. username: root
  9. password: 123456
  10. driver-class-name: com.mysql.jdbc.Driver
  11. minIdle: 1
  12. maxActive: 2
  13. initialSize: 1
  14. timeBetweenEvictionRunsMillis: 3000
  15. minEvictableIdleTimeMillis: 300000
  16. validationQuery: SELECT 'ZTM' FROM DUAL
  17. testWhileIdle: true
  18. testOnBorrow: false
  19. testOnReturn: false
  20. mybatis:
  21. mapperLocations: classpath*:com/ibigsea/bootdao/mapper/*.xml
  22. typeAliasesPackage: com.ibigsea.bootdao.entity

User.java

  1. package com.ibigsea.bootdao.entity;
  2. import java.io.Serializable;
  3. public class User implements Serializable {
  4. private static final long serialVersionUID = 8809101560720973267L;
  5. private Integer id;
  6. private String userName;
  7. private Integer age;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public void setUserName(String userName) {
  18. this.userName = userName;
  19. }
  20. public Integer getAge() {
  21. return age;
  22. }
  23. public void setAge(Integer age) {
  24. this.age = age;
  25. }
  26. @Override
  27. public String toString() {
  28. return "User [id=" + id + ", userName=" + userName + ", age=" + age + "]";
  29. }
  30. }

UserMapper.java

  1. package com.ibigsea.bootdao.mapper;
  2. import java.util.List;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import com.ibigsea.bootdao.entity.User;
  5. @Mapper
  6. public interface UserMapper {
  7. int save(User user);
  8. User selectById(Integer id);
  9. int updateById(User user);
  10. int deleteById(Integer id);
  11. List<User> queryAll();
  12. }
  1. <p>UserMapper.xml</p>
  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.ibigsea.bootdao.mapper.UserMapper" >
  4. <insert id="save" parameterType="com.ibigsea.bootdao.entity.User">
  5. insert into t_user(username,age) values(#{userName,jdbcType=VARCHAR},#{age,jdbcType=NUMERIC})
  6. </insert>
  7. <select id="selectById" resultType="com.ibigsea.bootdao.entity.User">
  8. select * from t_user where id = #{id,jdbcType=NUMERIC}
  9. </select>
  10. <update id="updateById" parameterType="com.ibigsea.bootdao.entity.User">
  11. update t_user set
  12. username = #{userName,jdbcType=VARCHAR} ,
  13. age = #{age,jdbcType=NUMERIC}
  14. where id = #{id,jdbcType=NUMERIC}
  15. </update>
  16. <delete id="deleteById">
  17. delete from t_user where id = #{id,jdbcType=NUMERIC}
  18. </delete>
  19. <select id="queryAll" resultType="com.ibigsea.bootdao.entity.User">
  20. select * from t_user
  21. </select>
  22. </mapper>

启动类 App.class

  1. package com.ibigsea.bootdao;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. /**
  4. * Hello world!
  5. *
  6. */
  7. @SpringBootApplication
  8. //启注解事务管理
  9. @EnableTransactionManagement
  10. public class App {
  11. public static void main(String[] args) {
  12. System.out.println("Hello World!");
  13. }
  14. }

这里使用test来测试

  1. package com.ibigsea.bootdao;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.SpringApplicationConfiguration;
  6. import org.springframework.test.context.ActiveProfiles;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. import com.ibigsea.bootdao.entity.User;
  9. import com.ibigsea.bootdao.mapper.UserMapper;
  10. @RunWith(SpringJUnit4ClassRunner.class)
  11. @SpringApplicationConfiguration(classes = {App.class})
  12. //相当于  --spring.profiles.active=dev
  13. @ActiveProfiles(value="dev")
  14. public class AppTest {
  15. @Autowired
  16. private UserMapper mapper;
  17. @Test
  18. public void testInsert(){
  19. User user = new User();
  20. user.setUserName("张三");
  21. user.setAge(23);
  22. mapper.save(user);
  23. System.out.println("插入用户信息"+user.getUserName());
  24. }
  25. }

运行结果:

Ok 数据库这边也有数据了

表结构这边就不提供了 , 就一个很简单的表 自己创建一个就可以了

查询:

  1. @Test
  2. public void testSelect(){
  3. User user = mapper.selectById(1);
  4. System.out.println(user);
  5. }


update

  1. @Test
  2. public void testUpdate(){
  3. User user = mapper.selectById(1);
  4. System.out.println(user);
  5. user.setAge(24);
  6. mapper.updateById(user);
  7. user = mapper.selectById(1);
  8. System.out.println(user);
  9. }

Mybatis相关的配置

MybatisAutoConfiguration

Spring boot 在运行的时候会进行自动配置

读取到 mybatis-spring-boot-autoconfigure 里面的spring.factories,然后自动配置

就是下面这个类

这个方法使用了PostConstruct注解,在初始化的时候去加载mybatis的配置文件,然后创建SqlSessionFactory

Mybatis自动配置会自动创建 sqlSessionFactorySqlSessionTemplate

这个东西 就是 加载在注解了@Mapper的类

如果不喜欢在mapper上面加注解的话,也可以通过@MapperScan

这样子:

这样就OK啦

关于事务方面

在启动类上面添加

@EnableTransactionManagement注解

然后在类上面或者方法上面添加@Transactional注解

  1. package com.ibigsea.bootdao.service;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import org.springframework.transaction.annotation.Transactional;
  5. import com.ibigsea.bootdao.entity.User;
  6. import com.ibigsea.bootdao.mapper.UserMapper;
  7. @Service("userService")
  1. //在方法和类上面都可以
  2. @Transactional
  3. public class UserService {
  4. @Autowired
  5. private UserMapper mapper;
  6. public void insetUser() throws Exception {
  7. User user = new User();
  8. user.setUserName("李四");
  9. user.setAge(23);
  10. mapper.save(user);
  11. System.out.println("插入用户信息"+user.getUserName());
  12. if (user.getUserName().equals("李四")) {
  13. throw new IllegalArgumentException("出现异常QAQ");
  14. }
  15. user = new User();
  16. user.setUserName("李四11111");
  17. user.setAge(23);
  18. mapper.save(user);
  19. }
  20. }

测试类

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(classes = {App.class})
  3. //相当于  --spring.profiles.active=dev
  4. @ActiveProfiles(value="dev")
  5. @EnableTransactionManagement
  6. public class AppTest {
  7. @Autowired
  8. private UserService userService;
  9. @Test
  10. public void testTransactional() throws Exception {
  11. userService.insetUser();
  12. }
  13. }

数据库结果

我们吧@Transactional注解去掉 或者去掉 @EnableTransactionManagement注解

测试下看看

数据被插入~~~~~

spring boot 整合 mybatis 以及原理的更多相关文章

  1. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

  2. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  3. Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题

    现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...

  4. Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包

  5. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  6. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  7. 太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

    Spring boot 整合 Mybatis Druid并配置监控 添加依赖 <!--druid--> <dependency> <groupId>com.alib ...

  8. Spring Boot 整合 Mybatis 实现 Druid 多数据源详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...

  9. Spring boot整合Mybatis

    时隔两个月的再来写博客的感觉怎么样呢,只能用“棒”来形容了.闲话少说,直接入正题,之前的博客中有说过,将spring与mybatis整个后开发会更爽,基于现在springboot已经成为整个业界开发主 ...

随机推荐

  1. 搭建自己的代理服务 proxy nginx squid ss5 s(shadow)s(socks)

    标签: nginx / squid / 负载均衡 / ss 4090 1. nginx (forward) nginx自己熟悉,经常用来做负载均衡的反向代理, 这里搭建一个正向代理(forward) ...

  2. Android.PublishApplication

    发布应用 3. 为App签名 Android 要求App在安装前,需要使用证书(certificate)来进行数字签名(be digitally signed). Android 用证书来标识一个Ap ...

  3. [Groovy] 创建Excel,追加Excel

    package ScriptLibrary import java.awt.Color import java.awt.GraphicsConfiguration.DefaultBufferCapab ...

  4. jquery单行文字上下循环滚动

    html代码: <div class="box"> <div class="t_news"> <b>已关联奖励账号.昵称:& ...

  5. .net调用word转换pdf出现80080005错误的解决办法

    检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005. 1:在服务器上安装offi ...

  6. 嵌入式C编程代码优化笔记

    [优化永远是追求某种平衡而不是走极端,优化是有侧重点的,优化是一门平衡的艺术,它往往要以牺牲程序的可读性或者增加代码长度为代价] 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆 ...

  7. mysql 5.7 linux环境下解压安装

    在CentOS linux环境安装mysql 一般rpm(或者yum),预编译和源码安装. 如果采用rpm或者yum安装,mysql的数据文件一般存放在/var/lib/mysql目录下,也就是会把d ...

  8. hibernate 的evict 和clear

    摘自百度知道:http://zhidao.baidu.com/question/63663640.html 问: 先创建一个Student,然后调用session.save方法,然后再调用evict方 ...

  9. 如何查看Python内置模块的实现代码

    方法1:使用help(random) >>> import random >>> help(random) Help on module random: NAME ...

  10. 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...