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.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 123
mvc:
view:
suffix: .jsp
prefix: /
resources:
static-locations: classpath:templates
mybatis:
type-aliases-package: com.hikktn.domain
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射
lazy-loading-enabled: true #开启延时加载开关
aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是false
lazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载
cache-enabled: true #打开全局缓存开关(二级环境),默认值就是true
logging:
level:
com.hikktn: debug
server:
port: 8080
servlet:
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-8
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.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=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG
#配置logger扫描的包路径 这样才会打印sql
log4j.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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
五、mapper接口准备
@Mapper
@Repository
public 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 {
@Autowired
private UserMapper userMapper;
/**
* xml方式,查询全部
*/
@Test
public void testQueryUserList() {
List<User> users = userMapper.queryUserList();
System.out.println(users);
}
/**
* xml方式,增加一条数据
*/
@Test
public void testInsertUserXml() {
User user = new User();
user.setUsername("hikktn");
user.setPassword("hikktn");
int result = userMapper.insertUserXml(user);
System.out.println("插入成功,返回结果:" + result);
}
/**
* xml方式,修改一条数据
*/
@Test
public 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方式,删除
*/
@Test
public 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 user
2021-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: 1
2021-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