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
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();
- }
-
- }
