个人技术总结
基本描述
这个作业属于哪个课程 | 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