个人技术总结

基本描述



这个作业属于哪个课程 2021春软件工程实践|W班 (福州大学)
这个作业要求在哪里 软件工程实践总结&个人技术博客
这个作业的目标 总结描述Mybatis在SpringBoot中的使用
其他参考文献

技术概述

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射,负责与数据库进行直接的交互,技术的难点在于编写映射数据库表的dao层XML文件

技术详述

Mybatis有XML文件和注解两种配置方法,一般项目当中比较常用的是注解开发(因为简单!)主要步骤有四步,分别是配置文件,编写mapper的接口类,编写DAO的xml文件,@Autowired注入使用

配置文件

配置pom

配置文件主要是引入Mybatis依赖包以及声明dao层代码以及数据库信息文件的位置
1.在pom的dependencies节点添加Mybatis的依赖

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

2.在build节点下配置资源文件位置,以便将所有的代码放入main下的java文件夹中

        <resources>
           <!--注册dao包下mybatis 映射文件为资源目录 这样可以吧源代码里的东西放在资源文件里-->
           <resource>
               <directory>src/main/java</directory>
               <includes>
                   <include>**/*.xml</include>
                   <include>**/*.properties</include>
               </includes>
           </resource>
       </resources>

配置数据库信息文件application.yml

spring:
   datasource:
      url: jdbc:mysql://127.0.0.1:3306/数据库名称?useSSL=false&useUnicode=true&characterEncoding=UTF8&allowPublicKeyRetrieval=true&serverTimezone=Hongkong
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: 数据库用户名
      password: 数据库密码
  thymeleaf:
      cache: false
mybatis:
  type-aliases-package: com.example.test.entity
  mapper-locations: classpath*:com/example/test/dao/*.xml
server:
  port: 8080

其中url填写mysql连接字符串,driver-class-name为驱动包(mysql8.0以上使用com.mysql.cj.jdbc.Driver,mysql8.0以下使用com.mysql.jdbc.Driver,username为连接mysql的用户名,password为密码,type-aliases-package为映射数据库表的实体类的所在包地址,mapper-location为mapper文件的地址,port为项目启动使用的端口

编写接口类

@Mapper
public interface UserDAO {
	
	public String getUser(Integer id);
}

DAO的接口类与普通的interface写法相差不多,接口声明需要使用到的函数方法,在接口之前使用@Mapper注解来进行装配

编写mapper的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.example.test.dao.UserDAO">

	
	<select id="getUser" resultType="String" parameterType="Integer">
		select name from user where id = #{id};
	</select>
</mapper>

XML文件中,根节点为mapper,namespace填写接口类的全限名(所以XML文件与接口类放于同一包下),根据方法所使用的mysql语句使用的语句类型来选择子节点的节点名,即<select>、<update>、<delete>、<insert>,该节点下id与对应方法的方法名相同,resultType为返回的类型,parameterType为参数类型

如果返回类型进行类的映射时,可以使用resultMap节点

    <resultMap id="GoodsMap" type="com.example.test.entity.Goods">
       <result property="id" column="id"/>
       <result property="category" column="category"/>
       <result property="title" column="title"/>
       <result property="subtitle" column="subtitle"/>
       <result property="originPrice" column="origin_price"/>
       <result property="price" column="price"/>
       <result property="num" column="num"/>
        <result property="image" column="image"/>
   </resultMap>

   <select id="selectGoods" parameterType="Integer" resultMap="GoodsMap">
       SELECT * FROM goods
       WHERE id = #{id}
   </select>

type为映射类的全限名,每条result对应一个类的字段,property为类的字段名,column为查询结果的数据库字段名

使用DAO

	@Autowired
	UserDAO user;
	String name = user.getUser(order.getSellerId());

使用@Autowired对DAO进行自动装配即可将DAO当成一个实例类来使用,SpringBoot会自动调用xml中的Sql语句进行数据库的交互

技术使用中遇到的问题和解决过程

SpringBoot节省了很多配置的步骤,所以在使用Mybatis的过程当中并没有遇到很多难以解决的问题,但在实际使用过程中有小坑需要注意

Integer类型的字段值为0时会被条件语句test判断为空

    <update id="updateActivityEnshrine" parameterType="com.example.test.DO.ActivityEnshrineDO">
       update activity_enshrine
       <set>
           <if test="userId !=null and userId !=''">user_id=#{userId},</if>
           <if test="activityId !=null and activityId !=''">activity_id=#{activityId},</if>
       </set>
       where id=#{id}
   </update>

若此时更新的user_id为0时,条件语句会将user_id认定为'',即为空,则不会更新user_id,违背了我们原本的意思,所以解决办法有两种,一是删去userId !='',而是修改数据库设计,使得userId不能为0,基于程序的严谨性,我们选择了后者,即使数据库设计当中,int类型的字段不存在为0的情况

总结

而我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。

参考博客

Mybatis的if标签判断空字符串 == 0 ———— Dongguabai

Mybatis多条件模糊查询,动态sql,if标签 ———— fanminghao

springboot整合mybatis(详解) ———— huisheng_qaq

posted @ 2021-06-28 09:38  BigClever  阅读(79)  评论(4编辑  收藏  举报