当前位置: 首页 > news >正文

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. 执行步骤

  1. 读取MyBatis配置文件
  2. 实例化SqlSessionFactory
  3. 实例化SqlSession
  4. 获取PersonMapper接口
    通过session.getMapper(PersonMapper.class)的方式,获取接口
  5. 执行SQL
  6. 增删改的场合,完成数据提交

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文件&#xff08;增删改查SQL文&#xff09;3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章&#xff0c;我们…...

百面嵌入式专栏(面试题)内存管理相关面试题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矩阵表示为&#xff1a; 式中为三个单位正交主矢量&#xff0c;分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位&#xff0c;∠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语言数据类型、变量和运算符

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…...

CTF--Web安全--SQL注入之‘绕过方法’

一、什么是绕过注入 众所周知&#xff0c;SQL注入是利用源码中的漏洞进行注入的&#xff0c;但是有攻击手段&#xff0c;就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令&#xff0c;符号&#xff0c;甚至空格&#xff0c;会在反SQL机制中…...

线程池常用的阻塞队列

新任务来的时候&#xff0c;会先判断当前运行的线程数量是否达到核心线程数&#xff0c;如果达到的话&#xff0c;新任务就会被存放在队列中。 不同的线程池会选用不同的阻塞队列&#xff0c;我们可以结合内置线程池来分析。 ● 容量为 Integer.MAX_VALUE 的 LinkedBlockingQue…...

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…...

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…...

SpringMVC-组件解析

一、引子 我们在上一篇文章Spring MVC-基本概念中&#xff0c;为读者解释了如何使用SpringMVC框架&#xff0c;将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇&#xff0c;SpringMVC框架到底做了什么&#xff0c;是怎么把请求分发给…...

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 &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …...

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…...

【原创 附源码】Flutter海外登录--Tiktok登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月7日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&#…...

国内chatGPT3.5升级到chatGPT4.0的教程(24年2月更新)

最新的充值方法看这里。 通过虚拟卡 WildCard 的方式来升级 GPT 4.0 最快了&#xff0c;大概2分钟就可以升级完成, 而且升级 GPT 4.0 价钱也不贵&#xff0c;虚拟卡一年10美元&#xff0c;GPT4 每个月也才 20美元。如果你觉得 GPT 4.0 对你可能有帮助&#xff0c;那就赶快来升级…...

【python量化交易】qteasy使用教程01 - 安装方法及初始化配置

qteasy教程1 - 安装方法及初始化配置 qteasy教程1 - 安装方法及初始配置qteasy安装前的准备工作1&#xff0c; 创建安装环境2&#xff0c;安装MySQL数据库 (可选)安装pymysql 3&#xff0c;创建tushare账号并获取API token (可选)4&#xff0c;安装TA-lib (可选)WindowsMac OSL…...

UML 2.5图形库

UML 2.5图形库 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#…...

构建高效AI学习伙伴:从系统提示词到结构化交互设计

1. 项目概述&#xff1a;一个为学习者量身定制的AI交互模式最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“learner-ai-mode”。光看名字&#xff0c;你可能会觉得这又是一个普通的AI应用或者学习工具。但当我深入去研究它的代码和设计理念后&#xff0c;发现它其实指向…...

实证论文不用愁!虎贲等考 AI 数据分析:零代码跑模型,图表 + 结论一键生成

在本科、硕士毕业论文写作中&#xff0c;数据分析往往是最让学生头疼的章节。不会数据清洗、不懂模型选择、跑不出稳健结果、图表不会做、文字不会写&#xff0c;即便前面内容写得再完整&#xff0c;第四章一塌糊涂&#xff0c;整篇论文直接被导师打回。 传统软件如 Stata、Py…...

Shiv进阶教程:解决Python依赖管理的7个实用技巧

Shiv进阶教程&#xff1a;解决Python依赖管理的7个实用技巧 【免费下载链接】shiv shiv is a command line utility for building fully self contained Python zipapps as outlined in PEP 441, but with all their dependencies included. 项目地址: https://gitcode.com/g…...

基于大语言模型的自动化信息处理系统:从RSS聚合到AI摘要的实践

1. 项目概述&#xff1a;一个能帮你“读”新闻的AI助手 在信息爆炸的时代&#xff0c;每天光是处理订阅的RSS、关注的社交媒体动态、收藏的YouTube视频和没读完的长文&#xff0c;就足以让人精疲力尽。我们总想保持对行业趋势的敏感&#xff0c;却又被海量信息淹没&#xff0c…...

收藏这篇就够了!日薪 2700 护网 HW 面试攻略,2026 护网全流程提前吃透

前言 参与hvv的事情还是要想办法规避掉很多坑的。网络安全这个行业现阶段还是主要政策驱动&#xff0c;后面应该是客户意识&#xff0c;现在用户教育成本明显比以前低太多。 1.关于HVV的一个简单流程 首先我带大家从甲方和厂商的角度来分解一下整个护网流程的核心逻辑 第一阶段…...

为AI智能体构建自动化RSS信息管道:agent-rss工具详解与实践

1. 项目概述&#xff1a;为AI智能体打造的RSS信息管道 如果你正在构建或使用AI智能体&#xff08;比如Claude Code、OpenClaw这类工具&#xff09;&#xff0c;并且希望它们能像人类一样&#xff0c;定时、定向地获取互联网上的最新信息&#xff0c;那么你很可能需要一个专门为…...

DOM NodeList 深入解析

DOM NodeList 深入解析 概述 DOM NodeList 是 Web 开发中常用的一种数据结构,它代表了文档中一系列元素的集合。在本文中,我们将对 DOM NodeList 进行深入解析,包括其定义、特点、使用方法以及在实际开发中的应用。 定义 DOM NodeList 是一个类似数组的对象,它包含了文…...

CipherChat:基于词元替换的端到端加密大模型对话方案解析

1. 项目概述&#xff1a;当大模型对话遇上密码学最近在折腾大语言模型&#xff08;LLM&#xff09;应用开发的朋友&#xff0c;可能都遇到过同一个头疼的问题&#xff1a;如何保证用户和模型之间对话的隐私和安全&#xff1f;我们辛辛苦苦搭建的智能客服、个人助理或者创意写作…...

2026年医疗卫生/护理求职AI工具横评:白衣天使的求职神器大比拼

导语 2026年&#xff0c;医疗卫生行业依然是最具社会价值和就业稳定性的行业之一。随着中国老龄化加速&#xff0c;医护人员需求持续扩大&#xff0c;仅公立医院护士岗位需求量就突破200万。然而&#xff0c;医护求职并不轻松&#xff1a;编制紧张、规培政策复杂、职称考试压力…...

一键获取国家中小学智慧教育平台电子课本:开源解析工具完全指南

一键获取国家中小学智慧教育平台电子课本&#xff1a;开源解析工具完全指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。 …...