SpringBoot整合Mybatis-XML增删改查
零、知识介绍
xml方式能够分离SQL语句,能够进行统一管理,xml方式易懂易学。
缺点:节点麻烦,不能进行debug,肉眼不好看到错误,只能进行测试。如果是新手,常常会因为环境问题,而无法实现代码功能。
一、依赖准备
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--SpingBoot集成junit测试的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--mybatis起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency><!-- MySQL连接驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>
二、配置准备
application.yml
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: 123mvc:view:suffix: .jspprefix: /resources:static-locations: classpath:templatesmybatis:type-aliases-package: com.hikktn.domainmapper-locations: classpath:mapper/*Mapper.xmlconfiguration:map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射lazy-loading-enabled: true #开启延时加载开关aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是falselazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载cache-enabled: true #打开全局缓存开关(二级环境),默认值就是truelogging:level:com.hikktn: debugserver:port: 8080servlet:context-path: /
log4j.properties
#---- global logging configuration#---- level: FATAL,ERROR,WARN,INFO,DEBUG#---- appender: console, file, mail### set log levels ###log4j.rootLogger=INFO,console### 输出到控制台 ###log4j.appender.stdout.encoding=UTF-8log4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %5p %c{1}:%L - %m%n### 输出到日志文件 ####log4j.appender.file=org.apache.log4j.DailyRollingFileAppender#log4j.appender.file.File=${webapp.root}/WEB-INF/logs/platform.log#log4j.appender.file.DatePattern=_yyyyMMdd'.log'#log4j.appender.file.Append = true#log4j.appender.file.Threshold = INFO#log4j.appender.file.layout=org.apache.log4j.PatternLayout#log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [ %t\:%r ] - [ %p ] %m%n### 打印SQL ####log4j.logger.com.ibatis=DEBUG#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG#log4j.logger.java.sql.ResultSet=DEBUG#配置logger扫描的包路径 这样才会打印sqllog4j.logger.com.hikktn.mapper=DEBUG
三、数据准备
SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT,`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'user', 'user');INSERT INTO `user` VALUES (2, 'admin', 'admin');INSERT INTO `user` VALUES (3, 'hikktn', 'hikktn0320');SET FOREIGN_KEY_CHECKS = 1;
四、pojo准备
package com.hikktn.domain;import java.io.Serializable;public class User implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String password;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}
五、mapper接口准备
@Mapper@Repositorypublic interface UserMapper {/*** xml方式,查询** @return*/public List<User> queryUserList();/*** xml方式,增加** @param user* @return*/public int insertUserXml(User user);/*** xml方式,修改** @param user* @return*/public int updateUserById(User user);/*** xml方式,删除** @param id* @return*/public int deleteUserById(int id);}
六、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.hikktn.mapper.UserMapper"><select id="queryUserList" resultType="User">select * from user</select><insert id="insertUserXml" parameterType="com.hikktn.domain.User" useGeneratedKeys="true" keyProperty="id">insert into user (username,password) values(#{username,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR})</insert><update id="updateUserById" parameterType="com.hikktn.domain.User">update user<set><if test="username != null">username = #{username,jdbcType=VARCHAR},</if><if test="password != null">password = #{password,jdbcType=VARCHAR}</if></set>where id = #{id,jdbcType=INTEGER}</update><delete id="deleteUserById" parameterType="java.lang.Integer">delete from user where id = #{id,jdbcType=INTEGER}</delete></mapper>
七、测试用例准备
@RunWith(SpringRunner.class)@SpringBootTest(classes = SpringbootMybatisApplication.class)public class MybatisTest {@Autowiredprivate UserMapper userMapper;/*** xml方式,查询全部*/@Testpublic void testQueryUserList() {List<User> users = userMapper.queryUserList();System.out.println(users);}/*** xml方式,增加一条数据*/@Testpublic void testInsertUserXml() {User user = new User();user.setUsername("hikktn");user.setPassword("hikktn");int result = userMapper.insertUserXml(user);System.out.println("插入成功,返回结果:" + result);}/*** xml方式,修改一条数据*/@Testpublic void testUpdateUserById() {Map<String, Object> map = new HashMap<>();map.put("id", "3");User user = userMapper.selectUserWithId(map);user.setUsername("hikktn");user.setPassword("654132");int result = userMapper.updateUserById(user);System.out.println("修改成功,返回结果:" + result);}/*** xml方式,删除*/@Testpublic void testDeleteUserById() {int result = userMapper.deleteUserById(3);System.out.println("删除成功,返回结果:" + result);}}
八、测试结果
查询结果
2021-08-13 15:38:54.057 DEBUG 18028 --- [ main] c.h.mapper.UserMapper.queryUserList : ==> Preparing: select * from user2021-08-13 15:38:54.075 DEBUG 18028 --- [ main] c.h.mapper.UserMapper.queryUserList : ==> Parameters:2021-08-13 15:38:54.088 DEBUG 18028 --- [ main] c.h.mapper.UserMapper.queryUserList : <== Total: 3[User{id=1, username='user', password='user'}, User{id=2, username='admin', password='admin'}, User{id=8, username='Tom', password='tom'}]
增加结果
2021-08-13 15:41:06.496 DEBUG 10856 --- [ main] c.h.mapper.UserMapper.insertUserXml : ==> Preparing: insert into user (username,password) values(?,?)2021-08-13 15:41:06.517 DEBUG 10856 --- [ main] c.h.mapper.UserMapper.insertUserXml : ==> Parameters: hikktn(String), hikktn(String)2021-08-13 15:41:06.524 DEBUG 10856 --- [ main] c.h.mapper.UserMapper.insertUserXml : <== Updates: 1插入成功,返回结果:1
修改结果
2021-08-13 15:42:23.129 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.selectUserWithId : ==> Preparing: SELECT * FROM user WHERE ( id = ? )2021-08-13 15:42:23.160 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.selectUserWithId : ==> Parameters: 10(String)2021-08-13 15:42:23.177 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.selectUserWithId : <== Total: 12021-08-13 15:42:23.238 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.updateUserById : ==> Preparing: update user SET username = ?, password = ? where id = ?2021-08-13 15:42:23.238 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.updateUserById : ==> Parameters: hikktn(String), 654132(String), 10(Long)2021-08-13 15:42:23.241 DEBUG 16688 --- [ main] c.h.mapper.UserMapper.updateUserById : <== Updates: 1修改成功,返回结果:1
删除结果
2021-08-13 15:42:58.416 DEBUG 12048 --- [ main] c.h.mapper.UserMapper.deleteUserById : ==> Preparing: delete from user where id = ?2021-08-13 15:42:58.438 DEBUG 12048 --- [ main] c.h.mapper.UserMapper.deleteUserById : ==> Parameters: 10(Integer)2021-08-13 15:42:58.445 DEBUG 12048 --- [ main] c.h.mapper.UserMapper.deleteUserById : <== Updates: 1删除成功,返回结果:1
