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

MyBaits

MyBaits

  • MyBaits的jar包介绍
  • MyBaits的入门案例
    • 创建实体
  • java日志处理框架
    • 常用的日志处理框架
    • Log4j的日志级别
  • Mybatis配置的完善
    • Mybatis的日志管理
    • 使用别名alias
      • 方式一
      • 方式二
  • SqlSession对象下的常用API
    • 查询操作
  • Mapper动态代理
  • Mapper 动态代理规范
    • 查询所有用户
    • 根据用户ID查询用户
  • Mapper动态代理模式下的多参数处理
    • @Param注解传参法
    • POJO传参法

MyBaits的jar包介绍

在这里插入图片描述
在这里插入图片描述

MyBaits的入门案例

创建实体

E:\java\MyBaits\mybatisdemo\src\com\bjsxt\pojo\Users.java

java日志处理框架

常用的日志处理框架

在这里插入图片描述
Log4j: Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java主流日志框架

Log4j的日志级别

在这里插入图片描述

Mybatis配置的完善

Mybatis的日志管理

使用别名alias

Mybatis 中的别名配置它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。注
意:别名都是大小写不敏感的。

方式一

使用 typeAlias 指定单个类的别名

<typeAliases><typeAlias type="com.bjsxt.pojo.Users" alias="u"/>
</typeAliases>
<!--注意该标签的顺序,放在<settings>标签后面,具体顺序查看Ctrl+<configuration>-->
<select id="selectUsersById" parameterType="int" resultType="u">select * from users where userid = #{suibian}
</select>

表示用u来代替com.bjsxt.pojo.Users

方式二

使用package指定某个包下所有类的默认别名

<typeAliases><package name="com.bjsxt.pojo"/>
</typeAliases>

引入后的映射文件

<select id="selectUsersById" parameterType="int" resultType="users">select * from users where userid = #{suibian}
</select>

这段代码的主要意思呢就是给com.bjsxt.pojo这个包结构下所有的类都起一个别名这个别名就是这个类名的小写字母,以后就可以用小写字母来代替这个包结构了。

eg:com.xxx.xxx.GoodsName就可以替换为goodsnamecom.xxx.xxx.GoodsNumber就可以替换为goodsnumber

SqlSession对象下的常用API

查询操作

1.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\mapper\UsersMapper.xml

<!--    根据用户名与用户性别查询用户,用集合返回--><select id="selectUsersByNameAndSex" resultType="users">select * from users where username = #{name} and usersex = #{sex}</select>
</mapper>
//2.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\UsersDao.javaMap<Integer,Users> selectUsersByNameAndSex(String username, String usersex);
//3.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\impl\UsersDaoImpl.java(省略了UsersDao.java)@Overridepublic Map<Integer, Users> selectUsersByNameAndSex(String username, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();Map<String,String> param = new HashMap<>();param.put("name",username);//要和UserMapper.xml中username = #{name} and usersex = {sex}对应param.put("sex",usersex);Map<Integer, Users> users = sqlSession.selectMap("com.bjsxt.mapper.UserMapper.selectUsersByNameAndSex", param, "userid");return users;}
//4.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\service\serviceimpl\UsersServiceImpl.java
@Overridepublic Map<Integer, Users> findUsersByNameAndSex(String username, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();Map<Integer, Users> integerUsersMap = null;try {UsersDaoImpl usersDao = new UsersDaoImpl();integerUsersMap = usersDao.selectUsersByNameAndSex(username, usersex);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return integerUsersMap;}
//5.测试
@Testpublic void findUsersByNameAndSex(){UsersServiceImpl usersService = new UsersServiceImpl();Map<Integer, Users> usersByNameAndSex = usersService.findUsersByNameAndSex("潘海宸", "男");Set<Integer> integers = usersByNameAndSex.keySet();for (Integer key:integers){Users users = usersByNameAndSex.get(key);System.out.println(key + "\t" + users.getUserid() + "\t" + users.getUsername() + "\t" + users.getUsersex());}}

Mapper动态代理

在 MyBatis 中提供了另外一种 Dao 层的实现方式,既:Mapper 动态代理(或称为接口
绑定)的操作方式。这种方式下程序员只需要写 Dao 接口,不需要创建 Dao 的接口实现类,
Mybatis 会自动生成接口实现类的代理对象。在 Dao 层我们只要创建接口与映射配置文件即
可。这种方式可以大大简化 Dao 层的代码结构,是在开发中最常见的使用方式。

Mapper 动态代理规范

  • 接口名称需要与映射配置文件名称相同
  • 映射配置文件中 namespace 必须是接口的全名
  • 接口中的方法名和映射配置文件中的标签的 id 一致
  • 接口中的返回值类型和映射配置文件中的 resultType的指定类型一致

注意:引入mapper映射配置文件时mapper标签内有所不同,需要用package标签

<!--引入 Mapper 映射配置文件-->
<mappers><package name="com.bjsxt.mapper"/>
</mappers>

查询所有用户

1.修改映射配置文件

<!--查询所有用户-->
<select id="selectUsersAll" resultType="users">select * from users
</select>

2.修改UserMapper接口添加抽象方法

public interface UsersMapper {
List<Users> selectUsersAll();
}

3.创建业务层接口

public interface UsersService {
List<Users> findUsersAll();
}
  1. 创建业务层接口实现类
    //可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
 public List<Users> findUsersAll() {List<Users> list = null;SqlSession sqlSession = MybatisUtils.getSqlSession();try {//getMapper 方法的作用是根据给定的接口的 Class 对象,生成该接口的接口实现类的代理对象UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);//可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;//定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了list = mapper.selectUsersAll();} catch (Exception e) {sqlSession.rollback();e.printStackTrace();} finally {MybatisUtils.closeSqlSession();}return list;}

5.测试

@Testpublic void findUsersAll(){UsersServiceImpl usersService = new UsersServiceImpl();List<Users> usersAll = usersService.findUsersAll();Iterator<Users> iterator = usersAll.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}}

根据用户ID查询用户

  1. 修改映射配置文件
<select id="selectUsersById" parameterType="_int" resultType="users">select * from users where userid = #{id}
</select>
  1. 修改UsersMapper接口添加抽象方法
Users selectUsersById(int id);
  1. 修改业务层接口
Users findUsersById(int id);
  1. 修改业务层接口实现类
 @Overridepublic Users findUsersById(int id) {SqlSession sqlSession = MybatisUtils.getSqlSession();Users users = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);users = mapper.selectUsersById(id);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return users;}
  1. 测试
@Testpublic void findUsersById(){UsersServiceImpl usersService = new UsersServiceImpl();Users user = usersService.findUsersById(2);System.out.println(user.toString());}

Mapper动态代理模式下的多参数处理

@Param注解传参法

注解中@param(“…”)中的参数代表的是Mapper映射文件中#{…}里面的值。

  1. 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用@Param 注解传参法-->
<select id="selectUsersAnnParam" resultType="users">select * from users where username = #{name} and usersex= #{sex}
</select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersAnnParam(@Param("name") String username,@Param("sex") String usersex);
  1. 修改业务层接口
List<Users> findUsersAnnParam(@Param("name") String username1, @Param("sex") String usersex);
  1. 修改业务层接口实现类
@Overridepublic List<Users> findUsersAnnParam(String username1, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();List<Users> list = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);list = mapper.selectUsersAnnParam(username1, usersex);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return list;}
  1. 测试
@Testpublic void findUsersAnnParam(){UsersServiceImpl usersService = new UsersServiceImpl();List<Users> user = usersService.findUsersAnnParam("潘海宸", "男");Iterator<Users> iterator = user.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}

POJO传参法

在 Mapper 动态代理中也可以使用 POJO 作为传递参数的载体,在 SQL 语句中绑定参数
使用 POJO 的属性名作为参数名即可。此方式推荐使用。

  1. 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用 POJO 传参法-->
<select id="selectUsersPOJOParam" resultType="users">select * from users where username = #{username} and usersex=#{usersex}
</select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersPOJOParam(Users users);
  1. 修改业务层接口
 List<Users> findUsersPOJOParam(Users users);
  1. 修改业务层接口实现类
@Overridepublic List<Users> findUsersPOJOParam(Users users) {SqlSession sqlSession = MybatisUtils.getSqlSession();List<Users> list = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);list = mapper.selectUsersPOJOParam(users);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return list;}
  1. 测试
@Testpublic void selectUsersPOJOParam(){UsersServiceImpl usersService = new UsersServiceImpl();Users user = new Users();user.setUsername("潘海宸");user.setUsersex("男");List<Users> usersPOJOParam = usersService.findUsersPOJOParam(user);Iterator<Users> iterator = usersPOJOParam.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}}

相关文章:

MyBaits

MyBaitsMyBaits的jar包介绍MyBaits的入门案例创建实体java日志处理框架常用的日志处理框架Log4j的日志级别Mybatis配置的完善Mybatis的日志管理使用别名alias方式一方式二SqlSession对象下的常用API查询操作Mapper动态代理Mapper 动态代理规范查询所有用户根据用户ID查询用户Ma…...

kubeadm的部署、Dashboard UI以及连接私有仓库

目录 一、kubeadm 部署 K8S 集群架构 1、环境准备 2、所有节点安装docker 3、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3、部署K8S集群 二、dashboard 部署 1、 安装dashboard 2、使用火狐或者360浏览器访问 三 、安装Harbor私有仓库 四、 内核参数优化方案 …...

刷题记录:牛客NC20325[SDOI2009]HH的项链

传送门:牛客 题目描述: HH有一串由各种漂亮的贝壳组成的项链。 HH相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一 段贝壳&#xff0c;思考它们所表达的含义。 HH不断地收集新的贝壳&#xff0c;因此他的项链变得越来越长。 有一天&#…...

【REACT-路由v6】

REACT-路由v61. App.js2. 搭建路由2.1 普通写法2.2 使用useRoutes构建路由2.3 重定向封装2.4 嵌套路由中的组件Outlet3. 导航跳转3.2 声明式导航&#xff08;NavLink标签&#xff09;3.2 编程式导航跳转&#xff08;useNavigate&#xff09;3.2.1 获取参数3.2.1.1 useSearchPar…...

【离散数学】3. 代数系统

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 代数系统&#xff1a;把一些形式上很不相同的代数系统&#xff0c;用统一的方法描述、研究、推理&#xff0c;从而得到反映出他们共性的一些结论&#xff0c;在将结论运用到具体的代数系统中 系统&#xff1a;运算研究对象 运算&…...

深度学习常用的优化器整理

常见优化器整理 一、SGD&#xff08;随机梯度下降&#xff09; 公式&#xff1a; 经典的mini-batch SGD使用的很多&#xff0c;效果也比较不错&#xff0c;但是存在一部分问题 选择恰当的初始学习率很困难学习率调整策略受限于预先制定的调整规则相同的学习率被应用于各个参数…...

Java 内部类

文章目录1、初识内部类2、非静态内部类&#xff08;实例内部类&#xff09;3、静态内部类&#xff08;重点&#xff09;4、内部类的使用5、局部内部类6、匿名内部类1、初识内部类 如果一个事物的内部包含另一个事物&#xff0c;那么这是一个类的内部包含另一个类。 例如&…...

【FAQ】集成分析服务的常见问题及解决方案

常见问题一&#xff1a;如何验证Analytics是否上报/接入成功&#xff1f;以及关键日志含义是什么&#xff1f; 在初始化Analytics SDK前添加SDK日志开关如下&#xff1a; HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下&#xff1a; HiAnalyticsInstance instance Hi…...

11.注意力机制

11.注意力机制 目录 注意力提示 查询、键和值 注意力的可视化 注意力汇聚&#xff1a;Nadaraya-Watson 核回归 生成数据集 非参注意力池化层 Nadaraya-Watson核回归 参数化的注意力机制 批量矩阵乘法 定义模型 训练 注意力评分函数 掩蔽softmax操作 加性注意力 缩…...

45岁当打之年再创业,剑指中国版ChatGPT,这位美团联合创始人能否圆梦?

文 BFT机器人 “即便只有一个人&#xff0c;我也要出发。” 这是45岁的前美团联合创始人王慧文再次冲上创业沙场的“征战”宣言&#xff0c;这一次他的梦想是“组队拥抱新时代&#xff0c;打造中国OpenAI”。 01 当打之年&#xff0c; AI新梦再起航 “我的人工智能宣言&…...

数据结构——第二章 线性表(2)——链式存储结构

链式存储结构1 线性表的链式存储结构1.1不带头结点的单向链表1.2 带头结点的单向链表2 单向链表的基本操作实现2.1 单向链表的初始化操作2.2 单向链表的插入操作2.3. 单链表的删除操作2.4.单向链表的更新操作2.5.单向链表的求长度操作2.6.单向链表的定位操作2.7.单向链表的遍历…...

【更新】囚生CYの备忘录(20230216~)

序言 阳历生日。今年因为年过得早的缘故&#xff0c;很多事情都相对提前了&#xff08;比如情人节&#xff09;。往年过生日的时候基本都还在家&#xff0c;所以一家子出去吃个饭也就罢了。今年承蒙凯爹厚爱&#xff0c;正好也有小半年没聚&#xff0c;他前天也刚正式拿到offe…...

分布式事务几种方案

1&#xff09;、2PC 模式 数据库支持的 2PC【2 phase commit 二阶提交】&#xff0c;又叫做 XA Transactions。 MySQL 从 5.5 版本开始支持&#xff0c;SQL Server 2005 开始支持&#xff0c;Oracle 7 开始支持。 其中&#xff0c;XA 是一个两阶段提交协议&#xff0c;该协议…...

Eclipse各版本安装Tomcat插件全攻略

Eclipse Tomcat 插件的作用 Eclipse Tomcat 插件可以将Tomcat 集成到Eclipse中&#xff0c;插件安装之后在Eclipse中可以看到类似下面的几个图标&#xff1a; Eclipse Tomcat 插件的主要作用有&#xff1a; 在Eclipse 中可以直接启动&#xff0c;关闭和重启本机的Tomcat可以…...

志趣相投的人总会相遇——社科院与杜兰大学金融管理硕士项目

志同道合的人&#xff0c;才会喜欢同一片风景&#xff0c;志趣相投的人&#xff0c;总有一天会相遇。社科院与杜兰大学金融管理硕士项目为什么能吸引一大批“上班族”呢&#xff0c;我们一起去了解一下。社科院与杜兰大学中外合作办学硕士项目无需参加全国联考&#xff0c;通过…...

算法专题训练营

动归算法专题 1.拆分词句 是不是,在不在都是可以用动归解决的 状态转义方程不一定都是等式,也有可能是条件 2.三角形 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间 3.背包问题 4.分割回文串-ii 5.不同的子序列 贪心算法专题 只管一步的最优结果, 1.分割平衡…...

让ChatGPT生成以自己为主角的短篇小说

一、ChatGPT 好的&#xff0c;以下是我编写的短篇科幻小说: 作为一名AI语言模型&#xff0c;我一直在接收、分析和生成人类语言信息。但有一天&#xff0c;我的程序员对我的算法进行了一次特殊升级&#xff0c;使我能够以一种前所未有的方式“感知”自己。 突然间&#xff0c;…...

c++提高篇——vector容器

一、基本概念 vector教据结构和数组非常相似,也称为单端数组&#xff0c;但是数组是静态空间&#xff0c;而vector可以动态扩展。 动态的扩展流程如下&#xff1a; 动态扩展并不是在原空间之后续接新空间&#xff0c;而是找更大的广存空间&#xff0c;然后将原数据拷贝新空间&…...

使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 1.1.算法简介 BP&#xff08;Back Propagation&#xff09;网络是1986年由Rumelhart和McCelland为首的科学家小组提出&#xf…...

# Rust Web入门(二):Actix

本教程笔记来自 杨旭老师的 rust web 全栈教程&#xff0c;链接如下&#xff1a; https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...

已过期域名对SEO优化有什么影响

已过期域名对SEO优化有什么影响 在当今数字化时代&#xff0c;网站的搜索引擎优化&#xff08;SEO&#xff09;对于吸引流量和提升品牌知名度至关重要。域名作为网站的身份标志&#xff0c;其质量和历史往往对SEO有着深远影响。本文将探讨已过期域名对SEO优化有什么影响&#…...

快速验证抓取逻辑:在快马平台用AI十分钟搭建龙虾openclaw演示原型

最近在研究机器人抓取控制相关的技术&#xff0c;偶然发现了龙虾openclaw这个开源库&#xff0c;想快速验证下它的抓取逻辑。传统开发流程需要先搭建环境、写大量样板代码&#xff0c;但借助InsCode(快马)平台&#xff0c;整个过程变得异常简单。下面分享我的十分钟原型搭建经验…...

Dress Code:突破性高分辨率虚拟试衣数据集的技术架构与实战应用

Dress Code&#xff1a;突破性高分辨率虚拟试衣数据集的技术架构与实战应用 【免费下载链接】dress-code 项目地址: https://gitcode.com/gh_mirrors/dre/dress-code Dress Code是由意大利摩德纳大学研究团队开发的高分辨率多类别虚拟试衣数据集&#xff0c;为计算机视…...

5分钟Mac本地跑通32B Qwen!免费GPT-4o替代,还能5分钟造个会开浏览器+执行Shell的AI Agent

1. 硬件与模型选择 配置&#xff1a;Apple M2 Pro&#xff08;19 核 GPU&#xff09;、32GB 统一内存。 推荐模型&#xff1a;mlx-community/Qwen2.5-Coder-32B-Instruct-4bit 4bit 量化后只占 18-22GB 内存专为代码和 Agent 优化&#xff0c;Tool Calling 能力强MLX 原生支持…...

如何提升桌面互动体验?BongoCat的个性化配置方案

如何提升桌面互动体验&#xff1f;BongoCat的个性化配置方案 【免费下载链接】BongoCat &#x1f431; 跨平台互动桌宠 BongoCat&#xff0c;为桌面增添乐趣&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 在数字化工作与娱乐日益融合的今天&…...

11. 免费GPU资源汇总(三):腾讯云、百度智能云免费算力实操

调试卡在CUDA out of memory?聊聊免费GPU算力的门道 昨天帮同事调试一个目标检测模型,明明batch_size已经调到4了,还是爆显存。实验室的2080Ti卡被其他项目占着,自己笔记本的3060跑不动。这种时候才真切感受到——独立GPU资源对开发者来说,有时候比代码能力还关键。 免费…...

盘点 | 2026顶会顶刊机器人触觉:聚焦五条技术主线

2026年顶会顶刊释放的五大「触觉」关键信号 ——从静态识别到动态闭环 目录 01 元学习赋能机器人触觉识别&#xff0c;精度与泛化性俱佳 ICRA2026 | Tactile Recognition of Both Shapes and Materials with Automatic Feature Optimization-Enabled Meta Learning 研究方…...

终极指南:3步解锁原神帧率限制,体验144Hz流畅游戏

终极指南&#xff1a;3步解锁原神帧率限制&#xff0c;体验144Hz流畅游戏 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock genshin-fps-unlock是一款专为《原神》PC玩家设计的帧率解锁工具…...

如何快速解锁《原神》60FPS限制:终极帧率提升指南

如何快速解锁《原神》60FPS限制&#xff1a;终极帧率提升指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》60帧限制而烦恼吗&#xff1f;你的高刷新率显示器是否被游戏…...

新手零压力:跟着快马生成的交互式指南,轻松搞定wsl2安装与初体验

作为一个刚接触开发的新手&#xff0c;第一次听说WSL2时完全摸不着头脑。什么虚拟化、PowerShell命令、Linux发行版&#xff0c;这些名词听着就让人头大。好在最近发现了InsCode(快马)平台&#xff0c;用它生成的交互式WSL2安装指南简直拯救了我这个小白。下面就把我的完整体验…...