springboot整合Mybatis(一)——入门
一、概述
1.先导
mybatis入门随笔:http://www.cnblogs.com/jiangbei/p/6884641.html
2.引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
//其他必须的依赖还包括mysql连接,web依赖(web项目),此处贴出完整依赖(有部分依赖例如jpa此处可不选)
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>springboot_demo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--spring-boot-starter-data-jpa包含spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 阿里druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<!-- AOP支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- spring-boot-devtools热部署支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<!-- spring热部署 -->
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>-->
</dependencies>
</plugin>
</plugins>
</build> </project>
pom.xml
额外功能(后文陆续补充)
- PageHelper 分页插件
- mybatis generator 自动生成代码插件
3.数据源配置
依旧是前文的druid数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/sakila
username: root
password: root
# druid配置项,默认spring-boot不支持,故需要config类来解析
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
application.yml
4.起步
以下介绍两种整合方式:
传统的mapper.xml映射文件
springboot提倡的无配置注解形式
二、无配置注解形式
1.配置mybatis:
mybatis:
type-aliases-package: com.example.demo.bean
// 包别名简写
2.Bean
沿用之前的bean:girl
package com.example.demo.bean; import javax.validation.constraints.Min;
import javax.validation.constraints.Size; /**
* girl的bean
*
* @author zcc ON 2018/2/9
**/ public class Girl {
private Integer id;
@Size(min = 3, max = 8, message = "名称长度不合法!")
private String name;
@Min(value = 18, message = "未成年禁止入内!")
private Integer age; public Girl() {
} public Girl(String name, Integer age) {
this.name = name;
this.age = age;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Girl{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
Girl.java
3.Mapper
package com.example.demo.mapper; import com.example.demo.bean.Girl;
import org.apache.ibatis.annotations.*; import java.util.List; /**
* GirlMapper
*
* @author zcc
**/
// @Mapper 这里可以使用@Mapper注解,但是每个mapper都加注解比较麻烦,所以也可以统一配置@MapperScan在扫描路径在application类中
@Mapper
public interface GirlMapper { @Select("SELECT * FROM girl WHERE id = #{id}")
Girl findGirlById(Integer id); @Select("SELECT * FROM girl")
List<Girl> findAll(); @Insert("INSERT INTO girl VALUES(NULL,#{age},#{name})")
int addGirl(Girl girl); @Update("UPDATE girl SET age = #{girl.age},name = #{girl.name} WHERE id = #{id}")
int updateGirl(@Param("id") Integer id, @Param("girl") Girl girl); @Delete("DELETE FROM girl WHERE id = #{id}")
int deleteGirl(Integer id);
}
以上注解的使用基本与之前xml中的用法一致,完整注解,参考官网:http://www.mybatis.org/mybatis-3/zh/java-api.html
当然,需要注意的是,mybatis官网给出了使用注解的注意点:
不幸的是,Java 注解限制了它们的表现和灵活。尽管很多时间都花调查,设计和 实验上,最强大的 MyBatis 映射不能用注解来构建,那并不可笑。
4.测试
启动类:
package com.example.demo; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
// @MapperScan("cn.demo.mapper") 若Mapper上不加注解,则在这里统一扫描
public class SpringbootDemoApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
controller:
@GetMapping(value = "/girl/{id}")
public Girl findGirlById(@PathVariable("id") Integer id) {
return girlService.findGirlById(id);
}
@PutMapping(value = "/girl/{id}")
public Integer updateGirlById(@PathVariable("id") Integer id, Girl girl) {
return girlService.updateGirl(id, girl);
}
package com.example.demo.controller; import com.example.demo.bean.Girl;
import com.example.demo.bean.Result;
import com.example.demo.dao.GirlRepository;
import com.example.demo.service.GirlService;
import com.example.demo.utils.ResultUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*; import javax.validation.Valid;
import java.util.List; /**
* controller
*
* @author zcc ON 2018/2/9
**/
@RestController
public class GirlController {
/**
* 简单的逻辑,这里就暂时省略service了
*/
private static final Logger log = LoggerFactory.getLogger(GirlController.class);
@Autowired
private GirlRepository girlRepository;
@Autowired
private GirlService girlService;
@GetMapping(value = "/girls")
public List<Girl> getList() {
// 直接调用findAll()即可,已经封装了!
return girlRepository.findAll();
} /**
* 可以使用此方式进行参数绑定
*/
/*@PostMapping(value = "/girls")
public String addGirl(@RequestParam("age") Integer age, String name) {
return null;
}*/ /**
* 更推荐bean进行绑定(这里规则和springMVC是一样的)
* @param girl 实体
* @return
*/
@PostMapping(value = "/girls")
public Result<Object> addGirl(@Valid Girl girl, BindingResult bindingResult) {
// 表单验证逻辑
if (bindingResult.hasErrors()) {
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
StringBuffer sb = new StringBuffer();
for (FieldError fieldError : fieldErrors) {
sb.append(fieldError.getDefaultMessage());
}
return ResultUtils.error(sb.toString());
}
return ResultUtils.success(girlRepository.save(girl));
}
@GetMapping(value = "/girls/{id}")
public Girl getGirlById(@PathVariable("id") Integer id) {
// 推荐使用更加通用的findOne()!
return girlRepository.findOne(id);
}
@PutMapping(value = "/girls/{id}")
public Girl updateGirlById(@PathVariable("id") Integer id, String name) {
Girl girl = new Girl();
girl.setId(id);
girl.setName(name);
return girlRepository.save(girl);
}
@DeleteMapping(value = "/girls/{id}")
public String deleteGirlById(@PathVariable("id") Integer id) {
girlRepository.delete(id);
return "删除ID为:" + id + " 的女生成功!";
}
@GetMapping(value = "/girls/age/{age}")
public List<Girl> getListByAge(@PathVariable("age") Integer age) {
return girlRepository.findByAge(age);
}
@PostMapping(value = "/girls/two")
public void insertTwo() {
girlService.insertTwo();
}
@GetMapping(value = "/girls/getAge/{id}")
public void getAge(@PathVariable("id") Integer id) {
// 判断应该交给service
girlService.getAge(id);
}
@GetMapping(value = "/ageAndId/{name}/{id}")
public List<Girl> testKeyWords(@PathVariable("name") String name, @PathVariable("id") Integer id) {
return girlService.findByNameStartingWithAndIdLessThan(name, id);
} @GetMapping(value = "/girl/{id}")
public Girl findGirlById(@PathVariable("id") Integer id) {
return girlService.findGirlById(id);
}
@PutMapping(value = "/girl/{id}")
public Integer updateGirlById(@PathVariable("id") Integer id, Girl girl) {
return girlService.updateGirl(id, girl);
}
}
controller
service:
public Girl findGirlById(Integer id) {
return girlMapper.findGirlById(id);
} public int updateGirl(Integer id, Girl girl) {
return girlMapper.updateGirl(id, girl);
}
package com.example.demo.service; import com.example.demo.dao.GirlRepository;
import com.example.demo.bean.Girl;
import com.example.demo.enums.ResultEnum;
import com.example.demo.exception.MyException;
import com.example.demo.mapper.GirlMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import java.util.List; /**
* service
*
* @author zcc ON 2018/2/9
**/
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Autowired
private GirlMapper girlMapper;
@Transactional
public void insertTwo() {
Girl girl1 = new Girl("Nana", 18);
Girl girl2 = new Girl("Lala", 19);
girlRepository.save(girl1);
girlRepository.save(girl2);
} public void getAge(Integer id) {
Integer age = girlRepository.findOne(id).getAge();
if (age < 12) {
// 小学生
throw new MyException(ResultEnum.PRIMARY);
} else {
// 上初中了
throw new MyException(ResultEnum.MIDDLE);
}
} /**
* 通过id查询
* @param id 实体类id
* @return
*/
public Girl findOne(Integer id) {
return girlRepository.findOne(id);
}
public List<Girl> findByNameStartingWithAndIdLessThan(String name, Integer id) {
return girlRepository.findByNameStartingWithAndIdLessThan(name, id);
} public Girl findGirlById(Integer id) {
return girlMapper.findGirlById(id);
} public int updateGirl(Integer id, Girl girl) {
return girlMapper.updateGirl(id, girl);
}
}
service
注入mapper报错的处理(不影响实际使用,强迫症可选)
实际测试可以使用经典的postman,也推荐IDEA自带的tool——REST Client
三、经典注解版
基本代码类似,只是少数代码更改
项目结构:
yml配置mybatis:
mybatis:
type-aliases-package: com.example.demo.bean
mapper-locations: classpath:mybatis/mapper/*.xml
config-location: classpath:mybatis/mybatis-config.xml
// 别名也可以在mybatis-config.xml中进行配置!,默认别名参考文档:点击查看
mybatis-config.xml:
<?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>
</typeAliases>
</configuration>
mapper:
package com.example.demo.mapper; import com.example.demo.bean.Girl;
import org.apache.ibatis.annotations.Param; import java.util.List; /**
* GirlMapper
*
* @author zcc
**/
// 这里不在这里加@Repository注解,统一在启动类通过MapperScan扫描
public interface GirlMapper { Girl findGirlById(Integer id); List<Girl> findAll(); int addGirl(Girl girl); int updateGirl(@Param("id") Integer id, @Param("girl") Girl girl); int deleteGirl(Integer id);
}
mapper.xml:
<?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接口代理实现编写规则:
1.映射文件中namespace要等于接口的全路径
2.映射文件中sql语句的id要等于接口的方法名
3.映射文件中传入参数类型要等于接口方法的入参
4.映射文件返回值类型要等于接方法的返回值类型
-->
<mapper namespace="com.example.demo.mapper.GirlMapper">
<resultMap id="BaseResultMap" type="girl">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
</resultMap> <sql id="Base_Column_List">
id,age,name
</sql> <select id="findGirlById" parameterType="integer" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM girl
WHERE id = #{id}
</select> <select id="findAll" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM girl
</select> <select id="addGirl" parameterType="girl">
INSERT INTO
girl(age,name)
VALUES(#{age},#{name})
</select> <update id="updateGirl" parameterType="girl">
UPDATE
girl
SET
age = #{age},name = #{name}
WHERE
id = #{id}
</update> <delete id="deleteGirl" parameterType="integer">
DELETE
FROM
girl
WHERE
id = #{id}
</delete>
</mapper>
mapper中的各种警告处理(不影响使用,强迫症可以进行设置):
springboot整合Mybatis(一)——入门的更多相关文章
- SpringBoot整合mybatis快速入门
一.创建一个SpringBoot项目 二.引入相关依赖 <!--web核心依赖--> <dependency> <groupId>o ...
- SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)
前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...
- springboot 整合 mybatis 入门
springboot整合mybatis 0.yml 配置文件 1.创建数据库表. 2.创建实体类. 3.创建 Mapper 接口 ,添加 @Mapper 注解. 4.创建 Mapper 映射文件. & ...
- springBoot整合mybatis、jsp 或 HTML
springBoot整合mybatis.jsp Spring Boot的主要优点: 1: 为所有Spring开发者更快的入门: 2: 开箱即用,提供各种默认配置来简化项目配置: 3: 内嵌式容器 ...
- 001 SringBoot基础知识及SpringBoot整合Mybatis
1.原有Spring优缺点分析 (1)优点 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品.无需开发重量级的Enterprise J ...
- SpringBoot数据访问(一) SpringBoot整合Mybatis
前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- SpringBoot整合Mybatis【非注解版】
接上文:SpringBoot整合Mybatis[注解版] 一.项目创建 新建一个工程 选择Spring Initializr,配置JDK版本 输入项目名 选择构建web项目所需的state ...
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
随机推荐
- LeetCode 题解之Add Binary
1.题目描述 2.题目分析 使用string 的逆向指针,做二进制加法,注意进位问题就可以. 3.代码 string addBinary(string a, string b) { string::r ...
- 1.Junit test使用
1.导入maven依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</arti ...
- 向服务器post或者get数据返回
#region 向服务器端Get值返回 /// <summary> /// 向服务器端Get返回 /// </summary> ///<see cref="Au ...
- Linux man 命令详细介绍
知道linux帮助文件(man-pages,手册页)一般放在,$MANPATH/man 目录下面,而且按照领域与语言放到不同的目录里面. 看了上一章,要找那个命令使用相关手册,只要我们按照领域区分,到 ...
- SecureCRT ssh连接linux操作系统(解决Ubutu密钥交换失败的问题)
我们可以使用终端软件SecureCRT 去连接linux操作系统(该SecureCRT服务走端口22,协议是ssh(类似apache走http协议,端口80)),SSH 为 Secure Shell ...
- (转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 材质和光的交互除了反射现象,对于透明物 ...
- Alpha 冲刺报告(6/10)
Alpha 冲刺报告(6/10) 队名:洛基小队 峻雄(组长) 已完成:实现角色的移动. 明日计划:关于角色的属性设计. 剩余任务:角色的属性脚本 困难:角色的属性以及具体的编码 ---------- ...
- redis 配置文件redis.conf
daemonize yes #---默认值no,该参数用于定制redis服务是否以守护模式运行.--- pidfile /var/run/redis.pid #默认值/var/run/redis.pi ...
- PHP设计模式系列 - 建造者模式
什么是建造者模式 建造者模式主要是为了消除其它对象复杂的创建过程. 设计场景 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,金钱等信息,才能获得用户具体的信息结果. 创建一个U ...
- OSSpinLockLock加锁机制,保证线程安全并且性能高
在aspect_add.aspect_remove方法里面用了aspect_performLocked, 而aspect_performLocked方法用了OSSpinLockLock加锁机制,保证线 ...