正常来说,我们开发微服务项目,不准确来说我们用springboot来创建项目数据访问一把都是用mybatis来访问数据库的,基本上不会用hibernate,hibernate的话以前的老项目可能会经常用(容我将以前的上s2sh项目定位为老项目)。下面我们来学习一下springboot2.0整合mybatis。
环境
jdk1.8_73apache-maven-3.5.3springboot 2.0.0.RELEASEeclipse 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连接数据库的信息以及分页插件的信息
#c3p0c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/weixinserc3p0.user=rootc3p0.password=foreverc3p0.driverClass=com.mysql.jdbc.Driverc3p0.minPoolSize=2c3p0.maxPoolSize=10c3p0.maxIdleTime=1800000c3p0.acquireIncrement=3c3p0.maxStatements=1000c3p0.initialPoolSize=3c3p0.idleConnectionTestPeriod=60c3p0.acquireRetryAttempts=30c3p0.acquireRetryDelay=1000c3p0.breakAfterAcquireFailure=falsec3p0.testConnectionOnCheckout=false#pagehelper插件logging.level.com.example.demo.dao=DEBUGpagehelper.helperDialect=mysql#禁用合理化,否则超过页数还是会返回最后一页的值pagehelper.reasonable=falsepagehelper.supportMethodsArguments=truepagehelper.params=count=countSqlpagehelper.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;@Configurationpublic 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;@Servicepublic class MyServiceImpl implements cn.forever.service.MyService {/*** PageHelper的分页能力太强了*/@Autowiredprivate 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;@RestControllerpublic class MyController {@Autowiredprivate 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")@SpringBootApplicationpublic 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的使用啦。
