Mybatis学习笔记5 面向接口CRUD练习

Mybatis学习笔记4 用javassist动态实现DAO接口基于接口的CRUD_biubiubiu0706的博客-CSDN博客

新建项目

大致目录结构

核心配置文件

日志配置文件,只需要引入logback依赖 配置文件名为logback.xml即可

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义⽇志⽂件的存储地址-->
    <property name="LOG_HOME" value="D:/home"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
           个字符宽度%msg:⽇志消息,%n是换⾏符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天⽣成⽇志⽂件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--⽇志⽂件输出的⽂件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--⽇志⽂件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
           个字符宽度%msg:⽇志消息,%n是换⾏符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logge
                r{50} - %msg%n</pattern>
        </encoder>
        <!--⽇志⽂件最⼤的⼤⼩-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!--mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

映射文件

复制代码
<?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.example.mapper.XXXMapper">
    <insert id="insert">
        insert into t_car value(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>
    <delete id="deleteById">
        delete from t_car where id=#{id}
    </delete>
    <update id="update">
        update t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} where id=#{id}
    </update>
    <select id="selectById" resultType="car">
        /*
        这里可以使用* 原因是配置里配置了自动转驼峰,
        也可以通过resultMp方式或者sql里写别名的方式

          */
        select * from t_car where id=#{id}
    </select>
    <select id="selectAll" resultType="car">/*因配置了实体类包 因此这里可以写类名大写或者小写都行*/
        select * from t_car
    </select>
</mapper>

pojo实体类

XXXMapper

复制代码
package com.example.mapper;

import com.example.pojo.Car;

import java.util.List;

/**
 * @author hrui
 * @date 2023/9/18 2:17
 */
public interface XXXMapper {

    int insert(Car car);

    int deleteById(Long id);

    int update(Car car);

    Car selectById(Long id);

    List<Car> selectAll();


}

单元测试

关于selectOne selectList等等方法在sqlSession.getMapper(xxx)这个底层用javassist动态生成的实现类中封装了 也是因为这个实现类的原因:要求在映射文件中--->namespace必须是dao接口的全限定名称。id必须是dao接口中方法名

复制代码
import com.example.mapper.XXXMapper;
import com.example.pojo.Car;
import com.example.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;
import java.util.zip.CheckedOutputStream;

/**
 * @author hrui
 * @date 2023/9/18 2:42
 */
public class Test {

    @org.junit.Test
    public void testInsert(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        XXXMapper mapper=sqlSession.getMapper(XXXMapper.class);
        int count = mapper.insert(new Car(null, "2001", "奇美拉", 20.0, "2020-01-01", "新能源"));
        System.out.println(count);
        sqlSession.commit();

    }
    @org.junit.Test
    public void testDeleteById(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        XXXMapper mapper=sqlSession.getMapper(XXXMapper.class);
        int count = mapper.deleteById(3L);
        System.out.println(count);
        sqlSession.commit();
    }
    @org.junit.Test
    public void testUpdate(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        XXXMapper mapper=sqlSession.getMapper(XXXMapper.class);
        Car car = new Car(4L, "2002", "奇美拉2", 202.0, "2020-01-01", "新能源");
        int count = mapper.update(car);
        System.out.println(count);
        sqlSession.commit();

    }@org.junit.Test
    public void testSelectById(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        XXXMapper mapper=sqlSession.getMapper(XXXMapper.class);
        Car car = mapper.selectById(4L);
        System.out.println(car);
        sqlSession.commit();
    }
    @org.junit.Test
    public void testSelectAll(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        XXXMapper mapper=sqlSession.getMapper(XXXMapper.class);
        List<Car> cars = mapper.selectAll();
        System.out.println(cars);
        sqlSession.commit();
    }

}
相关推荐
专注于大数据技术栈3 分钟前
java学习--StringBuilder
java·学习
锦瑟弦音5 分钟前
微信小游戏分包(cocos自带分包)
笔记·游戏
找方案1 小时前
我的 all-in-rag 学习笔记:文本分块 ——RAG 系统的 “信息切菜术“
人工智能·笔记·all-in-rag
HXR_plume1 小时前
【Web信息处理与应用课程笔记1】网页排序(上)
笔记
qcwl661 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
车载测试工程师1 小时前
CAPL学习-CAN相关函数-概述
网络协议·学习·capl·canoe
roman_日积跬步-终至千里1 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习
m0_689618281 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
charlie1145141912 小时前
现代嵌入式C++教程:C++98——从C向C++的演化(2)
c语言·开发语言·c++·学习·嵌入式·教程·现代c++
Rousson2 小时前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习