43-SpringBoot工程中MyBatis应用实践

MyBatis环境初始化

概述
Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。Mybatis框架的简单应用架构,如图-15所示:

在这里插入图片描述

在当今的互联网应用中项目,mybatis框架通常会由spring框架进行资源整合,作为数据层技术实现数据交互操作。

创建项目并依赖

第一步:创建项目03-springboot-mybatis,然后添加mybatis启动依赖。

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
 </dependency>

我们添加了mybatis依赖以后,spring框架启动时会对mybatis进行自动配置。例如SqlSessionFactory工厂对象的创建。

第二步:Mybatis简易配置实现。
假如需要对mybatis框架进行简易配置,可以打开application.properties文件,在此文件中进行基本配置(可选,暂时可以不配置),例如:

mybatis.configuration.default-statement-timeout=30
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath:/mapper/*/*.xml

配置mybatis中的sql日志的输出:(com.cy为我们写的项目的根包)

logging.level.com.cy=DEBUG

环境测试代码实现
在src/test/java目录中添加测试类,对mybatis框架整合进行基本测试,代码如下:

package com.cy.pj.sys.dao;

@SpringBootTest
public class MyBatisTests {
	   @Autowired
	   private SqlSession sqlSession;
	   @Test
	   public void testGetConnection() {
		   Connection conn=sqlSession.getConnection();
		   System.out.println("connection="+conn);
	   }
}

在SpringBoot脚手架工程中,Spring框架会基于MyBatis框架底层配置,创建SqlSessionFactory对象,然后再通过此工厂对象创建SqlSession,最后基于Springku框架为测试类注入SqlSession对象,接下来,我们可以通过SqlSession对象实现与数据库的会话了。如图所示:

在这里插入图片描述

公告数据层MyBatis实践

业务描述
基于SpringBoot脚手架工程对MyBatis框架的整合,实现对通告数据的操作。

Pojo类设计

创建SysNotice类,借助此类对象封装公告(通知)数据。

package com.cy.pj.sys.pojo;
public class SysNotice {
    /** 公告ID */
    private Long id;

    /** 公告标题 */
    private String title;

    /** 公告类型(1通知 2公告) */
    private String type;

    /** 公告内容 */
    private String content;

    /** 公告状态(0正常 1关闭) */
    private String status;

    /** 备注*/
    private String remark;


    /** 创建时间 */
    private Date createdTime;

    /** 修改时间*/
    private Date modifiedTime;

    /** 创建用户 */
    private String createdUser;

     /** 修改用户*/
    private String modifiedUser;

    //自己添加set/get/toString方法

}

Dao接口及方法

第一步:定义通告业务数据层接口及业务方法。借助此类型的对象基于MyBatis技术实现与数据库的交互。

package com.cy.pj.notice.dao;

@Mapper
public interface SysNoticeDao {

    /**
     * 基于条件查询公告信息
     * @param notice 用于封装查询参数
     * @return 基于查询条件查询到结果
     */
    List<SysNotice> selectNotices(SysNotice notice);

    /**
     * 基于id删除公告信息
     * @param id
     * @return 删除了几行
     * 说明:在jdk8之前,对于接口方法,假如参数有多个或者参数是数组,是不可以
     * 直接在sql映射文件中使用参数名的,需要通过@Param这个注解定义参数名,然后
     * 在sql映射语句中使用@Param注解中的名字获取参数数据。对于数组而言在sql映射
     * 中可以直接使用array进行接收也可以。
     */
    int deleteById(@Param("ids") Long... id);//array

    /**
     * 持久化notice对象数据
     * @param notice (封装了要写入的数据)
     * @return 返回写入的行数。
     */
    int insertNotice(SysNotice notice);

    /**
     * 基于id查询notice对象
     * @param id 公告唯一标识id
     * @return 基于id查询到结果
     * 建议:简单sql映射语句可以直接写到接口方法上,复杂sql还是推荐写到xml映射文件
     */
    @Select("select * from sys_notices where id=#{id}")
    SysNotice selectById(Long id);

    /**
     * 持久化notice对象数据
     * @param notice (封装了要更新的数据)
     * @return 返回更新的行数。
     */
    int updateNotice(SysNotice notice);

}

其中:@Mapper是由MyBatis框架中定义的一个描述数据层接口的的注解(所有的注解只起到一个描述性的作用),用于告诉Spring框架此接口的实现由mybatis创建,并将其实现类对象存储到spring容器。当系统启动时,会对启动类所在包以及子包中的类进行扫描,假如发现接口上有@Mapper注解(mybatis提供),系统底层会基于接口创建其实现类(借助反射包中Proxy类进行创建),在实现类的内部,底层会又基于sqlsession对象实现数据访问和操作。

第二步:创建SysNoticeDao接口对应的SQL映射文件,名字为SysNoticeMapper.xml,存储在resources/mapper/sys目录下,同时定义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="com.cy.pj.sys.dao.SysNoticeDao">
  
</mapper>

第三步:在映射文件中添加insertNotice方法对应的Sql映射,关键代码如下:

<insert id="insertNotice" parameterType="com.cy.pj.sys.pojo.SysNotice">
        insert into sys_notices
        (title,type,content,status,remark,
         createdTime,modifiedTime,createdUser,modifiedUser)
        values
        (#{title},#{type},#{content},#{status},#{remark},
         now(),now(),#{createdUser},#{modifiedUser})
    </insert>

第四步:在映射文件中定义更新公告对应的SQL映射,关键代码如下:

<update id="updateNotice" parameterType="com.cy.pj.sys.pojo.SysNotice">
         update sys_notices
         set title=#{title},
             content=#{content},
             type=#{type},
             status=#{status},
             remark=#{remark},
             modifiedTime=now(),
             modifiedUser=#{modifiedUser}
         where id=#{id}
    </update>

第五步:在映射文件中添加基于条件的SQL查询映射,关键代码如下:

<select id="selectNotices"
            parameterType="com.cy.pj.sys.pojo.SysNotice"
            resultType="com.cy.pj.sys.pojo.SysNotice">
          select *
          from sys_notices
          <where>
              <if test="type!=null and type!=''">
                 type=#{type}
              </if>
              <if test="title!=null and title!=''">
                  and title like concat("%",#{title},"%")
              </if>
              <if test="modifiedUser!=null and modifiedUser!=''">
                  and  modifiedUser like concat("%",#{modifiedUser},"%")
              </if>
          </where>
          order by createdTime desc
    </select>

第六步:在映射文件中定义删除操作对应的SQL映射,关键代码如下:

<delete id="deleteById"><!--(1,2,3,4,5)-->
         <!--foreach 用于迭代一个数组或集合-->
        delete from sys_notices
        <where>
        <if test="ids!=null and ids.length>0">
          id in
         <foreach collection="ids" open="(" close=")" separator="," item="id">
            #{id}
         </foreach>
        </if>
         or 1=2
        </where>
    </delete>

单元测试实现及分析

第一步:在src/java/test目录下定义测试类,对NoticeDao对象进行应用测试。

package com.cy.pj.sys.dao;

@SpringBootTest
public class SysNoticeDaoTests {  
  
    @Autowired
    private SysNoticeDao sysNoticeDao;.
}

第二步:在单元测试类中添加insert操作的单元测试方法,代码如下:

@Test
    void testInsertNotice(){
        //创建SysNotice对象,通过此对象封装要写入到数据库的数据
        SysNotice notice=new SysNotice();
        notice.setTitle("CGB2011结课时间");
        notice.setContent("2021/3/20正式结课");
        notice.setStatus("0");
        notice.setType("1");
        notice.setCreatedUser("tony");
        notice.setModifiedUser("tony");
        //将SysNotice对象持久化到数据库
        sysNoticeDao.insertNotice(notice);
//此方法的实现内部会通过SQLSession向表中写数据。
    }

第三步:定义基于id进行查询的单元测试方法,代码如下:

@Test
    void testSelectById(){
        SysNotice notice=sysNoticeDao.selectById(1L);
        System.out.println(notice);
    }

第四步:定义基于id执行修改的单元测试方法,代码如下:

@Test
  void testUpdateNotice(){
        //基于id查询通知对象
        SysNotice notice=sysNoticeDao.selectById(1L);
        notice.setType("2");
        notice.setContent("2021/07/09 春节假期");
        notice.setModifiedUser("json");
        //将更新以后的内容持久化到数据库
        sysNoticeDao.updateNotice(notice);
    }

第五步:定义单元测试方法,代码如下:

@Test
  void testDeleteById(){
        int rows=
        sysNoticeDao.deleteById(1,3,4);
        System.out.println("rows="+rows);
  }

第六步:定义基于条件查询通过信息的单元测试方法,代码如下:

@Test
void testSelectNotices(){
    SysNotice notice=new SysNotice();
    notice.setType("1");
    notice.setTitle("开学");
    notice.setModifiedUser("tony");
    List<SysNotice> list=sysNoticeDao.selectNotices(notice);
    for(SysNotice n:list){
        System.out.println(n);
    }
}

总结(Summary)

重难点分析
MyBatis框架核心优势(简单、灵活、功能强大)
MyBatis框架应用架构及核心API(SqlSessionFactory,SqlSession,…)
MyBatis框架在SpringBoot工程中的整合(参考官网)
MyBatis框架与数据库会话的入口及会话过程
MyBatis框架中的动态SQL应用

FAQ分析

MyBatis是什么?(持久层框架,半成品-只解决了数据的持久化问题)
为什么选择MyBatis?(开源,简单,功能强大,灵活,稳定,…)
MyBatis应用场景?(互联网软件应用都倾向于使用mybatis做数据持久化)
MyBatis框架实现与数据库交互的入口对象?SqlSession
SqlSession对象是如何创建的?SqlSessionFactory
你了解哪些具体的SqlSession对象呢?(DefaultSqlSession,SqlSessionTemplate)
@Mapper注解的作用是什么?
MyBatis为我们的Dao接口创建的实现类及其方法内部做了什么?

BUG分析

BindingException
BadSqlGrammarException
SqlSyntaxErrorException
UnstatisfiedDependencyException
BeanInstantiationException

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值