SpringBoot整合MyBatis

1、前言

现在开发一个项目没使用持久化框架的应该是极少了,之前使用Spring整合MyBatis,需要配置一堆的配置文件。现在使用SpringBoot来整合MyBatis就很简单了,SpringBoot集成了SpringJDBC与JPA,但是没有集成MyBatis,所以想要使用MyBatis就要自己去集成。主要是在Spring Boot中集成MyBatis,可以选用基于注解的方式,也可以选择xml文件配置的方式。官方推荐使用xml文件配置。个人也比较喜欢使用xml文件配置。

2、引入MyBatis依赖

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

3、配置SpringBoot支持MyBatis

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.tenghu.sbm

4、实体类

/**
 * 客户基础信息
 * @author Arvin
 * @date 2017/12/9 12:14
 */
@Api(value = "客户基础信息",description = "客户基础信息")
@Alias(value = "CusBaseInfo")
public class CusBaseInfo {
    @ApiModelProperty(value = "客户ID",name = "cusId",dataType = "String",readOnly = true)
    private String cusId;
    @ApiModelProperty(value = "客户编码",name = "cusCode",dataType = "String",required = true,readOnly = true)
    private String cusCode;
    @ApiModelProperty(value = "客户名称",name = "cusName",dataType = "String",required = true,readOnly = true)
    private String cusName;
    @ApiModelProperty(value = "客户简称",name = "cusAbbr",dataType = "String")
    private String cusAbbr;
    @ApiModelProperty(value = "客户地址",name = "address",dataType = "String")
    private String address;

    public CusBaseInfo() {
    }

    public CusBaseInfo(String cusId, String cusCode, String cusName, String cusAbbr, String address) {
        this.cusId = cusId;
        this.cusCode = cusCode;
        this.cusName = cusName;
        this.cusAbbr = cusAbbr;
        this.address = address;
    }
    //省略get和set方法
}

5、创建Mapper接口

/**
 * 客户基础信息数据操作接口
 * @author Arvin
 * @date 2017/12/9 12:17
 */
@Mapper
public interface CusBaseInfoMapper {
    /**
     * 获取所有客户信息
     * @return
     */
    List<CusBaseInfo> getAllCusBaseInfo();

    /**
     * 保存客户基础信息
     * @param cusBaseInfo 客户基础信息
     * @return
     */
    int saveCusBaseInfo(CusBaseInfo cusBaseInfo);

    /**
     * 根据客户ID获取客户基础信息
     * @param cusId 客户ID
     * @return
     */
    CusBaseInfo getCusBaseInfoById(String cusId);

    /**
     * 根据客户名称获取客户基础信息
     * @param cusName 客户名称
     * @return
     */
    CusBaseInfo getCusBaseInfoByName(String cusName);

    /**
     * 修改客户基础信息
     * @param cusBaseInfo 客户基础信息
     * @return
     */
    int updateCusBaseInfo(CusBaseInfo cusBaseInfo);

    /**
     * 根据客户ID删除客户信息
     * @param cusId 客户ID
     * @return
     */
    int deleteCusBaseInfo(String cusId);

    /**
     * 批量删除客户信息
     * @param cusIds 客户ID
     * @return
     */
    int deleteBatchCusBaseInfo(String[] cusIds);
}

这里需要注意必须加上@Mapper的注解,不然@Autowired将注入失败

6、创建Mapper XML映射文件

我的xml文件创建到maven的resources下的。

<?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="com.tenghu.sbm.cus.mapper.CusBaseInfoMapper">
    <!--结果集-->
    <resultMap id="cus_base_info" type="CusBaseInfo">
        <id column="cus_id" property="cusId" javaType="String"></id>
        <result column="cus_code" property="cusCode" javaType="String"/>
        <result column="cus_name" property="cusName" javaType="String"/>
        <result column="cus_abbr" property="cusAbbr" javaType="String"/>
        <result column="address" property="address" javaType="String"/>
    </resultMap>

    <!--表名-->
    <sql id="sql_tab">cus_base_info</sql>

    <!--查询所有字段-->
    <sql id="sql_select_all">select * from </sql>

    <!--查询所有客户基础信息-->
    <select id="getAllCusBaseInfo" resultMap="cus_base_info">
        <include refid="sql_select_all"/>
        <include refid="sql_tab"/>
    </select>

    <!--保存客户基础信息-->
    <insert id="saveCusBaseInfo" parameterType="CusBaseInfo">
        <selectKey keyProperty="cusId" order="BEFORE" resultType="String">
            select replace(uuid(),'-','')
        </selectKey>
        insert into cus_base_info(cus_id,cus_code,cus_name,cus_abbr,address) values(#{cusId},#{cusCode},#{cusName},#{cusAbbr},#{address})
    </insert>

    <!--根据客户ID获取客户基础信息-->
    <select id="getCusBaseInfoById" resultMap="cus_base_info">
        <include refid="sql_select_all"/>
        <include refid="sql_tab"/>
        <where>cus_id = #{cusId}</where>
    </select>

    <!---根据客户名称获取客户基础信息-->
    <select id="getCusBaseInfoByName" resultMap="cus_base_info">
        <include refid="sql_select_all"/>
        <include refid="sql_tab"/>
        <where>cus_name = #{cusName}</where>
    </select>

    <!--修改客户信息-->
    <update id="updateCusBaseInfo" parameterType="CusBaseInfo">
        update <include refid="sql_tab"/>
        <set>
            cus_id = #{cusId}
            <if test="null!=cusCode and ''!=cusCode">,cus_code=#{cusCode}</if>
            <if test="null!=cusName and ''!=cusName">,cus_name=#{cusName}</if>
            <if test="null!=cusAbbr and ''!=cusAbbr">,cus_abbr=#{cusAbbr}</if>
            <if test="null!=address and ''!=address">,address=#{address}</if>
        </set>
        <where>
            cus_id=#{cusId}
        </where>
    </update>

    <!--根据客户ID删除客户信息-->
    <delete id="deleteCusBaseInfo" parameterType="String">
        delete from <include refid="sql_tab"/>
        <where>
            cus_id=#{cusId}
        </where>
    </delete>

    <!--根据客户ID批量删除客户信息-->
    <delete id="deleteBatchCusBaseInfo" parameterType="String">
       delete from <include refid="sql_tab"/>
        <where>
            cus_id in
            <foreach collection="array" item="cusId" open="(" separator="," close=")">
                #{cusId}
            </foreach>
        </where>
    </delete>
</mapper>

到这里就已经整合好了。下面创建服务层。

7、创建Service与实现

/**
 * 客户基础信息服务接口
 * @author Arvin
 * @date 2017/12/9 12:35
 */
public interface CusBaseInfoService {
    /**
     * 获取所有客户基础信息
     * @return
     */
    RestResponse getAllCusBaseInfo();

    /**
     * 保存客户基础信息
     * @param cusBaseInfo 客户基础信息
     * @return
     */
    RestResponse saveCusBaseInfo(CusBaseInfo cusBaseInfo);

    /**
     * 根据客户ID获取客户基础信息
     * @param cusId 客户ID
     * @return
     */
    RestResponse getCusBaseInfoById(String cusId);

    /**
     * 修改客户基础信息
     * @param cusBaseInfo 客户基础信息
     * @return
     */
    RestResponse updateCusBaseInfo(CusBaseInfo cusBaseInfo);

    /**
     * 根据客户ID删除客户信息
     * @param cusId 客户ID
     * @return
     */
    RestResponse deleteCusBaseInfo(String cusId);

    /**
     * 批量删除客户信息
     * @param cusIds 客户ID
     * @return
     */
    RestResponse deleteBatchCusBaseInfo(String[] cusIds);
}

/**
 * 客户基础信息服务实现类
 * @author Arvin
 * @date 2017/12/9 12:37
 */
@Service
public class CusBaseInfoServiceImpl implements CusBaseInfoService{

    @Autowired
    private CusBaseInfoMapper cusBaseInfoMapper;

    @Override
    public RestResponse getAllCusBaseInfo() {
        return RestResponseFactory.getSucResponse(cusBaseInfoMapper.getAllCusBaseInfo());
    }

    @Override
    public RestResponse saveCusBaseInfo(CusBaseInfo cusBaseInfo) {
        //根据客户名称获取客户信息
        CusBaseInfo oldCusBaseInfo=cusBaseInfoMapper.getCusBaseInfoByName(cusBaseInfo.getCusName());
        if(null!=oldCusBaseInfo){
            return RestResponseFactory.getErrorResponse("客户【"+cusBaseInfo.getCusName()+"】已存在!");
        }
        //保存客户信息
        int result=cusBaseInfoMapper.saveCusBaseInfo(cusBaseInfo);
        if(result>0){
            return RestResponseFactory.getSucResponse(cusBaseInfo);
        }
        return RestResponseFactory.getErrorResponse("客户【"+cusBaseInfo.getCusName()+"】保存失败!");
    }

    @Override
    public RestResponse getCusBaseInfoById(String cusId) {
        return RestResponseFactory.getSucResponse(cusBaseInfoMapper.getCusBaseInfoById(cusId));
    }

    @Override
    public RestResponse updateCusBaseInfo(CusBaseInfo cusBaseInfo) {
        //检查客户是否存在
        CusBaseInfo oldCusBaseInfo=cusBaseInfoMapper.getCusBaseInfoById(cusBaseInfo.getCusId());
        if(null==oldCusBaseInfo){
            return RestResponseFactory.getErrorResponse("客户【"+cusBaseInfo.getCusName()+"】不存在!");
        }
        //更新客户信息
        int result=cusBaseInfoMapper.updateCusBaseInfo(cusBaseInfo);
        if(result>0){
            return RestResponseFactory.getSucResponse("更新成功!");
        }
        return RestResponseFactory.getErrorResponse("更新失败!");
    }

    @Override
    public RestResponse deleteCusBaseInfo(String cusId) {
        int result=cusBaseInfoMapper.deleteCusBaseInfo(cusId);
        return result>0?RestResponseFactory.getSucResponse("删除成功!"):RestResponseFactory.getErrorResponse("删除失败!");
    }

    @Override
    public RestResponse deleteBatchCusBaseInfo(String[] cusIds) {
        int result=cusBaseInfoMapper.deleteBatchCusBaseInfo(cusIds);
        return result>0?RestResponseFactory.getSucResponse("删除成功!"):RestResponseFactory.getErrorResponse("删除失败!");
    }
}

这里的service层的接口返回参数都为RestResponse 类,该类的作用是统一处理消息结果。通常在开发接口时都需要返回消息CODE,消息内容及数据这些信息,如果每个接口都写一遍,除了浪费时间,代码也不美观。

8、启动查看效果

这里写图片描述
上面说到返回接口信息统一,如下:
这里写图片描述
其他接口都是都有status、message、data这三个参数,当然了如果data为空,在返回结果里面就不会出现,这里需要配置SpringBoot在序列化结果时忽略为空的字段。配置如下:

spring:
  jackson:
    default-property-inclusion: non_null

这里的代码没有放出Controller类,如需要查看完整的结果实例可查看:SpringBoot整合MyBatis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老虎Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值