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对姿态进行结算,所以又对四元数进了深入的学习,本篇博客仅对四元数进行推导,后续会对基于四元数的…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...
深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...
