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

mybatis进阶篇-执行CRUD操作-typeAliases别名-接口绑定

目录结构

在这里插入图片描述

1.创建数据表(book)

# 创建book表
create table book(id int auto_increment primary key,name varchar(255) ,price double ,num int
);

2.mybatis.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><!-- 声明可以使用的环境(如:开发环境(development),测试环境(testing),生产环境
(production),三个环境是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境) --><environment id="development"><!-- 使用原生 JDBC 事务 --><transactionManager type="JDBC"></transactionManager><!-- POOLED数据源的配置, property配置JDBC四个变量--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/数据库"/><property name="username" value="root"/><property name="password" value="密码"/></dataSource></environment></environments><!-- MyBatis查找映射文件 --><mappers><mapper resource="dao/mapper/BookMapper.xml"></mapper></mappers>
</configuration>

3.JDBCUtil封装

public class JDBCUtil {public static SqlSession getSqlSession() throws Exception{//1.通过Resources查找全局mybatis配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");//2.使用SqlSessionFactoryBuilder的使用工厂设计模式SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream );//3.生成SqlSessionSqlSession sqlSession= sqlSessionFactory.openSession();//4.返回SqlSessionreturn sqlSession;}public static void close(SqlSession session){//资源关闭session.close();}
}

4.实体类(BookModel)

private int id;private String name;//书的名称private double price;//书的价格private int num;//书的数量public BookModel() {}public BookModel(String name, double price, int num) {this.name = name;this.price = price;this.num = num;}public BookModel(int id, String name, double price, int num) {this.id = id;this.name = name;this.price = price;this.num = num;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}@Overridepublic String toString() {return "BookModel{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", num=" + num +'}';}

5.dao层接口

	//增删改默认返回类型为int,不需要设置/*** 添加图书* @param bookModel:添加类型* @return 1表示成功,0表示失败*/int insertBook(BookModel bookModel);/*** 修改图书* @param bookModel:修改对象,以id为条件* @return 1表示成功,0表示失败*/int updateBook(BookModel bookModel);/*** 根据id删除数据* @param id:删除数据的id* @return 1表示成功,0表示失败*/int delectBook(int id);/*** 查看所有信息* @return :添加到集合中返回*/List<BookModel> findAll();/*** 查询指定数据* @param map:根据书的名称,书的价格* @return */BookModel findBook(Map<String,Object> map);/*** 分页查询:返回当前页的数据* @param map 传入参数为查询第几页,一页显示条数)* @return*/List<BookModel> getBookListByPagePraram(Map<String,Integer> map);

6.dao层映射文件

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.BookDao"><!-- id:指定dao方法名parameterType:传参类型resultType:返回值类型--><!-- 添加 --><insert id="insertBook" parameterType="model.BookModel">insert into book(name, price, num) values(#{name},#{price},#{num});</insert><!-- 修改  --><update id="updateBook" parameterType="model.BookModel">update book set name = #{name} where id = #{id};</update><!-- 删除(根据id) --><delete id="delectBook" parameterType="int">delete from book where id = #{id};</delete><!-- 查询所有 --><select id="findAll" resultType="model.BookModel">select * from book;</select><!-- 查询(根据书的名称和书的价格 --><select id="findBook" parameterType="map" resultType="model.BookModel">select * from book where name = #{name} and price = #{price};</select><!-- 分页查询 --><select id="getBookListByPagePraram" parameterType="map" resultType="model.BookModel">select * from book limit 2,2;</select>
</mapper>

7.测试类

public class BookAppMain {public static void main(String[] args) throws Exception{//insertBook();//updateBook();//delectBook(3);//findBookAll();//findBook();//getBookListByPagePraram(2,2);}//添加public static void insertBook() throws Exception{//获取SqlSession对象SqlSession sqlSession = JDBCUtil.getSqlSession();//初始化BookModelBookModel bookModel = new BookModel("斗破苍穹", 211, 1);//指定dao方法,传入BookModel实例,返回1/0int row = sqlSession.insert("dao.BookDao.insertBook",bookModel);//把最终的sql真正执行,必须添加,添加后才能在数据库中显示成功操作的数据sqlSession.commit();//释放资源JDBCUtil.close(sqlSession);}//修改public static void updateBook() throws Exception{//获取SqlSession对象SqlSession sqlSession = JDBCUtil.getSqlSession();//初始化BookModelBookModel bookModel = new BookModel();bookModel.setId(3);bookModel.setName("一人之下");//未设置参数,保留原来数据sqlSession.update("dao.BookDao.updateBook",bookModel);//提交到数据库sqlSession.commit();//释放资源JDBCUtil.close(sqlSession);}//删除public static void delectBook(int id) throws  Exception{//获取SqlSession对象SqlSession sqlSession = JDBCUtil.getSqlSession();//根据id删除sqlSession.delete("dao.BookDao.delectBook",id);//提交到数据库sqlSession.commit();//释放资源JDBCUtil.close(sqlSession);}//查看所有public static void findBookAll() throws Exception{//获取SqlSession对象SqlSession sqlSession = JDBCUtil.getSqlSession();//查询到所有BookModel实例,映射到集合中List<BookModel> list = sqlSession.selectList("dao.BookDao.findAll");//遍历集合for (BookModel book : list){System.out.println(book);}//查询操作可以不执行commit()方法//sqlSession.commit();//释放资源JDBCUtil.close(sqlSession);}//根据名称和价格查看public static void findBook() throws Exception{//获取SqlSession对象SqlSession sqlSession = JDBCUtil.getSqlSession();//设置需要查询对象Map<String,Object> map = new HashMap<>();map.put("name", "斗罗大陆1");map.put("price", 58.0);//根据name,price查询BookModel bookModel = sqlSession.selectOne("dao.BookDao.findBook",map);//查询操作可以不执行commit()方法//sqlSession.commit();System.out.println(bookModel);//释放资源JDBCUtil.close(sqlSession);}//分页查询public static void getBookListByPagePraram(Integer pageName,Integer pageSize) throws Exception{SqlSession sqlSession = JDBCUtil.getSqlSession();Map<String, Integer> map = new HashMap<>();Integer pageStart = (pageName - 1);map.put("pageStart",pageStart);map.put("pageSize",pageSize);List<BookModel> list = sqlSession.selectList("dao.BookDao.getBookListByPagePraram", map);for (BookModel bookModel : list ){System.out.println("第" + pageName + "页:" + bookModel);}}}

typeAliases 别名

自定义某个类别名

类型别名是为 Java 类型命名一个短的名字。它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。在mybatis.xml设置typeAliases,注意放置位置顺序

	<typeAliases><typeAlias type="类的路径" alias="别名"/></typeAliases>

设置别名测试

mybatis.xml添加typeAliases

把model.BookModel路径起别名为Book

	<typeAliases><typeAlias type="model.BookModel" alias="Book"/></typeAliases>

在BookMapper.xml中使用别名

 <!-- <select id="findAll" resultType="model.BookModel">--><select id="findAll" resultType="Book">select * from book;</select>

包下所有类命名为别名

给某个包下所有类起别名,别名为类名,不区分大小写, mybatis.xml 中配置

<!-- 加入包下的类名作为传递的别名 --><typeAliases><package name="包的路径"/></typeAliases>

XXMapper.xml 中通过类名引用对应的 resultType=“User” 或是 resultType=“user”,不用在写包的路径

接口绑定

让创建好的对应接口与 mapper.xml 对应(对应是指:BookDao与BookrMapper.xml一一对应),由 mybatis 生成接口的实现类,通过调用接口对象获取到 Bookmapper.xml 中编写的 sql 方法。
框架的spring与mybatis结合正是使用此方式

	//修改上面添加方法,使用接口绑定方式public static void insertBook2() throws Exception{SqlSession sqlSession = JDBCUtil.getSqlSession();BookModel bookModel = new BookModel("大头儿子小头爸爸", 211, 1);//int row = sqlSession.insert("dao.BookDao.insertBook",bookModel);//接口绑定,绑定上路径地址,文件地址更改时,自动变更BookDao mapper = sqlSession.getMapper(BookDao.class);//相当于调用接口实现类方法一样,直接调用方法,添加参数int row = mapper.insertBook(bookModel);//把最终的sql真正执行,必须添加,添加后才能在数据库中显示成功操作的数据sqlSession.commit();System.out.println(row > 0 ? "添加成功" : "添加失败");JDBCUtil.close(sqlSession);}

相关文章:

mybatis进阶篇-执行CRUD操作-typeAliases别名-接口绑定

目录结构 1.创建数据表&#xff08;book&#xff09; # 创建book表 create table book(id int auto_increment primary key,name varchar(255) ,price double ,num int );2.mybatis.xml配置文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOC…...

C#面:泛型的主要约束和次要约束是什么

在 C# 中&#xff0c;泛型的约束是用来限制泛型类型参数的行为和能力的。 主要约束和次要约束是两种不同的约束方式。 主要约束&#xff08;Primary Constraint&#xff09;&#xff1a; 主要约束指定了泛型类型参数必须满足的最基本的条件&#xff0c;它可以是一个类、一个接…...

Java使用documents4j将word和excel转pdf

pom.xml添加documents4j依赖 <!-- documents4j --> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version> </dependency> <!-- documents4j 转 wor…...

使用策略模式实现 Spring 分布式和单机限流

我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。 思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy。在 AOP 切面中,根据配置决定使用哪种限流策…...

@CrossOrigin注解解决跨域问题

文章目录 一、什么是跨域二、CrossOrigin注解是干什么用的三、用法 一、什么是跨域 跨域&#xff0c;指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 所谓同源是指&#xff0c;域名&#xff0c;协议&…...

【力扣】45. 跳跃游戏 II

Problem: 45. 跳跃游戏 II 文章目录 问题思路复杂度Code 问题 思路 核心思路&#xff0c;例如nums[i]5&#xff0c;那么最远能跳五步&#xff1b; //那么在这接下来1-5范围内&#xff0c;哪个能让我跳的最远&#xff0c;这个最远指的是 -------------------------------------…...

【Python基础】19.eval函数的使用

eval函数 eval()将字符串转变为有效的表达式来求值并返回对应的结果 基础数据计算 In [1]: eval("1 1") Out[1]: 2字符串重复 In [2]: eval (" * * 10") Out[2]: **********字符串转为列表 In [3]: type(eval("[1,2,3,4,5]")) Out[3]: lis…...

对装饰器模式的理解

目录 一、场景二、面对场景中的新需求&#xff0c;我们怎么办&#xff1f;1、暴力法&#xff1a;直接修改原有的代码。2、子类继承法&#xff1a;既然要增强行为&#xff0c;那我搞一个子类&#xff0c;覆写不就完事了&#xff1f;3、装饰器模式 三、对装饰器模式的思考1、从代…...

在替换微软AD的CA证书服务AD CS前,要先做哪些准备工作?

AD CS是什么 关于这个问题&#xff0c;有几个概念需要先弄明白&#xff1a;PKI、CA、数字证书。 PKI&#xff08;Public Key Infrastructure&#xff0c;公钥基础设施&#xff09;是提供公钥加密和数字签名服务的系统或平台&#xff0c;实现基于公钥密码体制的密钥和证书的产生…...

Java中的System

文章目录 概要小结 概要 在Java中&#xff0c;System类提供了一些静态方法来实现与系统相关的操作。以下是System类中常用的方法及其含义&#xff1a; System.currentTimeMillis()&#xff1a;返回当前时间&#xff08;以毫秒为单位&#xff09;自1970年1月1日00:00:00 GMT以来…...

Mybites一对多collection

Goods实体属性&#xff1a; private List<GoodsImg> goodsImgList; private String id; private String name; GoodsImg实体属性&#xff1a; private String id; private String fid; private String imgpath; …...

基于springboot实现图书进销存管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足&#xff0c;创建了一个计算机管理图书进销…...

敏捷开发:想要快速交付就必须舍弃产品质量?

随着敏捷的推广与应用&#xff0c;如今已经成为了最有效的团队级别的方法论&#xff0c;越来越多的软件和 IT 团队正在采用敏捷&#xff0c;但是你在敏捷吗&#xff1f; 自从那一群充满影响力的软件从业者聚集在一起并发布了《敏捷宣言》以来&#xff0c;已经过去了 23 年。敏…...

SNMP-详解指南

目录 SNMP介绍 SNMP的工作机制轮询 SNMP的MIB&#xff08;管理信息库&#xff09; SNMP是基于UDP协议 SNMP介绍 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种广泛应用于互联网上的网络管理协议。它提供了一种标准化…...

vue-router 原理【详解】hash模式 vs H5 history 模式

hash 模式 【推荐】 路由效果 在不刷新页面的前提下&#xff0c;根据 URL 中的 hash 值&#xff0c;渲染对应的页面 http://test.com/#/login 登录页http://test.com/#/index 首页 核心API – window.onhashchange 监听 hash 的变化&#xff0c;触发视图更新 window.onhas…...

WebGl/Three 粒子系统 人物破碎及还原运动

粒子 首先&#xff0c;加载模型&#xff0c;这是万千粒子的前身&#xff0c;模型对象由很多面构成&#xff0c;这些面又是由各个点构成的&#xff0c;所以可以将模型的几何体对象geometry赋给粒子对象&#xff0c;粒子物体用Points方式渲染 bloader.load("obj/female02/Fe…...

华为OD-C卷-分披萨[100分]

题目描述 "吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认…...

uniapp 中video标签视频禁止快,拖拽快进

废话不多说&#xff0c;直接上代码 <video id"myVideo" :src"sectionInfo.type_config.video_url" timeupdate"bindtimeupdate"></video> <script>export default {data() {return {historyTime: 0,}},methods:{// 监听播放进…...

网页端HTML使用MQTTJs订阅RabbitMQ数据

最近在做一个公司的日志组件时有一个问题难住了我。今天问题终于解决了。由于在解决问题中&#xff0c;在网上也查了很多资料都没有一个完整的实例可以参考。所以本着无私分享的目的记录一下完整的解决过程和实例。 需求&#xff1a;做一个统一日志系统可以查看日志列表和一个可…...

课题学习(二十一)----姿态更新的四元数算法推导

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    最近需要使用AEKF对姿态进行结算&#xff0c;所以又对四元数进了深入的学习&#xff0c;本篇博客仅对四元数进行推导&#xff0c;后续会对基于四元数的…...

TortoiseGit中文界面设置全攻略:从安装到日常使用避坑指南

TortoiseGit中文界面设置全攻略&#xff1a;从安装到日常使用避坑指南 第一次打开TortoiseGit时&#xff0c;满屏的英文菜单是否让你望而却步&#xff1f;作为Windows平台最受欢迎的Git图形化工具之一&#xff0c;TortoiseGit的"小乌龟"图标背后藏着强大的版本控制功…...

Cursor-Free-VIP技术深度解析:AI编程助手限制突破的完全指南

Cursor-Free-VIP技术深度解析&#xff1a;AI编程助手限制突破的完全指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

QMIX算法解析:多智能体强化学习中的值函数分解与单调性约束

1. QMIX算法概述 多智能体强化学习&#xff08;MARL&#xff09;是近年来人工智能领域的热门研究方向之一。想象一下星际争霸中的战斗场景&#xff1a;一队机枪兵需要协作击败敌人&#xff0c;每个单位都需要根据局部观察做出决策&#xff0c;同时保持整体战术配合。这正是QMIX…...

老旧Mac焕发新生:OpenCore Legacy Patcher完整使用指南

老旧Mac焕发新生&#xff1a;OpenCore Legacy Patcher完整使用指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方抛弃的老旧Mac&…...

Innovus许可证服务器搭建全记录:从hostid获取到1patch破解的完整流程

Innovus许可证服务器部署实战指南&#xff1a;从环境配置到稳定运行 1. 环境准备与系统优化 在CentOS 7上部署Innovus许可证服务器前&#xff0c;合理的系统配置是确保后续流程顺利的基础。不同于普通应用部署&#xff0c;EDA工具对系统环境有着更为严格的要求。我们建议使用物…...

告别BiocManager安装卡顿:用conda/mamba一键部署R的clusterProfiler生信分析环境

告别BiocManager安装卡顿&#xff1a;用conda/mamba一键部署R的clusterProfiler生信分析环境 在生物信息学分析中&#xff0c;富集分析是不可或缺的一环&#xff0c;而clusterProfiler作为GO和KEGG功能富集分析的核心工具包&#xff0c;其重要性不言而喻。然而&#xff0c;许多…...

信号与系统分析2026(春季)作业参考答案 - 第一次作业

信号与系统2025&#xff08;春季&#xff09;作业要求及参考答案汇总信号与系统2026&#xff08;春季&#xff09;作业要求及参考答案汇总 01 基础作业一、绘制信号波形 1、必做题...

SAP MM DIEN类型服务料号的采购

SAP MM DIEN类型服务料号的采购Part I - 前言SAP S/4HANA系统中&#xff0c;对于服务物料&#xff0c;有两种物料类型&#xff0c;SERV和DIEN。它们的用途不同&#xff0c;功能也各不相同。DIEN 物料类型DIEN 是用于向客户提供服务的物料类型。它通常用于销售订单中&#xff0c…...

UiPath003 创建基本库

以下教程将引导您完成在 Studio 中创建库&#xff0c;发布库并在其他自动化项目中使用库的步骤。 创建库与创建基本流程类似。区别在于&#xff0c;库是一个包含可重用组件的包&#xff0c;这些组件可以在其他项目的上下文中使用。 本示例从 Excel 电子表格获取数据&#xff0c…...

2026数据中台选型:数据治理能力成决胜关键,谁在定义下一代“智能数据引擎”?

当企业数字化转型的焦点从“建平台”转向“用数据”&#xff0c;数据中台的建设逻辑正在被重塑。过去数年&#xff0c;数据中台作为核心战略&#xff0c;解决了大规模数据“进得来、存得下、算得动”的问题。然而&#xff0c;随着业务对数据实时性、准确性和易用性要求的指数级…...