本节课进行SpringBoot整合Mybatis3.0注解的实战,
首先新建一个空项目,建好实体类,mapper,service等,项目地址:源码地址:https://gitee.com/xuxinsunqizheng/SpringBoot2.0.git ,下面是表的sql脚本
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT NULL COMMENT '名称',
`phone` varchar(16) DEFAULT NULL COMMENT '用户手机号',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`age` int(4) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
项目结构:
第一步:在pom文件中加入相关依赖
<!-- 引入starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
<scope>runtime</scope>
</dependency>
<!-- MySQL的JDBC驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 引入第三方数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
第二步:加入配置文件
方式一:perpropeties:
#可以自动识别
#spring.datasource.driver-class-name =com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/movie?useUnicode=true&characterEncoding=utf-8
spring.datasource.username =root
spring.datasource.password =password
#如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
方拾二:yml:
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/crm
username: root
password: 123456
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
spring.datasource.driver-class-name:告诉Spring使用的驱动是什么,不过SpringBoot可以自动识别,不需要告诉他spring.datasource.url:数据库地址
spring.datasource.username =root 用户名
spring.datasource.password =password:密码
spring.datasource.type =com.alibaba.druid.pool.DruidDataSource:指定数据源, 如果不使用默认的数据源 (com.zaxxer.hikari.HikariDataSource)
然后在我们加载配置的时候注入到sqlSessionFactory等都是springBoot帮我们完成
第三步:启动类增加mapper扫描
早点的时间是直接在Mapper类上面添加注解@Mapper,这种方式要求每一个mapper类都需要添加此注解,比较麻烦。
现在通过使用@MapperScan可以指定要扫描的Mapper类的包的路径
在启动类中加入@MapperScan("net.xdclass.base_project.mapper"),扫描mapper接口下的包,也就是mapper接口的全路径
注意:如果扫描多个包的时候要用逗号隔开
第四步:开发mapper
1.注解方式:
使用注解方式就比较方便,不需要写xml文件,只需要在mapper接口中对应的接口使用注解查询就行,比如我们插入一个User:
//推荐使用#{}取值,不要用${},因为存在注入的风险
@Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name}, #{phone}, #{createTime},#{age})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java对象的属性;keyColumn表示数据库的字段
int insert(User user);
使用@Options注解获取插入之后的主键值,keyProperty表示 java对象的属性;keyColumn表示数据库的字段。
2.xml方法:
相对于注解方式,本人还是比较习惯xml配置方式进行mybatis的开发,使用xml开发只需要在配置文件中加入下面两个配置:
## 该配置节点为独立的节点,有很多同学容易将这个配置放在spring的节点下,导致配置无法被识别
mybatis:
mapper-locations: classpath:mapping/*.xml #注意:一定要对应mapper映射xml文件的所在路径
type-aliases-package: net.xdclass.base_project.domain # 注意:对应实体类的路径
mapper-locations: classpath:mapping/*.xml 这是mapper接口对应的xml文件的路径,注意:如果mapper接口与xml配置文件在同一目录下那么可以不加这个配置
type-aliases-package: net.xdclass.base_project.domain 这是实体类的包路径
第五步:测试
写一个查询方法,一个插入方法分别测试上面两种mapper开发方式:
controller代码:
package net.xdclass.base_project.controller;
import java.util.Date;
import net.xdclass.base_project.domain.JsonData;
import net.xdclass.base_project.domain.User;
import net.xdclass.base_project.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 功能描述: user 保存接口
* @return
*/
@GetMapping("add")
public Object add(){
User user = new User();
user.setAge(11);
user.setCreateTime(new Date());
user.setName("xdclass");
user.setPhone("10010000");
int id = userService.add(user);
return JsonData.buildSuccess(id);
}
/**
* 功能描述: 查询api
* @return
*/
@GetMapping("select")
public Object select(){
User user = userService.findById(19);
return JsonData.buildSuccess(user);
}
}
service代码:
package net.xdclass.base_project.service;
import net.xdclass.base_project.domain.User;
public interface UserService {
public int add(User user);
public User findById(Integer id);
}
package net.xdclass.base_project.service.impl;
import java.util.Date;
import net.xdclass.base_project.domain.User;
import net.xdclass.base_project.mapper.UserMapper;
import net.xdclass.base_project.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public int add(User user) {
userMapper.insert(user);
int id = user.getId();
return id;
}
@Override
public User findById(Integer id) {
return userMapper.findById(id);
}
}
mapper接口:
package net.xdclass.base_project.mapper;
import net.xdclass.base_project.domain.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
/**
* 功能描述:访问数据库的接口
*
* <p> 创建时间:May 6, 2018 3:51:49 PM </p>
*
*@作者 小D课堂 小D
*/
public interface UserMapper {
//推荐使用#{}取值,不要用${},因为存在注入的风险
@Insert("INSERT INTO user(name,phone,create_time,age) VALUES(#{name}, #{phone}, #{createTime},#{age})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java对象的属性;keyColumn表示数据库的字段
int insert(User user);
User findById(Integer id);
}
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 namespace="net.xdclass.base_project.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="net.xdclass.base_project.domain.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="phone" property="phone" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="age" property="age" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, name, phone,create_time,age
</sql>
<select id="findById" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from user
where id = #{id}
</select>
</mapper>
启动项目分别访问http://localhost:8080/api/v1/user/add,http://localhost:8080/api/v1/user/select,测试成功!
相关资料:
http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/#Configuration
http://www.mybatis.org/mybatis-3/zh/java-api.html
整合问题集合:
https://my.oschina.net/hxflar1314520/blog/1800035
https://blog.csdn.net/tingxuetage/article/details/80179772