• Mybatis 插入、修改、删除


    前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。

    如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅读本篇,可以参考:

    Mybatis查询数据icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132469672Mybatis 日志(JDK Log)icon-default.png?t=N7T8https://blog.csdn.net/m1729339749/article/details/132565362

    一、数据准备

    这里我们直接使用脚本初始化数据库中的数据

    1. -- 如果数据库不存在则创建数据库
    2. CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
    3. -- 切换数据库
    4. USE demo;
    5. -- 创建用户表
    6. CREATE TABLE IF NOT EXISTS T_USER(
    7. ID INT PRIMARY KEY,
    8. USERNAME VARCHAR(32) NOT NULL,
    9. AGE INT NOT NULL
    10. );
    11. -- 插入用户数据
    12. INSERT INTO T_USER(ID, USERNAME, AGE)
    13. VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);

    创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据

    二、环境搭建

    1、创建实体类

    在cn.horse.demo下创建UserInfo类

    UserInfo类:

    1. package cn.horse.demo;
    2. public class UserInfo {
    3. private Integer id;
    4. private String name;
    5. private Integer age;
    6. public void setId(Integer id) {
    7. this.id = id;
    8. }
    9. public void setName(String name) {
    10. this.name = name;
    11. }
    12. public void setAge(Integer age) {
    13. this.age = age;
    14. }
    15. @Override
    16. public String toString() {
    17. StringBuilder stringBuilder = new StringBuilder();
    18. stringBuilder.append('{');
    19. stringBuilder.append("id: " + this.id);
    20. stringBuilder.append(", ");
    21. stringBuilder.append("name: " + this.name);
    22. stringBuilder.append(", ");
    23. stringBuilder.append("age: " + this.age);
    24. stringBuilder.append('}');
    25. return stringBuilder.toString();
    26. }
    27. }

    2、Mapper配置文件

    在resources的目录下新建UserInfoMapper.xml配置文件

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="cn.horse.demo.UserInfoMapper">
    6. <select id="findById" resultType="cn.horse.demo.UserInfo">
    7. SELECT
    8. ID,
    9. USERNAME name,
    10. AGE
    11. FROM T_USER
    12. WHERE ID = #{id}
    13. select>
    14. mapper>

    3、引入配置文件

    在resources下新建mybatis-config.xml配置文件,并引入UserInfoMapper.xml配置文件

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <setting name="logImpl" value="JDK_LOGGING"/>
    8. settings>
    9. <environments default="development">
    10. <environment id="development">
    11. <transactionManager type="JDBC"/>
    12. <dataSource type="POOLED">
    13. <property name="driver" value="org.gjt.mm.mysql.Driver"/>
    14. <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8"/>
    15. <property name="username" value="root"/>
    16. <property name="password" value="horse"/>
    17. dataSource>
    18. environment>
    19. environments>
    20. <mappers>
    21. <mapper resource="demo/UserInfoMapper.xml" />
    22. mappers>
    23. configuration>

    4、会话工具类

    在cn.horse.demo包下新建SqlSessionUtils工具类

    1. package cn.horse.demo;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    5. import java.io.InputStream;
    6. import java.util.Objects;
    7. public class SqlSessionUtils {
    8. private static final SqlSessionFactory sqlSessionFactory;
    9. static {
    10. // 读取mybatis配置文件
    11. InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
    12. // 根据配置创建SqlSession工厂
    13. sqlSessionFactory = new SqlSessionFactoryBuilder()
    14. .build(inputStream);
    15. }
    16. /**
    17. * 开启会话
    18. * @return
    19. */
    20. public static SqlSession openSession() {
    21. return sqlSessionFactory.openSession();
    22. }
    23. /**
    24. * 关闭会话
    25. * @param sqlSession
    26. */
    27. public static void closeSession(SqlSession sqlSession) {
    28. if(Objects.nonNull(sqlSession)) {
    29. sqlSession.close();
    30. }
    31. }
    32. }

    5、JDK 日志系统配置

    在resources的目录下新建logging.properties配置文件

    1. handlers=java.util.logging.ConsoleHandler
    2. .level=INFO
    3. cn.horse.demo.UserInfoMapper.level=FINER
    4. java.util.logging.ConsoleHandler.level=ALL
    5. java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
    6. 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类:

    1. package cn.horse.demo;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.util.logging.LogManager;
    5. public class JdkLogConfig {
    6. public JdkLogConfig() {
    7. try {
    8. InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
    9. LogManager.getLogManager().readConfiguration(inputStream);
    10. } catch (IOException e) {
    11. throw new RuntimeException(e);
    12. }
    13. }
    14. }

    6、启动程序

    1. package cn.horse.demo;
    2. import org.apache.ibatis.session.SqlSession;
    3. import java.util.List;
    4. public class Main {
    5. public static void main(String[] args) {
    6. // 配置日志文件
    7. System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
    8. findById(2);
    9. }
    10. private static void findById(Integer id) {
    11. SqlSession sqlSession = null;
    12. try {
    13. sqlSession = SqlSessionUtils.openSession();
    14. UserInfo userInfo = sqlSession.selectOne("cn.horse.demo.UserInfoMapper.findById", id);
    15. System.out.println(userInfo);
    16. } finally {
    17. SqlSessionUtils.closeSession(sqlSession);
    18. }
    19. }
    20. }

    测试:

    查询id为2的用户信息

    执行后的结果如下:

    三、插入数据

    在UserInfoMapper.xml配置文件中新增insert标签,并写入insert语句:

    1. <insert id="insert">
    2. INSERT INTO T_USER(ID,
    3. USERNAME,
    4. AGE)
    5. VALUES(#{id}, #{name}, #{age})
    6. insert>

    insert标签:id代表的是标签的编号,标签的内容是insert语句,insert语句中可以使用参数,用法与查询时一致。

    测试:

    在启动程序中新建insert方法:

    1. private static void insert(UserInfo userInfo) {
    2. SqlSession sqlSession = null;
    3. try {
    4. sqlSession = SqlSessionUtils.openSession();
    5. sqlSession.insert("cn.horse.demo.UserInfoMapper.insert", userInfo);
    6. sqlSession.commit();
    7. } finally {
    8. SqlSessionUtils.closeSession(sqlSession);
    9. }
    10. }

    这里插入数据,我们调用了SqlSession对象的insert方法,另外还需要调用SqlSession对象的commit方法用于提交事务。

    在main方法中调用insert方法插入一条数据,并查询

    1. // 引入JDK日志配置
    2. System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
    3. UserInfo userInfo = new UserInfo();
    4. userInfo.setId(5);
    5. userInfo.setName("王五");
    6. userInfo.setAge(5);
    7. // 插入
    8. insert(userInfo);
    9. findById(5);

    执行后的结果如下:

    从执行的日志中可以看到insert语句,以及传入的参数,执行的结果(受影响的行数)

    插入结束后,我们使用id进行查询,发现查询出来了新添加的数据

    四、修改数据

    在UserInfoMapper.xml配置文件中新增update标签,并写入update语句:

    1. <update id="update">
    2. UPDATE T_USER
    3. SET USERNAME = #{name},
    4. AGE = #{age}
    5. WHERE ID = #{id}
    6. update>

    update标签:id代表的是标签的编号,标签的内容是update语句,update语句中可以使用参数,用法与查询时一致。

    测试:

    在启动程序中新建update方法:

    1. private static void update(UserInfo userInfo) {
    2. SqlSession sqlSession = null;
    3. try {
    4. sqlSession = SqlSessionUtils.openSession();
    5. sqlSession.update("cn.horse.demo.UserInfoMapper.update", userInfo);
    6. sqlSession.commit();
    7. } finally {
    8. SqlSessionUtils.closeSession(sqlSession);
    9. }
    10. }

    这里更新数据,我们调用了SqlSession对象的update方法,另外还需要调用SqlSession对象的commit方法用于提交事务。

    在main方法中调用update方法更新数据,并查询

    1. // 引入JDK日志配置
    2. System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
    3. UserInfo userInfo = new UserInfo();
    4. userInfo.setId(5);
    5. userInfo.setName("王五2");
    6. userInfo.setAge(50);
    7. // 更新
    8. update(userInfo);
    9. findById(5);

    执行后的结果如下:

    从执行的日志中可以看到update语句,以及传入的参数,执行的结果(受影响的行数)

    更新结束后,我们使用id进行查询,发现查询出来了修改后的数据

    五、删除数据

    在UserInfoMapper.xml配置文件中新增delete标签,并写入delete语句:

    1. <delete id="delete">
    2. DELETE FROM T_USER
    3. WHERE ID = #{id}
    4. delete>

    delete标签:id代表的是标签的编号,标签的内容是delete语句,delete语句中可以使用参数,用法与查询时一致。

    测试:

    在启动程序中新建delete方法:

    1. private static void delete(Integer id) {
    2. SqlSession sqlSession = null;
    3. try {
    4. sqlSession = SqlSessionUtils.openSession();
    5. sqlSession.delete("cn.horse.demo.UserInfoMapper.delete", id);
    6. sqlSession.commit();
    7. } finally {
    8. SqlSessionUtils.closeSession(sqlSession);
    9. }
    10. }

    这里删除数据,我们调用了SqlSession对象的delete方法,另外还需要调用SqlSession对象的commit方法用于提交事务。

    在main方法中调用delete方法删除数据,并查询

    1. // 引入JDK日志配置
    2. System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");
    3. // 删除
    4. delete(5);
    5. findById(5);

    执行后的结果如下:

    从执行的日志中可以看到delete语句,以及传入的参数,执行的结果(受影响的行数)

    删除结束后,我们使用id进行查询,发现已经查询不到数据了

  • 相关阅读:
    电力电子转战数字IC20220818day63——uvm入门实验5
    半回文数【Python】
    不标准的 json 格式的字符串如何转为标准的(json字符串属性名不带双引号如何转
    Element
    nodejs将rtsp视频流打上水印后通过websocket发送给前端
    GBase 8s多个用户操作同一条记录时的并发写机制
    代码随想录算法训练营 day56|583. 两个字符串的删除操作、72. 编辑距离
    错误码:spark_error_00000004
    网络安全与TikTok:年轻一代的数字素养
    数据结构二叉树前序遍历递归和非递归算法
  • 原文地址:https://blog.csdn.net/m1729339749/article/details/132601345