为spring boot添加mybatis支持
为什么要使用mybatis呢
一个是因为mybatis基本使用sql来访问数据库,可以写一些比较复杂的SQL,过程也比较可控
第二个是可以通过mybatis来解决不同数据库时的兼容性问题
其它使用mybatis的好处请自行官网^_^
先梳理一下过程:
1. 创建一个maven项目
2. 创建项目的目录结构
3. 在pom.xml添加spring boot 的依赖
4. 在pom.xml添加mysql和mybatis的依赖
5. 添加更改配置文件:application.properties
6. 创建Controller、bo、vo及mybatis的sqlMapping文件
第1-3步就不详细描述了
4. 在pom.xml添加mysql和mybatis的依赖
添加后的pom文件如下,请注意顺序,mybatis必须在spring boot之后
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dtf</groupId>
<artifactId>spring-boot-test-2</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-test-2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
<scope>runtime</scope>
</dependency>
<!-- mybatis依赖包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-boot-test-2</finalName>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</build>
</project>
5. 添加更改配置文件:application.properties
#数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/ace_admin?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis数据库mapper文件路径,可以通过不同的路径文件,兼容数据库
mybatis.mapperLocations=classpath:/mybatis/mysql/*.xml
6. 创建Controller、bo、vo及mybatis的sqlMapping文件
先给看下创建后的目录结构,从目录结构上可以看出来,集成mybatis只增加了很少的工作量,如果原来已经有数据库连接的配置,哪么我们只是在pom文件中增加了一个mybatis的jar包引入,然后就可以直接开搞了,简直不要太强大
数据库
先刷一张数据库表数据,这个语句就不提供了
创建SQL映射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="CustMapper">
<!-- 查询返回Map类型 -->
<select id="findCust" resultType="Map">
SELECT * FROM cust
</select>
<!-- 查询返回VO类型 -->
<select id="findCustVo" resultType="com.dtf.core.vo.Cust" parameterType="Map">
SELECT * FROM cust where cust_id=#{cust_id}
</select>
<!-- 根据ID修改名称 -->
<update id="updateCust" parameterType="Map">
update cust set cust_name=#{cust_name} where cust_id=#{cust_id}
</update>
</mapper>
创建BO文件
package com.dtf.core.bo;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class CustBo {
private static final Logger log = LoggerFactory.getLogger(CustBo.class);
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
public List get() {
return sqlSessionTemplate.selectList("CustMapper.findCust");
}
public List findCustVo(Map param){
return sqlSessionTemplate.selectList("CustMapper.findCustVo",param);
}
/***
* 测试修改库表
* @param param
* @return
*/
public int update(Map param){
return sqlSessionTemplate.update("CustMapper.updateCust",param);
}
/***
* 测试事务控制,当修改条数成功后,抛出异常,看会不会回滚
* @param param
* @return
*/
@Transactional
public int updateError(Map param){
int c = sqlSessionTemplate.update("CustMapper.updateCust",param);
System.out.println("变更条数:"+c);
if (true) {
throw new RuntimeException("插入发生错误,回滚!");
}
return c;
}
}
Controller文件
package com.dtf.core.web;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.dtf.core.bo.CustBo;
@RequestMapping(value="/index")
@RestController
public class IndexController {
@Resource
private CustBo custBo;
@RequestMapping
public String hi() {
return "hi";
}
@RequestMapping(value="/hi")
public String sayHi(@RequestParam String name){
return "hi,"+name;
}
@RequestMapping(value="getCust")
public List getCust() {
return custBo.get();
}
@RequestMapping(value="/findCustVo/{cust_id}")
public List findCustVo(@PathVariable String cust_id){
Map param = new HashMap();
param.put("cust_id", cust_id);
return custBo.findCustVo(param);
}
/***
* 根据ID修改名称,测试回滚
* @param id
* @param name
* @return
*/
@RequestMapping(value="/updateError/{id}/{name}")
public int updateError(@PathVariable String id,@PathVariable String name){
Map map = new HashMap();
map.put("cust_id", id);
map.put("cust_name", name);
return custBo.updateError(map);
}
/***
* 根据ID修改名称
* @param id
* @param name
* @return
*/
@RequestMapping(value="/update/{id}/{name}")
public int update(@PathVariable String id,@PathVariable String name){
Map map = new HashMap();
map.put("cust_id", id);
map.put("cust_name", name);
return custBo.update(map);
}
}
VO文件
package com.dtf.core.vo;
import java.io.Serializable;
public class Cust implements Serializable{
private String cust_id;
private String cust_name;
private String addr;
private String contact;
private String contact_number;
private String remarks;
public String getCust_id() {
return cust_id;
}
public void setCust_id(String cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
public String getContact_number() {
return contact_number;
}
public void setContact_number(String contact_number) {
this.contact_number = contact_number;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
}
测试
- 查询所有数据,返回List
- 根据ID查询数据
- 根据ID更新数据库名称
更新之前的数据,cust_id=1的名称是ffffffff
更新后,数据库
- 测试更新时的事务回滚
不明白为啥在页面上会乱码,在网上查了下,也没找到原因
查询eclipse中的日志
可以看到已经发生了数据变更,并且抛了一个错误出来,再看看数据库中的内容有没有发生改变,如果没有发生改变哪,说明回滚是正常的
嗯,没有发生改变,事务回滚也没有什么问题
遇到的坑
在spring 4.3.2 的版本里边,我用事务注解的时候,项目老是启动不起来,去掉BO中的事务注解就可以启动
把spring-boot-starter-web的版本从1.4.0.RELEASE换到1.5.3.RELEASE,相应的spring的版本也换到了4.3.8以后,就正常启动了
不明白为啥。。。
如果谁明白这个原因,和有页面发生这种乱码解决的办法,可以下边讨论区留言告诉我