1 引言
上一篇简单介绍了下MyBatis,知道并了解什么是MyBatis,MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
具体详细可以参考这里,【技术:Java-Web基础|MyBatis(一)】。
这一章节,我们实际手操一下,看下MyBatis是如何工作的。虽然比较早期的一些技术,作为了解就可以了。我们现在基本上都是使用MyBatis-Plus来操作。
2 MyBatis实操
这一章节是MyBatis整合到SpringBoot,实现CURD。
2.1 创建实验项目
这里,我们使用IDEA创建一个项目,创建一个名称为tool-mybatis的项目。创建项目的结构如下,我这里是父子项目,将项目放在了tool-demo模块下,如果只需要查看MyBatis,只需要创建这个就好。其中蓝色部分为默认初始化项目结构,后续黑色为新增。
├── tool-mybatis
├── doc
│ └── mybatis.sql
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── liu
│ │ │ ├── ToolMybatisApplication.java
│ │ │ └── mybatis
│ │ │ ├── BizTempController.java
│ │ │ ├── domain
│ │ │ │ └── BizTemp.java
│ │ │ ├── mapper
│ │ │ │ └── BizTempMapper.java
│ │ │ └── service
│ │ │ ├── BizTempService.java
│ │ │ └── impl
│ │ │ └── BizTempServiceImpl.java
│ │ └── resources
│ │ ├── application.yml
│ │ ├── com.liu.mybatis.mapper
│ │ │ └── BizTempMapper.xml
2.2 创建实验表
这里我创建一张表,名称为`biz_temp`,创建表结构脚本如下,最后新增两条数据进去(实验的表,我放在上面结构的doc文件夹中):
REATE TABLE `biz_temp` ( `id` int(11)NOTNULL AUTO_INCREMENT, `sn` varchar(32)NOTNULL COMMENT '流水号', `operator` varchar(32)NOTNULL COMMENT '办理人', `operator_phone` varchar(32)NOTNULL COMMENT '办理人手机号码', `operator_desc` varchar(1000)NOTNULL COMMENT '处理详情', `operator_time` datetime DEFAULT NULL COMMENT '处理时间', `created_by` varchar(32) DEFAULT NULL COMMENT '创建人', `created_time` datetime DEFAULT NULL COMMENT '创建时间', `updated_by` varchar(32) DEFAULT NULL COMMENT '更新人', `updated_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `ids_sn` (`sn`), KEY `ids_operator` (`operator`), KEY `ids_submit_time` (`operator_time`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='临时业务异常信息';INSERTINTO `biz_temp`(`id`, `sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`, `created_by`, `created_time`, `updated_by`, `updated_time`)VALUES(1,'0ed704749be211eab558c739c840e6c0','张三','13800138999','同意',NULL,NULL,NULL,NULL,NULL);INSERTINTO `biz_temp`(`id`, `sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`, `created_by`, `created_time`, `updated_by`, `updated_time`)VALUES(2,'2700553c9be211eab558c739c840e6c0','李四','13800138888','同意',NULL,NULL,NULL,NULL,NULL);
查看创建表,插入的数据
2.3 引入maven依赖
想要使用MyBatis,那么我们得引入Mabatis的依赖。当前我们使用包管理器Maven来引入依赖,Maven的依赖如下:
<dependencies><!-- SpringBoot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><version>${spring-boot.version}</version></dependency><!-- MyBatis SpringBoot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-springboot.version}</version></dependency><!-- MySQL --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-jdbc.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>${spring-boot.version}</version></dependency></dependencies>
2.4 创建实体关系
创建实体类BizTemp.java
packagecom.liu.mybatis.domain; importorg.apache.commons.lang3.builder.ToStringBuilder; importjava.io.Serializable; importjava.util.Date; /*** <p> BizTemp </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:39*/publicclassBizTempimplementsSerializable { publicLongid; publicStringsn; publicStringoperator; publicStringoperatorPhone; publicStringoperatorDesc; publicDateoperatorTime; publicStringcreatedBy; publicDatecreatedTime; publicStringupdatedBy; publicDateupdatedTime; publicLonggetId() { returnid; } publicvoidsetId(Longid) { this.id=id; } publicStringgetSn() { returnsn; } publicvoidsetSn(Stringsn) { this.sn=sn; } publicStringgetOperator() { returnoperator; } publicvoidsetOperator(Stringoperator) { this.operator=operator; } publicStringgetOperatorPhone() { returnoperatorPhone; } publicvoidsetOperatorPhone(StringoperatorPhone) { this.operatorPhone=operatorPhone; } publicStringgetOperatorDesc() { returnoperatorDesc; } publicvoidsetOperatorDesc(StringoperatorDesc) { this.operatorDesc=operatorDesc; } publicStringgetCreatedBy() { returncreatedBy; } publicvoidsetCreatedBy(StringcreatedBy) { this.createdBy=createdBy; } publicDategetOperatorTime() { returnoperatorTime; } publicvoidsetOperatorTime(DateoperatorTime) { this.operatorTime=operatorTime; } publicStringgetUpdatedBy() { returnupdatedBy; } publicvoidsetUpdatedBy(StringupdatedBy) { this.updatedBy=updatedBy; } publicDategetUpdatedTime() { returnupdatedTime; } publicvoidsetUpdatedTime(DateupdatedTime) { this.updatedTime=updatedTime; } publicDategetCreatedTime() { returncreatedTime; } publicvoidsetCreatedTime(DatecreatedTime) { this.createdTime=createdTime; } publicStringtoString() { returnnewToStringBuilder(this) .append("id", id) .append("sn", sn) .append("operator", operator) .append("operatorPhone", operatorPhone) .append("operatorDesc", operatorDesc) .append("operatorTime", operatorTime) .append("createdBy", createdBy) .append("createdTime", createdTime) .append("updatedBy", updatedBy) .append("updatedTime", updatedTime) .toString(); } }
2.4 创建服务类
创建服务类,用于业务处理BizTempService.java
packagecom.liu.mybatis.service; importcom.liu.mybatis.domain.BizTemp; importjava.util.List; /*** <p> BizService </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:43*/publicinterfaceBizTempService { List<BizTemp>findAll(); voidsaveBizTemp(BizTempuser); voidupdateBizTemp(BizTempuser); voiddeleteBizTemp(Integerid); List<BizTemp>findBizTempBySn(Stringsn); intgetTotal(); BizTempfindBizTempById(intid); }
创建服务类,用于业务处理BizTempServiceImpl.java
packagecom.liu.mybatis.service.impl; importcom.liu.mybatis.domain.BizTemp; importcom.liu.mybatis.mapper.BizTempMapper; importcom.liu.mybatis.service.BizTempService; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Service; importjava.util.List; /*** <p> BizServiceImpl </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:44*/publicclassBizTempServiceImplimplementsBizTempService { publicBizTempMapperbizTempMapper; publicList<BizTemp>findAll() { returnbizTempMapper.findAll(); } publicvoidsaveBizTemp(BizTempbizTemp) { bizTempMapper.saveBizTemp(bizTemp); } publicvoidupdateBizTemp(BizTempbizTemp) { bizTempMapper.updateBizTemp(bizTemp); } publicvoiddeleteBizTemp(Integerid) { bizTempMapper.deleteBizTemp(id); } publicList<BizTemp>findBizTempBySn(Stringsn) { returnbizTempMapper.findBizTempBySn(sn); } publicintgetTotal() { returnbizTempMapper.getTotal(); } publicBizTempfindBizTempById(intid) { returnbizTempMapper.findBizTempById(id); } }
2.6 创建数据库连接业务接口
业务接口主要是映射xml文件,BizTempMapper.java
packagecom.liu.mybatis.mapper; importcom.liu.mybatis.domain.BizTemp; importorg.apache.ibatis.annotations.Mapper; importjava.util.List; /*** <p> BizService </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/3 22:43*/publicinterfaceBizTempMapper { List<BizTemp>findAll(); voidsaveBizTemp(BizTempuser); voidupdateBizTemp(BizTempuser); voiddeleteBizTemp(Integerid); List<BizTemp>findBizTempBySn(Stringsn); intgetTotal(); BizTempfindBizTempById(intid); }
数据库操作XML,BizTempMapper.xml
<!--会以namespace 和 id 在mapper 中查询具体的方法resultType 表示返回对象的数据类型parameterType 表示传入的数据对象id 唯一标识,要与命名空间(抽象方法)中定义的方法名称一致最主要的目的是:防止接口ID重名--><mappernamespace="com.liu.mybatis.mapper.BizTempMapper"><!-- id,在文件中唯一的标识,映射com.liu.mybatis.mapper.BizTempMapper中的方法 --><!-- resultType,返回的结果 --><selectid="findAll"resultType="com.liu.mybatis.domain.BizTemp"> select * from biz_temp; </select><!-- parameterType,接收参数的类型 --><insertid="saveBizTemp"parameterType="com.liu.mybatis.domain.BizTemp"><!-- 将自增id存入biz_temp对象中 --><selectKeykeyColumn="id"resultType="int"order="AFTER"keyProperty="id"> select last_insert_id() </selectKey> insert into `biz_temp` (`sn`, `operator`, `operator_phone`, `operator_desc`, `operator_time`) values (#{sn}, #{operator}, #{operator_phone}, #{operator_desc}, #{operator_time}) </insert><updateid="updateBizTemp"parameterType="com.liu.mybatis.service.BizTempService"> update biz_temp set operator = #{operator} where id = #{id} </update><selectid="findBizTempBySn"parameterType="String"resultType="BizTemp"> select * from biz_temp where sn like "%${sn}%" </select><!-- resultType,返回结果类型,常量类型 --><selectid="getTotal"resultType="int"> select count(*) from biz_temp </select><deleteid="deleteBizTemp"parameterType="int"> delete from biz_temp where id = #{id} </delete><selectid="findBizTempById"parameterType="int"resultType="BizTemp"> select * from biz_temp where id = #{id} </select></mapper>
2.7 数据库连接yml
server: port: 9000 spring: application: name: tool-mybatis datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/study?characterEncoding=utf8 username: mybatis-study password: mybatis-study_1234 mybatis: mapper-locations: classpath:com.liu.mybatis.mapper/*Mapper.xml type-aliases-package: com.liu.mybatis configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.8 编写页面控制器
packagecom.liu.mybatis; importcom.liu.mybatis.domain.BizTemp; importcom.liu.mybatis.service.impl.BizTempServiceImpl; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RestController; importjava.util.Date; importjava.util.List; importjava.util.UUID; /*** <p> BizTempController </p>** @author Aion.Liu* @version v1.0.0* @description TODO* @since 2022/9/4 00:36*/"biz-temp/") (publicclassBizTempController { publicBizTempServiceImplbizTempService; "/findAll") (publicvoidTestFindAll() { List<BizTemp>bizTempList=bizTempService.findAll(); for (BizTempBizTemp : bizTempList) System.out.println(BizTemp); } "/saveBizTemp") (publicvoidTestSaveBizTemp() { BizTempbizTemp=newBizTemp(); bizTemp.setOperator("张三"+System.currentTimeMillis()); System.out.println(bizTemp); bizTempService.saveBizTemp(bizTemp); System.out.println(bizTemp); } "/getTotal") (publicvoidTestGetTotal() { System.out.println("获取数据库记录数:"+bizTempService.getTotal()); } "/findBizTemoBuName") (publicvoidTestFindBizTempByName() { List<BizTemp>BizTemps=bizTempService.findBizTempBySn("553c9be211e"); for (BizTempBizTemp : BizTemps) System.out.println(BizTemp); } "/updateBizTemp") (publicvoidTestUpdateBizTemp() { BizTempbizTemp=newBizTemp(); bizTemp.setSn(UUID.randomUUID().toString().replace("-", "")); bizTemp.setOperator("张三"+System.currentTimeMillis()); bizTemp.setOperatorDesc("测试"); bizTemp.setOperatorPhone("13800138000"); bizTemp.setOperatorTime(newDate()); bizTemp.setCreatedBy("admin"); bizTemp.setCreatedTime(newDate()); bizTempService.updateBizTemp(bizTemp); } "/deleteBizTemp") (publicvoidTestDeleteBizTemp() { bizTempService.deleteBizTemp(4); } "/findBizTempById") (publicvoidTestFindBizTempById() { BizTempbizTemp=bizTempService.findBizTempById(2); System.out.println(bizTemp); } }
2.9 访问测试
当我们请求测试地址:http://localhost:9000/biz-temp/findAll
看到控制台打印:
==> Preparing: select * from biz_temp; ==> Parameters: <== Columns: id, sn, operator, operator_phone, operator_desc, operator_time, created_by, created_time, updated_by, updated_time <== Row: 1, 0ed704749be211eab558c739c840e6c0, 张三, 13800138999, 同意, null, null, null, null, null <== Row: 2, 2700553c9be211eab558c739c840e6c0, 李四, 13800138888, 同意, null, null, null, null, null <== Total: 2 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@26e62ceb] com.liu.mybatis.domain.BizTemp@2336f1f6[id=1,sn=0ed704749be211eab558c739c840e6c0,operator=张三,operatorPhone=<null>,operatorDesc=<null>,operatorTime=<null>,createdBy=<null>,createdTime=<null>,updatedBy=<null>,updatedTime=<null>] com.liu.mybatis.domain.BizTemp@6b8a1838[id=2,sn=2700553c9be211eab558c739c840e6c0,operator=李四,operatorPhone=<null>,operatorDesc=<null>,operatorTime=<null>,createdBy=<null>,createdTime=<null>,updatedBy=<null>,updatedTime=<null>]
其他接口可以参考测试。