一、概述

  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(一)——入门的更多相关文章

  1. SpringBoot整合mybatis快速入门

    一.创建一个SpringBoot项目                 二.引入相关依赖 <!--web核心依赖--> <dependency> <groupId>o ...

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

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

  3. springboot 整合 mybatis 入门

    springboot整合mybatis 0.yml 配置文件 1.创建数据库表. 2.创建实体类. 3.创建 Mapper 接口 ,添加 @Mapper 注解. 4.创建 Mapper 映射文件. & ...

  4. springBoot整合mybatis、jsp 或 HTML

    springBoot整合mybatis.jsp Spring Boot的主要优点: 1:  为所有Spring开发者更快的入门: 2:  开箱即用,提供各种默认配置来简化项目配置: 3:  内嵌式容器 ...

  5. 001 SringBoot基础知识及SpringBoot整合Mybatis

    1.原有Spring优缺点分析 (1)优点 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品.无需开发重量级的Enterprise J ...

  6. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

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

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

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

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

  9. 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 ...

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

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

随机推荐

  1. 【Redis】命令学习笔记——字符串(String)(23个超全字典版)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 本篇基于redis 4.0.11版本,学习字符串( ...

  2. Script" References MACLEAN‘s post Speed ​​up the index creation.

    alter session set workarea_size_policy=MANUAL; alter session set db_file_multiblock_read_count=512; ...

  3. vue的项目

    vue的项目打开也是非常具有解耦性的 最重要的就是src目录了  我们的入口在main中  main是你的实例化vue  app中就是我们的每一块田地是我们的vue实例对这个的操作 ,index因为是 ...

  4. 如何生成.p12文件

    如何生成.p12文件 1. 打开钥匙串 2. 钥匙串选登录,种类选证书 3. 选择开发者,然后导出证书 4. 存储证书 5. 选择存储的时候会提示输入证书的密码,当然,也可以不用输入密码 6. 点击上 ...

  5. Configuration Manager 和内容位置(包源文件)

    Configuration Manager 2007 中的内容位置涉及 Configuration Manager 2007 客户端如何查找播发和软件更新的包源文件.当客户端需要查找内容时,它会将内容 ...

  6. UNIX高级环境编程(2)FIle I/O - 原子操作、共享文件描述符和I/O控制函数

    引言: 本篇通过对open函数的讨论,引入原子操作,多进程通信(共享文件描述符)和内核相关的数据结构. 还会讨论集中常见的文件IO控制函数,包括: dup和dup2 sync,fsync和fdatas ...

  7. Linux uname命令详解

    uname常见命令参数 -a, --all print all information, in the following order, except omit -p and -i if unknow ...

  8. Linux xargs命令详解

    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部 xargs要处理的文件如果不是在结尾,需要加上 -i这个参数 xargs常见命令参数 args:xarg ...

  9. IE漏洞的调试心得

    在调试漏洞的过程中,个人感觉最棘手的就是ie浏览器的漏洞和flash player的漏洞了.这里打算记录一下学习过程中的心得(主要是基于uaf类),以方便新人学习. 首先,ie漏洞与众不同的是,程序的 ...

  10. 一、HTML概述 二、web相关的概念 三、HTML的常用标签

    一.HTML概述###<1>概念 HTML:Hypertext Markup Language,超文本 标记语言,用来描述网页的一种语言. 非编程语言,由浏览器直接解释运行. ###< ...