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.创建数据表(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" ?> <!DOC…...
C#面:泛型的主要约束和次要约束是什么
在 C# 中,泛型的约束是用来限制泛型类型参数的行为和能力的。 主要约束和次要约束是两种不同的约束方式。 主要约束(Primary Constraint): 主要约束指定了泛型类型参数必须满足的最基本的条件,它可以是一个类、一个接…...
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注解是干什么用的三、用法 一、什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。 所谓同源是指,域名,协议&…...
【力扣】45. 跳跃游戏 II
Problem: 45. 跳跃游戏 II 文章目录 问题思路复杂度Code 问题 思路 核心思路,例如nums[i]5,那么最远能跳五步; //那么在这接下来1-5范围内,哪个能让我跳的最远,这个最远指的是 -------------------------------------…...
【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…...
对装饰器模式的理解
目录 一、场景二、面对场景中的新需求,我们怎么办?1、暴力法:直接修改原有的代码。2、子类继承法:既然要增强行为,那我搞一个子类,覆写不就完事了?3、装饰器模式 三、对装饰器模式的思考1、从代…...
在替换微软AD的CA证书服务AD CS前,要先做哪些准备工作?
AD CS是什么 关于这个问题,有几个概念需要先弄明白:PKI、CA、数字证书。 PKI(Public Key Infrastructure,公钥基础设施)是提供公钥加密和数字签名服务的系统或平台,实现基于公钥密码体制的密钥和证书的产生…...
Java中的System
文章目录 概要小结 概要 在Java中,System类提供了一些静态方法来实现与系统相关的操作。以下是System类中常用的方法及其含义: System.currentTimeMillis():返回当前时间(以毫秒为单位)自1970年1月1日00:00:00 GMT以来…...
Mybites一对多collection
Goods实体属性: private List<GoodsImg> goodsImgList; private String id; private String name; GoodsImg实体属性: private String id; private String fid; private String imgpath; …...
基于springboot实现图书进销存管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现图书进销存管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了图书进销存管理系统的开发全过程。通过分析图书进销存管理系统管理的不足,创建了一个计算机管理图书进销…...
敏捷开发:想要快速交付就必须舍弃产品质量?
随着敏捷的推广与应用,如今已经成为了最有效的团队级别的方法论,越来越多的软件和 IT 团队正在采用敏捷,但是你在敏捷吗? 自从那一群充满影响力的软件从业者聚集在一起并发布了《敏捷宣言》以来,已经过去了 23 年。敏…...
SNMP-详解指南
目录 SNMP介绍 SNMP的工作机制轮询 SNMP的MIB(管理信息库) SNMP是基于UDP协议 SNMP介绍 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种广泛应用于互联网上的网络管理协议。它提供了一种标准化…...
vue-router 原理【详解】hash模式 vs H5 history 模式
hash 模式 【推荐】 路由效果 在不刷新页面的前提下,根据 URL 中的 hash 值,渲染对应的页面 http://test.com/#/login 登录页http://test.com/#/index 首页 核心API – window.onhashchange 监听 hash 的变化,触发视图更新 window.onhas…...
WebGl/Three 粒子系统 人物破碎及还原运动
粒子 首先,加载模型,这是万千粒子的前身,模型对象由很多面构成,这些面又是由各个点构成的,所以可以将模型的几何体对象geometry赋给粒子对象,粒子物体用Points方式渲染 bloader.load("obj/female02/Fe…...
华为OD-C卷-分披萨[100分]
题目描述 "吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认…...
uniapp 中video标签视频禁止快,拖拽快进
废话不多说,直接上代码 <video id"myVideo" :src"sectionInfo.type_config.video_url" timeupdate"bindtimeupdate"></video> <script>export default {data() {return {historyTime: 0,}},methods:{// 监听播放进…...
网页端HTML使用MQTTJs订阅RabbitMQ数据
最近在做一个公司的日志组件时有一个问题难住了我。今天问题终于解决了。由于在解决问题中,在网上也查了很多资料都没有一个完整的实例可以参考。所以本着无私分享的目的记录一下完整的解决过程和实例。 需求:做一个统一日志系统可以查看日志列表和一个可…...
课题学习(二十一)----姿态更新的四元数算法推导
声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 最近需要使用AEKF对姿态进行结算,所以又对四元数进了深入的学习,本篇博客仅对四元数进行推导,后续会对基于四元数的…...
frp多客户端内网穿透实战:从配置到优化
1. 为什么你需要frp多客户端内网穿透? 想象一下这个场景:你家里有台NAS存着全家照片,办公室电脑挂着下载任务,还有台树莓派跑着智能家居系统。突然出差在外想访问这些设备,却发现它们都躲在路由器后面"与世隔绝&q…...
基于DDQN的柔性作业车间动态调度优化:多智能体协同与奖励机制设计
1. 柔性作业车间调度为什么需要深度强化学习? 想象一下你管理着一个汽车零部件加工厂,每天有上百个不同型号的零件需要经过车削、铣削、钻孔等多道工序。每台机器的加工能力不同,订单的紧急程度各异,还时不时有加急订单插队——这…...
GLM-4v-9b部署教程:支持LoRA微调接口,适配垂直领域视觉问答任务
GLM-4v-9b部署教程:支持LoRA微调接口,适配垂直领域视觉问答任务 1. 引言:为什么选择GLM-4v-9b? 如果你正在寻找一个既强大又实用的多模态AI模型,GLM-4v-9b绝对值得关注。这个模型有90亿参数,不仅能看懂图…...
PX4固件源码结构解析:从零开始理解飞控代码的组织逻辑
PX4固件源码结构解析:从零开始理解飞控代码的组织逻辑 第一次打开PX4固件的代码仓库时,面对密密麻麻的文件夹和文件,很多开发者都会感到无从下手。这就像走进一个巨大的图书馆,如果没有明确的分类系统和导航标识,很容易…...
图图的嗨丝造相-Z-Image-Turbo参数调优指南:Denoising Strength如何影响渔网纹理清晰度
图图的嗨丝造相-Z-Image-Turbo参数调优指南:Denoising Strength如何影响渔网纹理清晰度 1. 认识Denoising Strength参数 1.1 参数基本概念 Denoising Strength(去噪强度)是控制AI生成图片时去噪程度的关键参数。在生成渔网袜这类需要精细纹…...
Z-Image-Turbo工业检测应用:基于OpenCV的缺陷识别系统
Z-Image-Turbo工业检测应用:基于OpenCV的缺陷识别系统 1. 引言 在工业生产线上,产品质量检测一直是关键环节。传统的人工检测方式效率低下且容易疲劳出错,而基于传统机器视觉的检测系统又往往需要复杂的特征工程和大量调试。现在࿰…...
2026家长自查手册:为孩子选择DHA,您是否问对了这五个问题?
2026家长自查手册:为孩子选择DHA,您是否问对了这五个问题?在信息过载的今天,为孩子选择一款DHA或“补脑”产品,可能比解答一道数学压轴题更让家长困惑。品牌故事、明星代言、纯度竞赛……营销声音震耳欲聋。然而&#…...
打造Spring Boot接口护盾:防重提交与限流秘籍
打造Spring Boot接口护盾:防重提交与限流秘籍 Spring Boot 接口那些 “糟心事” 在当今高并发的互联网应用场景下,Spring Boot 作为主流的 Java 开发框架,被广泛应用于构建各类后端服务。然而,随着业务的不断发展和用户量的增长&a…...
Agent总是记不住?字节跳动开源OpenViking,用文件系统重构记忆
title: 字节跳动开源OpenViking:用「文件系统」重构AI Agent记忆,这才是正解 date: 2026-03-15 tags: [AI Agent, OpenViking, 字节跳动, 上下文管理] status: draft 说实话,做 AI Agent 开发最头疼的是什么?不是模型不够聪明&am…...
毫米波雷达睡眠监测仪DIY指南:从STM32到ESP32的硬件优化实战
毫米波雷达睡眠监测仪DIY指南:从STM32到ESP32的硬件优化实战 几年前,当我第一次把那个不起眼的毫米波雷达模块对准自己胸口,看到屏幕上那条随着呼吸微微起伏的曲线时,那种感觉至今难忘。它不像摄像头那样侵犯隐私,也不…...
