正常来说,我们开发微服务项目,不准确来说我们用springboot来创建项目数据访问一把都是用mybatis来访问数据库的,基本上不会用hibernate,hibernate的话以前的老项目可能会经常用(容我将以前的上s2sh项目定位为老项目)。下面我们来学习一下springboot2.0整合mybatis。
环境
jdk1.8_73
apache-maven-3.5.3
springboot 2.0.0.RELEASE
eclipse Oxygen.3a Release (4.7.3a)
一、流程
页面结构如下
1、新建一个springboot2.0的项目
这里项目名称为:springboot-mybatis
2、pom.xml中添加如下依赖
我这里都是基于二、快速入门-Hello SpringBoot,来添加相应的依赖的。
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- springboot 整合 pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
这里对上面的依赖稍作说明
依赖 | 作用 |
---|---|
mybatis-spring-boot-starter | spring整个mybatis的包 |
pagehelper-spring-boot-starter | 用于分页的工具包 |
mysql-connector-java | mysql连接驱动 |
c3p0 | mysql连接池,当然这里如果用阿里的druid效果可能会更好,不过这里只是简单说下使用而已 |
注意:c3p0的包如果版本不对可能会报如下错误,这种情况下需要用版本比较新一点的包。
java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()Z is abstract
3、application.properties
在配置文件中配置好c3p0连接数据库的信息以及分页插件的信息
#c3p0
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/weixinser
c3p0.user=root
c3p0.password=forever
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.minPoolSize=2
c3p0.maxPoolSize=10
c3p0.maxIdleTime=1800000
c3p0.acquireIncrement=3
c3p0.maxStatements=1000
c3p0.initialPoolSize=3
c3p0.idleConnectionTestPeriod=60
c3p0.acquireRetryAttempts=30
c3p0.acquireRetryDelay=1000
c3p0.breakAfterAcquireFailure=false
c3p0.testConnectionOnCheckout=false
#pagehelper插件
logging.level.com.example.demo.dao=DEBUG
pagehelper.helperDialect=mysql
#禁用合理化,否则超过页数还是会返回最后一页的值
pagehelper.reasonable=false
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
pagehelper.page-size-zero=true
上面的基本上都是固定的,唯一要注意的是pagehelper.reasonable=false
这个配置
,若是改为true,那么在分页查询的时候,就算是下一页没有数据,也会返回最后一页的数据
4、建立数据源的配置类DataSourceConfiguration.java
package cn.forever.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class DataSourceConfiguration {
// c3p0 连接池
@Bean(name = "dataSource")
@Qualifier(value = "dataSource")
@Primary
@ConfigurationProperties(prefix = "c3p0")
public DataSource dataSource() {
return DataSourceBuilder.create().type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build();
}
}
5、UserMapper.java
package cn.forever.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from hu_chat_info")
public List<Map<String,Object>> getUsers();
}
这里只是为了演示整合,所以这里就只是用注解来操作
6、MyService.java和MyServiceImpl
package cn.forever.service;
public interface MyService {
public String getUser();
}
package cn.forever.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;
import cn.forever.mapper.UserMapper;
@Service
public class MyServiceImpl implements cn.forever.service.MyService {
/**
* PageHelper的分页能力太强了
*/
@Autowired
private UserMapper userMapper;
public String getUser() {
int page=1;//当前页数
int size=10;//当前显示的记录数
// 开启分页插件,放在查询语句上面
PageHelper.startPage(page, size);
List<Map<String,Object>> users =userMapper.getUsers();
Gson gson = new Gson();
String user = gson.toJson(users);
System.out.println("users:"+user.toString());
return user;
}
}
这两个类的作用就是service业务逻辑层,这里进行分页插件额度使用,如下代码段
int page=1;//当前页数
int size=10;//当前显示的记录数
// 开启分页插件,放在查询语句上面
PageHelper.startPage(page, size);
只需要在查询语句上面加入上面的代码片段,程序会自动为后面的查询sql拼接上limit。page是查询当前是第几页,size是每页查询的大小。
7、MyController.java
package cn.forever.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.forever.service.MyService;
@RestController
public class MyController {
@Autowired
private MyService myServcie;
@RequestMapping("/getUsers")
public String getUsers() {
String user = myServcie.getUser();
return user;
}
}
8、启动类App.java
package cn.forever;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//这里要制定Mappper
@MapperScan("cn.forever.mapper")
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
主要用上了@MapperScan注解,扫描dao
9、启动项目测试
run运行App,启动成功后浏览器输入http://127.0.0.1:8080/getUsers
会返回json格式的信息,这里顺便提一下,若是不喜欢用注解,可以在配置文件(application.properties,application.yml)配置mapper对应的xml位置,如下,这里是用application.yml的格式来,该格式比较节省空间,但是要注意空格的数量。
mybatis:
#这里前面是两个空格 #这里起那么是一个空格
mapper-locations: classpath:mapper/*.xml
#这一句的作用是让控制台打印出sql语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
结语
其实都很简单啦,不过我这个博文都是基于了解了mybatis的读者,毕竟这个标签学的是springboot2.0的使用,不可能深入去了解mybatis的使用啦。