当前位置: 首页 > 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;后续会对基于四元数的…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...