(二)spring boot 添加mybatis 支持(xml方式)

为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步就不详细描述了

可以看上一章节(spring boot入门)

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;
    }
}

测试

  1. 查询所有数据,返回List
    这里写图片描述
  2. 根据ID查询数据
    这里写图片描述
  3. 根据ID更新数据库名称
    更新之前的数据,cust_id=1的名称是ffffffff
    这里写图片描述
    更新后,数据库
    这里写图片描述
  4. 测试更新时的事务回滚
    这里写图片描述
    不明白为啥在页面上会乱码,在网上查了下,也没找到原因
    查询eclipse中的日志
    这里写图片描述
    可以看到已经发生了数据变更,并且抛了一个错误出来,再看看数据库中的内容有没有发生改变,如果没有发生改变哪,说明回滚是正常的
    这里写图片描述
    嗯,没有发生改变,事务回滚也没有什么问题

遇到的坑

在spring 4.3.2 的版本里边,我用事务注解的时候,项目老是启动不起来,去掉BO中的事务注解就可以启动
把spring-boot-starter-web的版本从1.4.0.RELEASE换到1.5.3.RELEASE,相应的spring的版本也换到了4.3.8以后,就正常启动了
不明白为啥。。。

如果谁明白这个原因,和有页面发生这种乱码解决的办法,可以下边讨论区留言告诉我

代码示例:spring-boot-test-2.zip

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值