• java学习day42--Spring Boot 基础(一)-- 整合MyBatis框架


    Spring Boot基础

    Spring Boot 整合MyBatis框架

    概述,认识

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

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

    初始配置

    官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

    Maven仓库地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter/2.1.1

    第一步:导入mybatis依赖

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

    注意:在添加此依赖时,一定指定其版本(version),因为在springboot默认配置中没有设置mybatis框架版本。

    我们添加了mybatis依赖以后,spring框架启动时会对mybatis进行自动配置。

    第二步:进行简易配置

    在application.properties文件,在此文件中进行基本配置(可选,暂时可以不配置)

    mybatis.configuration.default-statement-timeout=30
    mybatis.configuration.map-underscore-to-camel-case=true
    

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

    logging.level.com.cy=DEBUG
    

    2.3 业务分析及实现

    2.3.1 基本业务实现及单元测试

    基于Spring对MyBatis框架的整合,实现对商品库中数据的删除操作。

    第一步:业务API架构设计,如图所示:

    第二步:基于id执行商品信息删除,其业务时序,如图所示:

    第三步:定义商品业务数据层接口及业务方法。

    package com.cy.pj.goods.dao;
    
    import   org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Mapper;
    @Mapper
    public  interface GoodsDao {
             @Delete("delete from tb_goods where id=#{id}")
             int deleteById(Integer id);
    }
    

    其中:@Mapper是由MyBatis框架中定义的一个描述数据层接口的的注解(所有的注解只起到一个描述性的作用),用于告诉Spring框架此接口的实现由mybatis创建,并将其实现类对象存储到spring容器.

    第四步:定义测试类,对GoodsDao对象进行应用测试

    @SpringBootTest
    public class GoodsDaoTests {    
    
        @Autowired
        private GoodsDao goodsDao;
    
        @Test
        public void testDeleteById() {
            int rows=goodsDao.deleteById(10);
            System.out.println("影响行数为:"+rows);
        }
    }
    

    第五步:删除业务时序图增强分析,如图所示(了解SqlSession应用):

    第六步:MyBatis API 对象应用过程分析,如图所示:

    在图-12中,展示业务设计中API对象的一种调用关系。例如我们的数据访问对象调用MyBatis API,然后MyBatis API底层通过使用用JDBC API(两大部分:java.sql., javax.sql.)访问数据库。

    2.3.2 业务进阶分析及实现

    在MyBatis框架中定义SQL映射的方式有两种:

    一种是将SQL映射定义在我们的xml映射文件中,(简单的SQL映射可以直接以注解方式进行声明)

    一种方式是借助注解将其声明在接口方法上。(复杂SQL还是要写到xml中,充分利用动态SQL进行设计会更好一些。)

    基于XML方式定义GoodsDao接口中的方法映射,并进行单元测试:

    Step01:在GoodsDao中,定义删除方法,具体代码如下:

     //int deleteObjects(@Param("ids")Integer ...ids);//早期版本需要基于@Param注解定义参数名
    int deleteObjects(Integer... ids);//sql映射中可以使用array,ids参数名来接收方法参数数据	  
    

    说明:当接口方法对应的映射语句相对比较复杂时,建议将映射语句写到对应映射文件。

    Step02:在src/main/resources目录下创建mapper/goods目录,然后在其目录中添加GoodsMapper.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.goods.dao.GoodsDao"*>
    	<!-- 删除多个元素 -->
        <delete id=*"deleteObjects"*>
            delete from tb_goods
            <where>
    			 <!-- 删除的时候尽量防止误删, 如果写的代码不当可能会删除重要数据
     				一般也很少写删除业务, 经常使用更改状态来(假)删除数据
    				-->
                <if test="ids!=null and ids.length!=0" >
                    <foreach collection="ids"
                             open="("
                             close=")"
                             separator=","
                             item="id">
                        #{id}
                    </foreach>
                </if>
                or 2=3
            </where> 
        </delete>
    </mapper>
    

    Step03:在application.properties文件中添加如下配置:

    mybatis.mapper-locations=classpath:/mapper/*/*.xml
    

    Step04:在GoodsDaoTests类中添加如下单元测试方法进行单元测试:

    @Test
    public void testDeleteObjects() {
        int rows=goodsDao.deleteObjects(17,18);
        System.out.println("影响行数为:"+rows);
    }
    

    2.4 构建业务层接口及实现类

    实现一个查询业务:

    具体步骤如下:

    第一步:定义pojo对象(Goods)用于存储从数据库查询到的商品信息.

    package com.cy.pj.goods.pojo;
    
    import java.util.Date;
    
    public class Goods {
    	
    	private Long id;
    	private String name;
    	private String remark;
    	private Date createdTime;
    	public Long getId() {
    		return id;
    	}
    	public void setId(Long id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getRemark() {
    		return remark;
    	}
    	public void setRemark(String remark) {
    		this.remark = remark;
    	}
    	public Date getCreatedTime() {
    		return createdTime;
    	}
    	public void setCreatedTime(Date createdTime) {
    		this.createdTime = createdTime;
    	}
    	@Override
    	public String toString() {
    		return "Goods [id=" + id + ", name=" + name + ", "
    				+ "remark=" + remark + ", createdTime=" + createdTime + "]";
    	}
    }
    
    

    第二步:定义dao方法方法,用于查询数据库数据。

    package com.cy.pj.goods.dao;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    import com.cy.pj.goods.pojo.Goods;
    
    @Mapper
    public interface GoodsDao {	
    	//查询所有
    	@Select("select id,name,remark,createdTime from tb_goods")
    	List<Goods> findObjects();
    
    }
    

    第三步:定义业务层接口以及实现类,然后在类中添加商品查询的业务方法。

    GoodsService接口定义

    package com.cy.pj.goods.service;
    
    import java.util.List;
    
    import com.cy.pj.goods.pojo.Goods;
    
    public interface GoodsService {
    	//查询所有
    	List<Goods> findGoods();
    
    }
    

    GoodsServiceImpl实现类定义

    package com.cy.pj.goods.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.cy.pj.goods.dao.GoodsDao;
    import com.cy.pj.goods.pojo.Goods;
    import com.cy.pj.goods.service.GoodsService;
    @Service
    public class GoodsServiceImpl implements GoodsService {
    	@Autowired
    	private GoodsDao goodDao;
    	@Override
    	public List<Goods> findGoods() {
    		List<Goods> goods = goodDao.findObjects();
    		return goods;
    	}
    }
    

    第四步:定义单元测试类,对业务层方法进行单元测试(在测试目录下定义)

    package com.cy.pj.goods.service;
    
    import java.util.List;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import com.cy.pj.goods.pojo.Goods;
    
    @SpringBootTest
    public class GoodsServiceTests {
    	@Autowired
    	private GoodsService goodsService;
    	@Test
    	public void testFindGoods() {
    		List<Goods> findGoods = goodsService.findGoods();
    		for (Goods goods : findGoods) {
    			System.out.println(goods);
    		}
    	}		
    }
    

    测试结果如下:

    .....
    Goods [id=11, name=mysql, remark=RDBMS, createdTime=Wed Jul 01 15:21:30 CST 2020]
    Goods [id=12, name=Oracle, remark=RDBMS, createdTime=Wed Jul 01 15:21:30 CST 2020]
    ......
    

    测试成功,搞定!

  • 相关阅读:
    函数的定义
    编码转换
    bytes类型
    用py操作文件(file类的功能)
    HASH哈希
    二进制、bit、 bytes
    POJ3225
    POJ1436
    HDU1394
    HDU1272
  • 原文地址:https://www.cnblogs.com/liqbk/p/13228192.html
Copyright © 2020-2023  润新知