SpringBoot整合mybatis
1 版本说明
springboot:2.0
jdk:1.8
2 创建springBoot项目
创建项目时勾选必要web,MySQL,mybatis相关依赖
创建完成后再pom文件中添加自动部署、lombok相关依赖
2.1 编写测试类
技巧01:项目创建成功后先将mybatis和mysql相关的jar注释掉,在到控制层中创建一个简单的测试类来确认项目是否创建成功
复制代码
package cn.test.demo.mybatis_demo02.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
-
@author 王杨帅
-
@create 2018-04-08 7:53
-
@desc 控制层测试类
**/
@RestController
@RequestMapping(value = "/test")
public class TestController {@GetMapping(value = "/test01")
public String test01() {
return "HELLO BOY";
}
}
复制代码
2.2 配置文件信息
复制代码
server.port=9999
server.servlet.path=/dev
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/testdemo?useUnicode=true&characterEncoding=UTF-8&&useSSL=false
jdbc.username=root
jdbc.password=root
mabatis_config_file=mybatis-config.xml
mapper_path=/mapper/**.xml
entity_package=cn.test.demo.mybatis_demo02.entity
复制代码
3 创建数据库
根据springboot的配置信息,创建一个数据库;并在数据库中创建一个表
技巧01:必须在springboot配置文件中配置的那个数据库中进行数据表的创建
复制代码
/*
Navicat MySQL Data Transfer
Source Server : mysql5.4
Source Server Version : 50540
Source Host : localhost:3306
Source Database : testdemo
Target Server Type : MYSQL
Target Server Version : 50540
File Encoding : 65001
Date: 2018-04-08 13:33:08
*/
SET FOREIGN_KEY_CHECKS=0;
-- Table structure for tb_area
DROP TABLE IF EXISTS tb_area
;
CREATE TABLE tb_area
(
area_id
int(2) NOT NULL AUTO_INCREMENT,
area_name
varchar(200) NOT NULL,
priority
int(2) NOT NULL DEFAULT '0',
create_time
datetime NOT NULL,
last_edit_time
datetime NOT NULL,
PRIMARY KEY (area_id
)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
-- Records of tb_area
INSERT INTO tb_area
VALUES ('1', '东苑', '0', '2018-03-07 08:50:37', '2018-04-08 13:28:58');
INSERT INTO tb_area
VALUES ('2', '南苑', '1', '2018-04-08 09:44:48', '2018-04-08 09:44:48');
复制代码
4 创建实体类
技巧01:可以利用mybatis提供的生成器来自动生成entity、dao、xml、service、controller对应的代码,具体步骤请参见上一篇博文
技巧02:在编写代码时可以开启代码提示
View Code
5 配置部分
5.1 POM配置
保证pom.xml文件中有mybatis、mysql、mysql驱动这三个对应的依赖
复制代码
复制代码
5.2 mybatis相关配置
在ersources文件夹中创建一个mybatis-config.xml文件用来mybatis相关的配置
技巧01:在项目启动的时候会自动加载resources中的文件进行全局的配置,所有mybatis的配置文件也会被加载
5.2.1
开启JDBC的getGeneratedKeys获取数据库自增主键,即:当我们新增一条数据时会自动设置主键值
5.2.2
使用列标签替换列别名
5.2.3
开启驼峰转换,即:数据库中的字段名全部是小写和下划线组成,实体类中的属性全部使用驼峰原则时他们之间就会是一一对应的关系
复制代码
5.3.1 创建一个DataSourceConfiguration类来配置DataSource
注意:类名可以随便取
技巧01:在启动类同一级别或启动类下面级别的地方创建一个config包来存放java配置类
技巧02:java配置类需要在类上添加@Configuration注解来指明该类是一个配置类
技巧03:DataSourceConfiguration配置类说明
》生成一个DataSource实例并注入到Bean容器中
技巧01:向数据库连接信息,我们可以把它放到springboot的全局配置文件中去,然后在需要用到的地方通过@Value注解来获取获取,这样就可以做到一改全改的作用
技巧02:DataSource配置类上还需要利用@MapperScan注解来配置mapper映射器的扫描路径,例如:
@MapperScan("cn.test.demo.mybatis_demo02.dao") // mapper映射器的扫描路径
View Code
5.3.2 创建一个crateSqlSessionFactoryBean类来配置SqlSessionFactory
注意:类名可以随便取
技巧01:java配置类需要在类上添加@Configuration注解来指明该类是一个配置类
技巧02:在配置SqlSessionFactoryBean时需要用到DataSrouce实例,所以需要在配置SqlSessionFactoryBean的配置类依赖注入DataSrouce实例,例如:
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
技巧03:配置说明
》SqlSessionFactoryBean并注入到Bean容器中
View Code
》将扫描路径配置到springboot的全局配置配置文件中,然后利用@Value去获取即可,这样既可以实现一改全改的效果;例如:
》@Autowired进行依赖注入的时候可以利用@Qualifier指定名字,例如:
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
6 创建Dao层代码
Dao层在使用mybatis实现时也叫作Mapper映射器,其实Mapper映射器就是一个接口而已
复制代码
package cn.test.demo.mybatis_demo02.dao;
import cn.test.demo.mybatis_demo02.entity.Area;
import com.sun.applet2.preloader.event.InitEvent;
import java.util.List;
/**
- @author 王杨帅
- @create 2018-04-08 8:42
- @desc
**/
public interface AreaDao {
List queryArea();
Area queryById(Integer areaId);
Integer insertArea(Area area);
Integer updateArea(Area area);
Integer deleteArea(Integer areaId);
}
复制代码
7 创建XML文件代码
一个XML文件和一个Mapper映射器对应,具体这么对应请参见mybatis先关博文
View Code
8 创建Dao层测试类
坑01:在测试类中进行依赖注入时可能会报错,报错信息为:找不到相关的Bean
原因:IDEA是一个比较智能的编辑器,所以在进行依赖注入的时候就会检查需要注入的Bean在容器中是否存在,如果不存在就会报出这样的错误;但是由于IDEA的该功能还不够完善所以即使Bean容器有对应的Bean也会报出找不到相关Bean的错误
解决办法:将IDEA这个功能的报错级别调低,调成warning即可,例如:
View Code
package cn.test.demo.mybatis_demo02.dao;
import cn.test.demo.mybatis_demo02.entity.Area;
import lombok.extern.slf4j.Slf4j;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class AreaDaoTest {
@Autowired
private AreaDao areaDao;
@Test
public void queryArea() throws Exception {
List<Area> areaList = areaDao.queryArea();
// assertEquals(1, areaList.size());
log.info("获取到的数据为:{}", areaList);
}
@Test
public void queryById() throws Exception {
Area area = areaDao.queryById(1);
log.info("获取到的数据为:{}",area.toString());
}
@Test
// @Ignore
public void insertArea() throws Exception {
Area area = new Area();
area.setAreaName("南苑");
area.setPriority(1);
area.setCreateTime(new Date());
area.setLastEditTime(new Date());
Integer result = areaDao.insertArea(area);
log.info("插入完成的数据为:{}", result);
}
@Test
public void updateArea() throws Exception {
Area area = new Area();
area.setAreaName("东苑");
area.setLastEditTime(new Date());
area.setAreaId(1);
Integer result = areaDao.updateArea(area);
log.info("更新完成后得到的结果为:{}", result);
}
@Test
public void deleteArea() throws Exception {
}
}