spring boot 整合 mybatis 以及原理
同上一篇文章一样,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
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.ibigsea</groupId>
- <artifactId>bootdao</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>bootdao</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <boot.version>1.3.1.RELEASE</boot.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <version>${boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
- <!-- mysql 驱动 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.38</version>
- </dependency>
- <!-- 数据库连接池 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.0.5</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <version>${boot.version}</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
是不是很方便,mybatis的starter pom里面依赖了mybatis和spring相关的jar
只需导入一个就OK了
这里采用的是阿里巴巴的druid数据连接池
为了方便使用 yml配置文件
application.yml
- ---
- spring:
- profiles : dev
- datasource:
- name: mydb
- type: com.alibaba.druid.pool.DruidDataSource
- url: jdbc:mysql://127.0.0.1:3306/mytestdb
- username: root
- password: 123456
- driver-class-name: com.mysql.jdbc.Driver
- minIdle: 1
- maxActive: 2
- initialSize: 1
- timeBetweenEvictionRunsMillis: 3000
- minEvictableIdleTimeMillis: 300000
- validationQuery: SELECT 'ZTM' FROM DUAL
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- mybatis:
- mapperLocations: classpath*:com/ibigsea/bootdao/mapper/*.xml
- typeAliasesPackage: com.ibigsea.bootdao.entity
User.java
- package com.ibigsea.bootdao.entity;
- import java.io.Serializable;
- public class User implements Serializable {
- private static final long serialVersionUID = 8809101560720973267L;
- private Integer id;
- private String userName;
- private Integer age;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", userName=" + userName + ", age=" + age + "]";
- }
- }
UserMapper.java
- package com.ibigsea.bootdao.mapper;
- import java.util.List;
- import org.apache.ibatis.annotations.Mapper;
- import com.ibigsea.bootdao.entity.User;
- @Mapper
- public interface UserMapper {
- int save(User user);
- User selectById(Integer id);
- int updateById(User user);
- int deleteById(Integer id);
- List<User> queryAll();
- }
- <p>UserMapper.xml</p>
- <?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="com.ibigsea.bootdao.mapper.UserMapper" >
- <insert id="save" parameterType="com.ibigsea.bootdao.entity.User">
- insert into t_user(username,age) values(#{userName,jdbcType=VARCHAR},#{age,jdbcType=NUMERIC})
- </insert>
- <select id="selectById" resultType="com.ibigsea.bootdao.entity.User">
- select * from t_user where id = #{id,jdbcType=NUMERIC}
- </select>
- <update id="updateById" parameterType="com.ibigsea.bootdao.entity.User">
- update t_user set
- username = #{userName,jdbcType=VARCHAR} ,
- age = #{age,jdbcType=NUMERIC}
- where id = #{id,jdbcType=NUMERIC}
- </update>
- <delete id="deleteById">
- delete from t_user where id = #{id,jdbcType=NUMERIC}
- </delete>
- <select id="queryAll" resultType="com.ibigsea.bootdao.entity.User">
- select * from t_user
- </select>
- </mapper>
启动类 App.class
- package com.ibigsea.bootdao;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- /**
- * Hello world!
- *
- */
- @SpringBootApplication
- //启注解事务管理
- @EnableTransactionManagement
- public class App {
- public static void main(String[] args) {
- System.out.println("Hello World!");
- }
- }
这里使用test来测试
- package com.ibigsea.bootdao;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.SpringApplicationConfiguration;
- import org.springframework.test.context.ActiveProfiles;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import com.ibigsea.bootdao.entity.User;
- import com.ibigsea.bootdao.mapper.UserMapper;
- @RunWith(SpringJUnit4ClassRunner.class)
- @SpringApplicationConfiguration(classes = {App.class})
- //相当于 --spring.profiles.active=dev
- @ActiveProfiles(value="dev")
- public class AppTest {
- @Autowired
- private UserMapper mapper;
- @Test
- public void testInsert(){
- User user = new User();
- user.setUserName("张三");
- user.setAge(23);
- mapper.save(user);
- System.out.println("插入用户信息"+user.getUserName());
- }
- }
运行结果:
Ok 数据库这边也有数据了
表结构这边就不提供了 , 就一个很简单的表 自己创建一个就可以了
查询:
- @Test
- public void testSelect(){
- User user = mapper.selectById(1);
- System.out.println(user);
- }
update
- @Test
- public void testUpdate(){
- User user = mapper.selectById(1);
- System.out.println(user);
- user.setAge(24);
- mapper.updateById(user);
- user = mapper.selectById(1);
- System.out.println(user);
- }
Mybatis相关的配置
MybatisAutoConfiguration
Spring boot 在运行的时候会进行自动配置
读取到 mybatis-spring-boot-autoconfigure 里面的spring.factories,然后自动配置
就是下面这个类
这个方法使用了PostConstruct注解,在初始化的时候去加载mybatis的配置文件,然后创建SqlSessionFactory等
Mybatis自动配置会自动创建 sqlSessionFactory和SqlSessionTemplate
这个东西 就是 加载在注解了@Mapper的类
如果不喜欢在mapper上面加注解的话,也可以通过@MapperScan
这样子:
这样就OK啦
关于事务方面
在启动类上面添加
@EnableTransactionManagement注解
然后在类上面或者方法上面添加@Transactional注解
- package com.ibigsea.bootdao.service;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import com.ibigsea.bootdao.entity.User;
- import com.ibigsea.bootdao.mapper.UserMapper;
- @Service("userService")
- //在方法和类上面都可以
- @Transactional
- public class UserService {
- @Autowired
- private UserMapper mapper;
- public void insetUser() throws Exception {
- User user = new User();
- user.setUserName("李四");
- user.setAge(23);
- mapper.save(user);
- System.out.println("插入用户信息"+user.getUserName());
- if (user.getUserName().equals("李四")) {
- throw new IllegalArgumentException("出现异常QAQ");
- }
- user = new User();
- user.setUserName("李四11111");
- user.setAge(23);
- mapper.save(user);
- }
- }
测试类
- @RunWith(SpringJUnit4ClassRunner.class)
- @SpringApplicationConfiguration(classes = {App.class})
- //相当于 --spring.profiles.active=dev
- @ActiveProfiles(value="dev")
- @EnableTransactionManagement
- public class AppTest {
- @Autowired
- private UserService userService;
- @Test
- public void testTransactional() throws Exception {
- userService.insetUser();
- }
- }
数据库结果
我们吧@Transactional注解去掉 或者去掉 @EnableTransactionManagement注解
测试下看看
数据被插入~~~~~
spring boot 整合 mybatis 以及原理的更多相关文章
- Spring Boot系列(三):Spring Boot整合Mybatis源码解析
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题
现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...
- Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider
Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包
- Spring Boot整合MyBatis(非注解版)
Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...
- Spring Boot整合Mybatis完成级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- 太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?
Spring boot 整合 Mybatis Druid并配置监控 添加依赖 <!--druid--> <dependency> <groupId>com.alib ...
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...
- Spring boot整合Mybatis
时隔两个月的再来写博客的感觉怎么样呢,只能用“棒”来形容了.闲话少说,直接入正题,之前的博客中有说过,将spring与mybatis整个后开发会更爽,基于现在springboot已经成为整个业界开发主 ...
随机推荐
- c++课设学生成绩与学籍管理系统
题目要求(手打,累):设计一个类CStudent,类中包含一个学生的基本数据如下: 编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩. 并假设编号为整数,且从1号往后连续编码:姓名为字符串,性别 ...
- NOIP需要掌握的内容(大致
1.排序算法(快排.选择.冒泡.堆排序.二叉排序树.桶排序)2.DFS/BFS 剪枝 哈希表3.树 ①遍历 ②二叉树 ③二叉排序树(查找.生成.删除) ④堆(二叉堆.左偏树.堆排序) ...
- Sort Array By Parity LT905
Given an array A of non-negative integers, return an array consisting of all the even elements of A, ...
- apicloud模块开发知识点
1. 没有加模块的时候dex里面的包 \android\support\annotation \android\support\v4 \com\uzmap\pkg \compile 2. 不能混淆的类 ...
- 校园网ipv6连接问题
没有ipv6的信号:只需要进入网络适配器里面先禁用再启用即可.
- Ubuntu服务器如何搭建PPTPD(原创保证可用)
Ubuntu是一款基于linux的操作系统,无需许可和订购的费用,Ubuntu Server可以帮助您高效地扩展您的数据中心.它精简的架构和自动化部署的能力让您只需花费更少的运算能力和资源,便可提供更 ...
- spring学习 六 spring与mybatis整合
在mybatis学习中有两种配置文件 :全局配置文件,映射配置文件.mybatis和spring整合,其实就是把mybatis中的全局配置文件的配置内容都变成一个spring容器的一个bean,让sp ...
- spring学习 四 对象的创建
spring中,有三种创建对象的方式 (1)构造创建 (2)实例工厂构造 (3)静态工厂构造 一 构造器创建 在构造器创建对象时,有无参构造和有参构造 两种 (1)在spring中,默认的是无参构造 ...
- BP神经网络的参数改进参考?
参考文献:黄巧巧. 基于BP神经网络的手写数字识别系统研究[D].华中师范大学,2009. 47-52 BP神经网络的缺陷:收敛速度慢和局部极小点的问题 使用的改进方案有 1. 学习速率(learn ...
- 扩展方法(深入理解c#)
1. 静态类到扩展方法: 许多方法可能都适合转为扩展方法,只要具有以下特征: 1)你想为一个类型添加一些成员: 2)你不需要为类型的实例添加更多的数据: 3)你不能改变类型本身,因为是别人的代码 2. ...