这次准备使用Spring Boot来集成Mybatis,数据库则使用MySql,数据库连接池采用阿里巴巴的Druid,其实可以用其他连接池的,但是看了好几篇博客都推荐用这个就试了一下。而Mybatis目前有两种配置方式,一种是传统的XML配置,一种是基于注解的配置,在下面我将会简单的介绍一下两种配置方式。
一、项目环境
java 1.8
IntelliJ IDEA 2017.2.4
Druid 1.0.2
Mysql 5.7.17
SQLyog-8.32(数据库操作工具这个随意就好)
Maven (IDEA自带)
二、创建项目
1.创建项目还是使用IDEA自带的Spring Initializr来导入SpringBoot 的起步依赖:
2.一些简单的设置,包名及项目名,这里需要选择使用Maven就好了:
3.选择起步依赖,这里需要选择Web、MySql以及Mybatis,因为SpringBoot的起步依赖中没有Druid,所以这个需要我们创建好项目后在pom.xml中添加Druid的依赖:
4.直接finish就好了:
5.创建好的项目结构和pom.xml如下图所示:
6.这里还少了我们的数据库连接池Druid,所以我们需要修改pom.xml,在里面加入Druid的依赖:
添加的依赖:
<!-- druid阿里巴巴数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
三、创建数据库
1.这里我使用SQLyog工具来创建数据库,这个大家可以根据喜好来自行创建,创建一个test数据库,并设置编码:
2.创建一个users表,设置三个字段:id、name、age,如下图:
3.加入两条演示数据:
4.数据库创建的SQL,执行此SQL可以达到以上效果:
/*
SQLyog Ultimate v8.32
MySQL - 5.7.17-log : Database - test
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` bigint(7) NOT NULL,
`name` varchar(10) NOT NULL,
`age` int(7) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `users` */
insert into `users`(`id`,`name`,`age`) values (1,'张三',17),(2,'李四',25);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
四、项目构建
1、添加目录结构
为了让项目的结构更加清晰,我将Controller、Service、Dao、Model都分开存放,如下图:
Ps:
1.Mybatis传统的基于XML的配置需要写mapper.xml,而SpringBoot将xml文件视为资源,只能放在classpath下,也就是resources文件夹下,所以我新建了一个mapper文件夹,用来存放mapper.xml;
2.因为SpringBoot默认的自动Bean扫描是先扫描application.java所在的包,然后扫描其所在包的子包,所以Controller、Service、Dao、Model等包,只能与application.java平级或者为application.java所在包的子包,不然不会被扫描到,到时候会报错。
2、配置application.properties
application.properties是SpringBoot的一个主要配置文件,我们需要在里面配置MySql、Mybatis以及Druid连接池的配置,内容如下:
# 使用druid连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 数据库的URL、帐号、密码、驱动
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#连接池的配置信息
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# MyBatis 配置
# mybatis的mapper.xml文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
# mybatis的model所在的包
mybatis.type-aliases-package=com.example.springbootmybatis.model
3、User.java
package com.example.springbootmybatis.model;
public class User {
private long id;
private String name;
private Integer age;
public long getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public void setId(long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}
4、UserDao.java与UserMapper.xml
(1)UserDao.java:
package com.example.springbootmybatis.dao;
import com.example.springbootmybatis.model.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
/*@Repository*/
/*@Mapper*/
/*@Repository也可以不用添加,但是不添加之后使用@Autowired注入接口是IDEA会提示红线,但是不影响编译运行*/
/*@Mapper如果配置了自动扫描,这个注解可以不添加,也推荐使用自动扫描*/
public interface UserDao {
/*xml方式*/
User findByName(String name);
/*注解方式*/
@Select("select * from users")
List<User> findAll();
}
(2)UserMapper.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">
<!--命名空间,指定对应的Dao-->
<mapper namespace="com.example.springbootmybatis.dao.UserDao">
<!--使用resultType指定输出类型-->
<select id="findByName" resultType="User">
SELECT * FROM users WHERE name = #{name}
</select>
</mapper>
Ps:
①这里采用两种配置方式,findByName()方法采用的是XML的配置:UserMapper.xml
指定对应的Dao,标签中的id与UserDao.java的方法名对应;findAll()方法采用的是注解的配置方式: 使用注解@Select,并写入Sql语句”select * from users”,采取注解的方式则可以不用编写Mapper.xml,简化了很多内容(其他的使用方式可以自行查找资料)。
②Repository也可以不用添加,但是不添加之后使用@Autowired注入接口是IDEA会提示红线,但是不影响编译运行;
③@Mapper如果配置了自动扫描,这个注解可以不添加,这里也推荐使用自动扫描,免得每个Mapper都去添加注释。
5、UserController.java与UserService.java
(1)UserService.java
package com.example.springbootmybatis.service;
import com.example.springbootmybatis.dao.UserDao;
import com.example.springbootmybatis.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User findByName(String name){
User user =userDao.findByName(name);
return user;
}
public List<User> findAll(){
List<User> users =userDao.findAll();
return users;
}
}
ps:注入UserDao的时候可能会划红线,不影响。
(2)UserController.java
package com.example.springbootmybatis.controller;
import com.example.springbootmybatis.model.User;
import com.example.springbootmybatis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/find")
public User findByName(){
/*因为没写前端页面,这里写了些伪业务代码*/
User user =userService.findByName("李四");
return user;
}
@RequestMapping("/findall")
public List<User> findAll(){
List<User> users =userService.findAll();
return users;
}
}
ps:因为没写前端页面,写了一些伪业务代码,直接return了对象,SpringBoot会自动将对象序列化成json,然后生成一个页面显示出来,如果你使用了前端模板引擎,就由模板引擎接收(主要是@RestController这个注解起的作用,@RestController是@ResponseBody和@Controller的组合注解,而@ResponseBody表示将的controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据,这个在前后端分离的项目中很好用)。
6、Application.java
Application.java是SpringBoot的主要配置类和启动类,使用自动构建工具Spring Initializr生成的项目会自动命名为“项目名”+“Application”,我们这个项目就是“SpringbootmybatisApplication.java”这个类,我们需要在这里配置对Dao接口的自动扫描:
package com.example.springbootmybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*自动扫描dao接口*/
@MapperScan("com.example.springbootmybatis.dao")
@SpringBootApplication
public class SpringbootmybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmybatisApplication.class, args);
}
}
7、目录结构
配置后的一个结构如下图:
五、测试
1.在SpringbootmybatisApplication.java中启动项目:
启动成功:
2.访问http://localhost:8080/user/find:
基于Xml配置的方法没有问题。
3.访问http://localhost:8080/user/findall:
基于注解的方法也没有问题。