MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置
MyBatis之环境搭建以及实现增删改查
- 前言
- 实现步骤
- 1. 编写MyBatis-config.xml配置文件
- 2. 编写Mapper.xml文件(增删改查SQL文)
- 3. 定义PeronMapper接口
- 4. 编写测试类
- 1. 执行步骤
- 2. 代码实例
- 3. 运行log
- 开发环境构造图
- 总结
前言
上一篇文章,我们使用MyBatis传统的方式(namespace+id,非接口式编程),完成了数据库的增删改查操作,今天我们学习动态代理的方式(面向接口编程),简单的说,就是将Mapper.xml(定义数据库增删改查SQL文的文件)中定义的SQLID以方法的形式定义在Interface中,调用其方法,完成数据的增删改查,这种方法,也是大部分项目中使用的方法,环境的搭建和准备工作,还是参看我的上一篇文章。
MyBatis之环境搭建以及实现增删改查
实现步骤
1. 编写MyBatis-config.xml配置文件
编写配置文件,上一篇文章也有介绍,
今天学习两个新功能,第一个就是编写单独的数据库信息文件,在配置文件中读取后,使用${}方式,读取文件中的内容,配置数据库信息,防止硬编码,完成数据库信息统一管理。
首先编写db.properties,将数据库信息定义在此文件中,通常该文件放在classpath下。
示例代码,如下:
my.driver=com.mysql.cj.jdbc.Driver
my.url=jdbc:mysql://192.168.56.88:3306/mysql
my.username=root
my.password=root
在使用< properties>标签,引入到MyBatis-config.xml配置文件中
第二个就是简化参数的写法,上一篇文章,我们看到Mapper.xml文件中,定义SQL的id时,如果输入参数是JavaBean,都是以全类名的形式配置的,这样代码比较冗余,我们使用< typeAliases>< package>标签,批量引用JavaBean,SQL输入输出参数时,可以省略包名的形式,直接使用JavaBean的类名。
MyBatis-config.xml代码如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 读取外部数据库信息文件 --><properties resource="db.properties" /><!-- 设置JavaBean类型的参数别名 --><typeAliases><package name="xxx.xxx.pojo"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${my.driver}"/><property name="url" value="${my.url}"/><property name="username" value="${my.username}"/><property name="password" value="${my.password}"/></dataSource></environment></environments><mappers><mapper resource="xxx/xxx/mapper/PersonMapper.xml"/></mappers>
</configuration>
2. 编写Mapper.xml文件(增删改查SQL文)
编写增删改查的SQL文,这里就不做展开了,需要注意的是,我们已经在配置文件中批量引入JavaBean,我们只需使用类名(person)即可,通常类名开头小写。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xxx.xxx.entry.personMapper"><select id="queryAllPerson" resultType="person">select * from person</select><select id="queryPersonById" resultType="person" parameterType="int">select * from person where id = #{id}</select><insert id="addPerson" parameterType="person">insert into person values(#{id}, #{name}, #{age}, #{sex})</insert><update id="updatePersonById" parameterType="person">update person set name = #{name}, age = #{age}, sex = #{sex} where id = #{id}</update><delete id="deletePersonById" parameterType="int">delete from person where id = #{id}</delete>
</mapper>
3. 定义PeronMapper接口
将Mapper.xml中SQL的id定义到PeronMapper接口中,输入参数和输出参数与SQL的id中的保持一致。
这里需要注意的是,接口文件和Mapper.xml放到同一个文件中,文件名保持一致。
package xxx.xxx.mapper;import java.util.List;import xxx.xxx.pojo.Person;public interface PersonMapper {public List<Person> queryAllPerson();public Person queryPersonById(int id);public int addPerson(Person person);public int updatePersonById(Person person);public int deletePersonById(int id);
}
4. 编写测试类
1. 执行步骤
- 读取MyBatis配置文件
- 实例化SqlSessionFactory
- 实例化SqlSession
- 获取PersonMapper接口
通过session.getMapper(PersonMapper.class)的方式,获取接口 - 执行SQL
- 增删改的场合,完成数据提交
2. 代码实例
完成对Person表的增删改查
package xxx.xxx.test;import java.io.IOException;
import java.io.Reader;
import java.util.List;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import xxx.xxx.mapper.PersonMapper;
import xxx.xxx.pojo.Person;public class TestMyBatis {public static void main(String[] args) throws IOException {Person person = new Person(1, "zs", 23, true);System.err.println("登录前");queryPersonById(1);addPerson(person);System.err.println("登录后");queryPersonById(1);person = new Person(1, "ls", 24, true);System.err.println("更新前");queryAllPerson();updatePersonById(person);System.err.println("更新后");queryPersonById(1);System.err.println("删除前");queryPersonById(1);deletePersonById(1);System.err.println("删除后");queryPersonById(1);}public static void queryAllPersonUsePersonMapping() throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLList<Person> persons = personMapper.queryAllPerson();persons.forEach(System.err::println);}}public static void queryAllPerson() throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLList<Person> persons = personMapper.queryAllPerson();persons.forEach(System.err::println);}}public static void queryPersonById(int id) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLPerson person = personMapper.queryPersonById(1);System.err.println(person);}}public static void addPerson(Person person) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLint count = personMapper.addPerson(person);System.err.println("登陆件数:" + count);// 6.增删改的场合,完成数据提交session.commit();}}public static void updatePersonById(Person person) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLint count = personMapper.updatePersonById(person);System.err.println("更新件数:" + count);// 6.增删改的场合,完成数据提交session.commit();}}public static void deletePersonById(int id) throws IOException {// 1.读取MyBatis配置文件Reader reader = Resources.getResourceAsReader("mybatis-config.xml");// 2.实例化SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 3.实例化SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 4.获取PersonMapper接口PersonMapper personMapper = session.getMapper(PersonMapper.class);// 5.执行SQLint count = personMapper.deletePersonById(id);System.err.println("删除件数:" + count);// 6.增删改的场合,完成数据提交session.commit();}}}
3. 运行log
通过下边的运行log可以看出,完成对Person表的增删改查
登录前
null
登陆件数:1
登录后
Person [id=1, name=zs, age=23]
更新前
Person [id=1, name=zs, age=23]
更新件数:1
更新后
Person [id=1, name=ls, age=24]
删除前
Person [id=1, name=ls, age=24]
删除件数:1
删除后
null
开发环境构造图

总结
到这里,我们就完成了MyBatis的传统方式和面向接口编程方式完成数据库的增删改查,大家可以动手试试,欢迎留言交流,下篇见。
相关文章:
MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置
MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件(增删改查SQL文)3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章,我们…...
百面嵌入式专栏(面试题)内存管理相关面试题1.0
沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍内存管理相关面试题 。 一、内存管理相关面试题 page数据结构中的_refcount和_mapcount有什么区别?匿名页面和高速缓存页面有什么区别?page数据结构中有一个锁,我们称为页锁,请问trylock_page()和loc…...
SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo
ErrorEnum.java // 枚举所有的错误 package com.example.demo.enums;import lombok.Getter;public enum ErrorEnum {SYSTEM_ERROR(-1, "系统错误"),PARAM_ERROR(-2, "参数错误"),OK(0, "成功"),;Getterprivate final int code;Getterprivate fi…...
7机器人位姿的数学描述与坐标变
由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为: 式中为三个单位正交主矢量,分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位,∠XBXA表…...
基于ESP8266 开发板(MCU)遥控小车
遥控小车 遥控界面 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…...
【C生万物】C语言数据类型、变量和运算符
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…...
CTF--Web安全--SQL注入之‘绕过方法’
一、什么是绕过注入 众所周知,SQL注入是利用源码中的漏洞进行注入的,但是有攻击手段,就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令,符号,甚至空格,会在反SQL机制中…...
线程池常用的阻塞队列
新任务来的时候,会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。 不同的线程池会选用不同的阻塞队列,我们可以结合内置线程池来分析。 ● 容量为 Integer.MAX_VALUE 的 LinkedBlockingQue…...
【Java EE】----SpringBoot的日志文件
1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用: 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为:(1-6级别从低到高) trace:微量&#…...
【网络安全】2024年暗网威胁分析及发展预测
暗网因其非法活动而臭名昭著,现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心,为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势,近日,卡巴斯基的安全研究…...
SpringMVC-组件解析
一、引子 我们在上一篇文章Spring MVC-基本概念中,为读者解释了如何使用SpringMVC框架,将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇,SpringMVC框架到底做了什么,是怎么把请求分发给…...
ubuntu22.04@laptop OpenCV Get Started: 002_reading_writing_videos
ubuntu22.04laptop OpenCV Get Started: 002_reading_writing_videos 1. 源由2. Read/Display/Write应用Demo3 video_read_from_file3.1 C应用Demo3.2 Python应用Demo3.3 重点过程分析3.3.1 读取视频文件3.3.2 读取文件信息3.3.3 帧读取&显示 4 video_read_from_image_sequ…...
Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作
上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…...
Chrome扩展开发纪要
1. 开发人员模式 以Edge(Chromium)为例, 可在管理扩展页, 在左侧开发人员模式打开, 只有此项开启后才能加载未压缩的扩展, 虽然也可以打包扩展, 但是浏览器会检测, 未上线的crx包是无法被安装的. 所以不打算上架的crx只能使用 加载解压缩的扩展 安装 2. 创建扩展 2.1 建立文…...
LeetCode-第28题-找出字符串中第一个匹配项的下标
1.题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …...
分享90个行业PPT,总有一款适合您
分享90个行业PPT,总有一款适合您 90个行业PPT下载链接:https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…...
【原创 附源码】Flutter海外登录--Tiktok登录最详细流程
最近接触了几个海外登录的平台,踩了很多坑,也总结了很多东西,决定记录下来给路过的兄弟坐个参考,也留着以后留着回顾。更新时间为2024年2月7日,后续集成方式可能会有变动,所以目前的集成流程仅供参考&#…...
国内chatGPT3.5升级到chatGPT4.0的教程(24年2月更新)
最新的充值方法看这里。 通过虚拟卡 WildCard 的方式来升级 GPT 4.0 最快了,大概2分钟就可以升级完成, 而且升级 GPT 4.0 价钱也不贵,虚拟卡一年10美元,GPT4 每个月也才 20美元。如果你觉得 GPT 4.0 对你可能有帮助,那就赶快来升级…...
【python量化交易】qteasy使用教程01 - 安装方法及初始化配置
qteasy教程1 - 安装方法及初始化配置 qteasy教程1 - 安装方法及初始配置qteasy安装前的准备工作1, 创建安装环境2,安装MySQL数据库 (可选)安装pymysql 3,创建tushare账号并获取API token (可选)4,安装TA-lib (可选)WindowsMac OSL…...
UML 2.5图形库
UML 2.5图形库 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能,并实现了云端存储&#…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
