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

2023-09-18 03:20:31

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

}

更多推荐

python魔术方法_对象_继承_复写_变量注解_函数注解_多态(04)

文章目录python魔术方法_对象_继承_复写_变量注解_函数注解_多态(04)1对象的魔术方法1.1魔术方法实例:2对象的封装2.1私有变量:开头__(2个下划线)定义2.2案例私有变量访问:3继承3.1类继承语法:3.2类继承案例3.3多继承3.3.1多继承语法3.3.2多继承属性(pass使用)4复写4.1对父类

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外,还可以用于水文分析,这里给大家介绍一下如何使用ArcGISPro通过水文分析提取河网水系,希望能对你有所帮助。数据来源本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见的GIS数据都可以从水经微图中下载,你可以通过关注公号“水经注GIS”,然后在后台回复

1.8python基础语法——数据类型转换

1)转换数据类型的作用用户输入的数据是字符串类型,可以用类型转换将字符串类型转换为相应的数据类型。2)转换数据类型的函数函数说明int(x[,base])将x转换为一个整数float(x)将x转换为一个浮点数complex(real[,imag])创建一个复数,real为实部,imag为虚部str(x)将对象x转换为字

软件设计原则扩展

一、引言经典的软件设计7大原则开闭原则(OpenClosePrinciple,OCP)依赖倒置原则(DependenceInversionPrinciple,DIP)单一职责原则(SimpleResponsibilityPrinciple,SRP)接口隔离原则(InterfaceSegregationPrinciple

从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)

不可变集合、方法引用1.不可变集合1.1什么是不可变集合1.2使用场景1.3不可变集合分类1.4不可变的list集合1.5不可变的Set集合1.6不可变的Map集合1.6.1:键值对个数小于等于101.6.2:键值对个数大于102.方法引用2.1体验方法引用2.2方法引用符2.3引用类方法2.4引用对象的实例方法2.5

【数据结构】TOP-K问题/使用堆解决

💐🌸🌷🍀🌹🌻🌺🍁🍃🍂🌿🍄🍝🍛🍤📃个人主页:阿然成长日记👈点击可跳转📆个人专栏:🔹数据结构与算法🔹C语言进阶🚩不能则学,不知则问,耻于问人,决无长进🍭🍯🍎🍏🍊🍋🍒🍇🍉🍓🍑🍈🍌🍐🍍文章目录TOP-K问题一、题目描述二、思路:三、代码实现1.随机产生一万

【每日一题】852. 山脉数组的峰顶索引

852.山脉数组的峰顶索引-力扣(LeetCode)符合下列属性的数组arr称为山脉数组:arr.length>=3存在i(0<i<arr.length-1)使得:arr[0]<arr[1]<...arr[i-1]<arr[i]arr[i]>arr[i+1]>...>arr[arr.length-1]给你由整数组成的山

数据结构——二叉树提升

二叉树题型练习前言一、节点个数以及高度等二、二叉树OJ题二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历单值二叉树二叉树最大深度检查两颗树是否相同.翻转二叉树对称二叉树另一颗树的子树总结前言现在我们开始一轮新的自我提升吧!二叉树的题目当然也更有难度!没有什么是生来就会的,尤其是代码这一方面更是讲究熟能生巧,现在的我们学

全能电子地图下载器3.0-下载离线地图瓦片

前言vue项目要部署到局域网内,不使用在线地图,而是离线地图,寻求了很多的解决方案,最终决定使用离线地图瓦片+leaflet.js实现效果!正文首先需要下载正版的软件,目前我实用的是V3.0版本的,可能和之前的有部分差异化,这个也属于正常。一、下载1.有CSDN会员下载渠道:https://download.csdn.

Vue入门--vue的生命周期

一.什么是Vue二.Vue的简介官方网址特点三.前后端的分离重大问题优势4.Vue入门定义一个管理边界​编辑测试结果vue的优势​编辑测试结果5.Vue的生命周期vue的生命周期图​编辑建立一个html测试结果一.什么是VueVue是一种流行的JavaScript前端框架,用于构建用户界面。它被设计为一种渐进式框架,可

CTF —— 网络安全大赛(这不比王者好玩吗?)

前言随着大数据、人工智能的发展,人们步入了新的时代,逐渐走上科技的巅峰。\⚔科技是一把双刃剑,网络安全不容忽视,人们的隐私在大数据面前暴露无遗,账户被盗、资金损失、网络诈骗、隐私泄露,种种迹象表明,随着互联网的发展,网络安全需要引起人们的重视。\互联网安全从其本质上来讲就是互联网上的信息安全。从广义来说,凡是涉及到互联

热文推荐