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对姿态进行结算,所以又对四元数进了深入的学习,本篇博客仅对四元数进行推导,后续会对基于四元数的…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
