02.Mybatis-CRUD-非业务写法

108 阅读3分钟

02.Mybatis-CRUD-非业务写法

此mybatis是非业务写法,企业开发中不建议这样写,此篇文章仅仅是献给想了解mybatis的的同学,以达到快速上手的目的。后面我将逐一介绍企业中是如何用mybatis的,大家不要着急。

此文章是连载文文章,文章之间有关联性,欢迎订阅我的专栏Mybatis

1. 整合junit单元测试

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

2. 整合日志

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.14.0</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>2.0.0-alpha0</version>
</dependency>

下面这个文件spring自动识别,注意需要放在resouces根目录下

log4j.properties

log4j.rootLogger=debug,stdout
log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=logs/notify-subscription.log
log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n method:%l%n%m%n

整合完后,我们可以看到日志中,有SQL输出语句

image.png

我将代码放在这里www.123pan.com/s/8AB0Vv-Sg… ,供大家查看,这里注意,Main测试类中,编写了一个单例模式。

3. 编写UserMapper.xml

<insert id="addUser" parameterType="com.lzh.mybatis01.model.User">
    insert user (username,address) values(#{username},#{address})
</insert>

添加insert,往数据表中插入数据。

这里的parameterType属性指的是插入到数据表的类型参数。

4. 新建测试类

package com.lzh.mybatis01;

import com.lzh.mybatis01.model.User;
import com.lzh.mybatis01.utils.SqlSessionFactoryUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

/**
 * @Author:kaiyang.cui
 * @Package:com.lzh.mybatis01
 * @Project:mybatis01
 * @name:MyTest
 * @Date:2023/3/31 下午6:48
 * @Filename:MyTest
 * @Description:MyTest
 * @Version:1.0
 */
@Slf4j
public class MyTest {

    private SqlSession sqlSession;

    @Before
    public void before() throws IOException {
        sqlSession = SqlSessionFactoryUtils.getInstance().openSession();
    }

    @Test
    public void addUser(){
        User user = new User();
        user.setUsername("kaiyang");
        user.setAddress("江苏省南京市");
        int rows = sqlSession.insert("com.lzh.mybatis01.mapper.UserMapper.addUser", user);

        log.info("插入完成" + ",受影响的行数为" + rows);
        sqlSession.commit();
    }

    @After
    public void after() {
        sqlSession.close();
    }
}

执行单元测试,可以发现,我们的数据表中多了一条插入记录:

image.png

本小节码:www.123pan.com/s/8AB0Vv-lg…

增-将主键设置为uuid 【方式1】

1. 修改User实体类

private String id;

2. 修改数据库

  • 改id字段类型为 varchar 127
  • 去掉自增

image.png

3. 新增单元测试类代码

@Test
public void addUserUUID(){
    String userUUID = UUID.randomUUID().toString();
    User user = new User();
    user.setId(userUUID);
    user.setUsername("kaiyang");
    user.setAddress("江苏省南京市");
    int rows = sqlSession.insert("com.lzh.mybatis01.mapper.UserMapper.addUser", user);

    log.info("插入完成" + ",受影响的行数为" + rows);
    sqlSession.commit();
}

4. 修改UserMapper.xml 为

<insert id="addUser" parameterType="com.lzh.mybatis01.model.User">
    insert user (id,username,address) values(#{id},#{username},#{address})
</insert>

5. 运行单元测试

插入uuid完成,受影响的行数为1

image.png

可以看到,我们将uuid作为用户主键类。这样我们的程序就完成了。

增-将主键设置为uuid 【方式2】

1. 新增单元测试

@Test
public void addUserUUID2(){
    User user = new User();
    user.setUsername("我是一名程序媛");
    user.setAddress("上海市");
    int rows = sqlSession.insert("com.lzh.mybatis01.mapper.UserMapper.addUser", user);
    log.info("插入uuid完成" + ",受影响的行数为" + rows);
    sqlSession.commit();
}

2. 修改UserMapper.xml

<insert id="addUser" parameterType="com.lzh.mybatis01.model.User">
    <selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">
        select uuid();
    </selectKey>
    insert user (id,username,address) values(#{id},#{username},#{address})
</insert>

运行单元测试addUserUUID2,查看数据表结果

image.png

本小节源码:www.123pan.com/s/8AB0Vv-7g…

在删之前呢,我们先把数据库改回id自增,int 11

image.png

修改实体类User

private Long id;

1. 在UserMapper.xml新增如下

<delete id="deleteUser" parameterType="java.lang.Long">
    delete from user where id = #{id}
</delete>

2. 新增如下单元测试

@Test
public void deleteUser(){
    int rows = sqlSession.delete("com.lzh.mybatis01.mapper.UserMapper.deleteUser", 4L);
    sqlSession.commit();
    log.info("删除数据表中id=4的用户记录完成" + ",受影响的行数为" + rows);
}

传入是4L 并不是4。因为在UserMapper.xml中,我们规定传入的参数是java.long.Long类型的。

删除前数据表 image.png

1.在UserMapper.xml 中新增如下

<update id="updateUser" parameterType="com.lzh.mybatis01.model.User">
    update user set username =  #{username} where id = #{id}
</update>

2. 新增单元测试

@Test
public void updateUser(){
    User user = new User();
    user.setId(8L);
    user.setUsername("lll");
    int rows = sqlSession.update("com.lzh.mybatis01.mapper.UserMapper.deleteUser", user);
    sqlSession.commit();

}

3. 运行单元测试及结果

image.png

本小节源码:www.123pan.com/s/8AB0Vv-bg…

1. 在UserMapper.xml 中新增如下

<select id="getUserById" resultType="com.lzh.mybatis01.model.User">
    select id,username,address from user where id = #{id}
</select>

2. 新增单元测试

@Test
public void getUserById(){
    User user = (User) sqlSession.selectOne("com.lzh.mybatis01.mapper.UserMapper.getUserById", 8L);
    // 查询涉及到修改数据库,所以可以去掉下面这一行commit
    sqlSession.commit();
    log.info(user.toString());
}

3. 运行单元测试及结果

User(id=8, username=lll, address=江苏省南京市)

本小节源码和本文源码:www.123pan.com/s/8AB0Vv-Zg…

好了,mybatis CRUD已经介绍完了。 本文是mybatis连载文章,欢迎我的订阅mybatis专栏。