前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。
如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅读本篇,可以参考:
Mybatis查询数据https://blog.csdn.net/m1729339749/article/details/132469672Mybatis 日志(JDK Log)https://blog.csdn.net/m1729339749/article/details/132565362
这里我们直接使用脚本初始化数据库中的数据
- -- 如果数据库不存在则创建数据库
- CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
- -- 切换数据库
- USE demo;
- -- 创建用户表
- CREATE TABLE IF NOT EXISTS T_USER(
- ID INT PRIMARY KEY,
- USERNAME VARCHAR(32) NOT NULL,
- AGE INT NOT NULL
- );
- -- 插入用户数据
- INSERT INTO T_USER(ID, USERNAME, AGE)
- VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);
创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据
在cn.horse.demo下创建UserInfo类
UserInfo类:
- package cn.horse.demo;
-
- public class UserInfo {
-
- private Integer id;
- private String name;
- private Integer age;
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- @Override
- public String toString() {
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append('{');
- stringBuilder.append("id: " + this.id);
- stringBuilder.append(", ");
- stringBuilder.append("name: " + this.name);
- stringBuilder.append(", ");
- stringBuilder.append("age: " + this.age);
- stringBuilder.append('}');
- return stringBuilder.toString();
- }
- }
在resources的目录下新建UserInfoMapper.xml配置文件
- "1.0" encoding="UTF-8" ?>
- mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.horse.demo.UserInfoMapper">
-
- <select id="findById" resultType="cn.horse.demo.UserInfo">
- SELECT
- ID,
- USERNAME name,
- AGE
- FROM T_USER
- WHERE ID = #{id}
- select>
- mapper>
在resources下新建mybatis-config.xml配置文件,并引入UserInfoMapper.xml配置文件
- "1.0" encoding="UTF-8" ?>
- configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="JDK_LOGGING"/>
- settings>
-
- <environments default="development">
- <environment id="development">
- <transactionManager type="JDBC"/>
- <dataSource type="POOLED">
- <property name="driver" value="org.gjt.mm.mysql.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8"/>
- <property name="username" value="root"/>
- <property name="password" value="horse"/>
- dataSource>
- environment>
- environments>
-
- <mappers>
- <mapper resource="demo/UserInfoMapper.xml" />
- mappers>
- configuration>
在cn.horse.demo包下新建SqlSessionUtils工具类
- package cn.horse.demo;
-
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
-
- import java.io.InputStream;
- import java.util.Objects;
-
- public class SqlSessionUtils {
-
- private static final SqlSessionFactory sqlSessionFactory;
- static {
- // 读取mybatis配置文件
- InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
- // 根据配置创建SqlSession工厂
- sqlSessionFactory = new SqlSessionFactoryBuilder()
- .build(inputStream);
- }
-
- /**
- * 开启会话
- * @return
- */
- public static SqlSession openSession() {
- return sqlSessionFactory.openSession();
- }
-
- /**
- * 关闭会话
- * @param sqlSession
- */
- public static void closeSession(SqlSession sqlSession) {
- if(Objects.nonNull(sqlSession)) {
- sqlSession.close();
- }
- }
- }
在resources的目录下新建logging.properties配置文件
- handlers=java.util.logging.ConsoleHandler
- .level=INFO
-
- cn.horse.demo.UserInfoMapper.level=FINER
- java.util.logging.ConsoleHandler.level=ALL
- java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
- java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n
在cn.horse.demo下创建JdkLogConfig类
JdkLogConfig类:
- package cn.horse.demo;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.logging.LogManager;
-
- public class JdkLogConfig {
-
- public JdkLogConfig() {
- try {
- InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
- LogManager.getLogManager().readConfiguration(inputStream);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
- package cn.horse.demo;
-
- import org.apache.ibatis.session.SqlSession;
-
- import java.util.List;
-
- public class Main {
- public static void main(String[] args) {
- // 配置日志文件
- System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
-
- findById(2);
- }
-
- private static void findById(Integer id) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlSessionUtils.openSession();
- UserInfo userInfo = sqlSession.selectOne("cn.horse.demo.UserInfoMapper.findById", id);
- System.out.println(userInfo);
- } finally {
- SqlSessionUtils.closeSession(sqlSession);
- }
- }
- }
测试:
查询id为2的用户信息
执行后的结果如下:
在UserInfoMapper.xml配置文件中新增insert标签,并写入insert语句:
- <insert id="insert">
- INSERT INTO T_USER(ID,
- USERNAME,
- AGE)
- VALUES(#{id}, #{name}, #{age})
- insert>
insert标签:id代表的是标签的编号,标签的内容是insert语句,insert语句中可以使用参数,用法与查询时一致。
测试:
在启动程序中新建insert方法:
- private static void insert(UserInfo userInfo) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlSessionUtils.openSession();
- sqlSession.insert("cn.horse.demo.UserInfoMapper.insert", userInfo);
- sqlSession.commit();
- } finally {
- SqlSessionUtils.closeSession(sqlSession);
- }
- }
这里插入数据,我们调用了SqlSession对象的insert方法,另外还需要调用SqlSession对象的commit方法用于提交事务。
在main方法中调用insert方法插入一条数据,并查询
- // 引入JDK日志配置
- System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
-
- UserInfo userInfo = new UserInfo();
- userInfo.setId(5);
- userInfo.setName("王五");
- userInfo.setAge(5);
- // 插入
- insert(userInfo);
- findById(5);
执行后的结果如下:
从执行的日志中可以看到insert语句,以及传入的参数,执行的结果(受影响的行数)
插入结束后,我们使用id进行查询,发现查询出来了新添加的数据
在UserInfoMapper.xml配置文件中新增update标签,并写入update语句:
- <update id="update">
- UPDATE T_USER
- SET USERNAME = #{name},
- AGE = #{age}
- WHERE ID = #{id}
- update>
update标签:id代表的是标签的编号,标签的内容是update语句,update语句中可以使用参数,用法与查询时一致。
测试:
在启动程序中新建update方法:
- private static void update(UserInfo userInfo) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlSessionUtils.openSession();
- sqlSession.update("cn.horse.demo.UserInfoMapper.update", userInfo);
- sqlSession.commit();
- } finally {
- SqlSessionUtils.closeSession(sqlSession);
- }
- }
这里更新数据,我们调用了SqlSession对象的update方法,另外还需要调用SqlSession对象的commit方法用于提交事务。
在main方法中调用update方法更新数据,并查询
- // 引入JDK日志配置
- System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
-
- UserInfo userInfo = new UserInfo();
- userInfo.setId(5);
- userInfo.setName("王五2");
- userInfo.setAge(50);
- // 更新
- update(userInfo);
- findById(5);
执行后的结果如下:
从执行的日志中可以看到update语句,以及传入的参数,执行的结果(受影响的行数)
更新结束后,我们使用id进行查询,发现查询出来了修改后的数据
在UserInfoMapper.xml配置文件中新增delete标签,并写入delete语句:
- <delete id="delete">
- DELETE FROM T_USER
- WHERE ID = #{id}
- delete>
delete标签:id代表的是标签的编号,标签的内容是delete语句,delete语句中可以使用参数,用法与查询时一致。
测试:
在启动程序中新建delete方法:
- private static void delete(Integer id) {
- SqlSession sqlSession = null;
- try {
- sqlSession = SqlSessionUtils.openSession();
- sqlSession.delete("cn.horse.demo.UserInfoMapper.delete", id);
- sqlSession.commit();
- } finally {
- SqlSessionUtils.closeSession(sqlSession);
- }
- }
这里删除数据,我们调用了SqlSession对象的delete方法,另外还需要调用SqlSession对象的commit方法用于提交事务。
在main方法中调用delete方法删除数据,并查询
- // 引入JDK日志配置
- System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
-
- // 删除
- delete(5);
- findById(5);
执行后的结果如下:
从执行的日志中可以看到delete语句,以及传入的参数,执行的结果(受影响的行数)
删除结束后,我们使用id进行查询,发现已经查询不到数据了