2.Mybatics_映射器与参数

文章目录

  • 映射器与参数
    • 一.XML映射器
      • 1.创建工具类
      • 2.SQL语句操作:
      • 3.模糊查询
      • 4.返回多个聚合函数的结果
      • 5.返回分组后的结果
    • 二.不同个数参数的处理
      • 1.单个参数
      • 2.对象参数
      • 3.多个参数
      • 4.传入一个map类型的参数
      • 5.添加注册方法引出service层概念

映射器与参数

一.XML映射器

1.创建工具类

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。更多参考

我们希望每个线程访问是各自线程中的sqlsession,这时可以考虑使用线程中的ThreadLocal来实现,常用方法有:

  • set(value): 线程中放值
  • get():取线程中的值
public class MybatisUtil {private static final SqlSessionFactory sessionFactory;//线程容器private static final ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>();static {InputStream inputStream = null;try {//       从资源中获取名为 "mybatis-config.xml" 的文件的输入流(InputStream)inputStream = Resources.getResourceAsStream("mybatis-config.xml");//      使用SqlSessionFactoryBuilder类构建实例sqlSessionFactory(用来创建SqlSessio对象)sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession getSession() {SqlSession sqlSession = t1.get();if (sqlSession == null) {sqlSession = sessionFactory.openSession();}return sqlSession;}public static void closeSession() {SqlSession sqlSession = t1.get();if (sqlSession != null) {sqlSession.close();}t1.set(null);}
}

测试工具类:

@Beforepublic void setUp() throws Exception {inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//      使用SqlSessionFactoryBuilder类构建实例sqlSessionFactory(用来创建SqlSessio对象)sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        使用工具类MybatisUtil生成SqlSession对象SqlSession = MybatisUtil.getSession();
//getMapper() 方法会返回一个实现了 EmployeeDaoMapper 接口的动态代理对象,
// 可以直接调用接口中定义的方法来执行数据库操作。employeeDaoMapper = SqlSession.getMapper(EmployeeDaoMapper.class);}@Afterpublic void tearDown() throws Exception {//提交事务,数据同步SqlSession.commit();//释放资源inputStream.close();SqlSession.close();}
    <!--"queryById"是接口中调用的方法名deptResultMap表示返回的结果集--><select id="queryById" resultMap="deptResultMap">select e.emp_id,emp_name,age,sex,e.dept_id,d.dept_id,d.dept_name,d.remarkfrom dept dleft join employee e on e.dept_id = d.dept_idwhere d.dept_id = #{id}</select>
<!--
单个参数id查询, #{参数}
-->

告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

 // 近似的 JDBC 代码,非 MyBatis 代码...String selectPerson = "SELECT  id,dept_name as deptName,remark FROM DEPT WHERE ID=?";//?占位符,类似Mybatics中的#{id}PreparedStatement ps = conn.prepareStatement(selectPerson);ps.setInt(1,id);

2.SQL语句操作:

//add接口的方法名,    deptId与实体类Dept中的属性|变量名一致
<insert id="add">insert into deptvalues (#{deptId}, #{deptName}, #{remark})</insert>

更新和删除语句类似

3.模糊查询

默认情况下,使用 #{}参数语法时,MyBatis 会创建 PreparedStatement参数占位符,并通过占位符安全地设置参数(就像使用 JDBC的? 一样)

  1. sql语句的LIKE关键字,搭配%通配符

        <select id="queryNameAge">select emp_name, agefrom employeewhere emp_name like concat('%', #{arg0}, '%')  //concat()字符串拼接and age = #{arg1}</select>
    
  2. SQL 语句中直接插入一个不转义的字符串,使用${}

    //parameterType传递参数数据类型     
    <select id="queryByNameLike" parameterType="string" resultType="dept">select id, dept_name as deptName, remarkfrom deptwhere dept_name like ${deptName}</select>
    

4.返回多个聚合函数的结果

  <!--    统计人数和薪水最大值--><select id="queryCountAndMaxSal" resultType="map">select count(*) as count, max(salary) as maxsarlaryfrom employee</select>
<!-- 接口中 ->
Map<String, Object> queryCountAndMaxSal();

5.返回分组后的结果

接口中:

List<Map<String, Object>> queryCountDeptMinSarlary();

    <select id="queryCountDeptMinSarlary">select dept_id as deptId, min(salary) as minsarlaryfrom employeewhere dept_id is not nullgroup by dept_id;</select>
<!--测试类中->List<Map<String, Object>> maps = employeeDaoMapper.queryCountDeptMinSarlary();for (Map<String, Object> map : maps) {//deptId相当于集合的索引System.out.println(map.get("deptId"));System.out.println(map.get("minsarlary"));}

二.不同个数参数的处理

1.单个参数

#{随意命名}, 参数类型(parameterType)会被自动设置

2.对象参数

#{实体类属性变量名一致}

  <!--deptId...与实体类属性变量名一致-->  <insert id="add">insert into deptvalues (#{deptId}, #{deptName}, #{remark})</insert>

3.多个参数

默认为两类:

  • arg0、arg1、…… argX
  • param1、param1、…… paramX
//处理方式1:arg0、arg1...或param0、param1....
<select id="queryNameAge">select emp_name, agefrom employeewhere emp_name like concat('%', #{arg0}, '%')and age = #{arg1}</select>

Mapper的接口中:

//方式2:
//或@Param标注形参,emp_name与xml中的参数一致
//上面方式的param0可以继续使用,而arg0不能正常使用
List<Map<String, Object>> queryNameAge(@Param("emp_name") String name, @Param("age") int age);
//使用@Param标注,不然报错Cause: org.apache.ibatis.binding.BindingException: Parameter 'empName' not found. Available parameters are [arg1, arg0, param1, param2]

4.传入一个map类型的参数

如果在查询时有多个条件,那么我们可以把多个条件放在一个map中来作为参数传递进来

     <select id="queryByMap" resultType="employee">select emp_name, phone, address, salary from employee where emp_name = #{empName} or phone= #{phone}</select>
<!--#{}中的内容是测试时传进来的map的key值-->
<!--或者通过封装一个实体类把参数放进去,命名dto包->

5.添加注册方法引出service层概念

用户在注册时要先判断是否添加过,如果添加过则提示账号已经存在

DAO层:负责访问数据库进行数据的操作,取得结果集之后将结果集中的数据取出封装到VO类对象之后返回给service层。

DAO只完成基本的增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。

service层:主要负责一些业务处理,比如多个操作需要放在一个事务中进行管理,事务回滚,一些复杂的逻辑业务处理就放到service层。

Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性。

行数据的操作,取得结果集之后将结果集中的数据取出封装到VO类对象之后返回给service层。

DAO只完成基本的增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。

service层:主要负责一些业务处理,比如多个操作需要放在一个事务中进行管理,事务回滚,一些复杂的逻辑业务处理就放到service层。

Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android系统层屏蔽弹出停止运行对话框

项目场景&#xff1a; 车载项目&#xff0c;ATC8257-Android9.0系统平台&#xff0c;福田汽车P3系列项目 项目使用高德公版地图前提是无法获得任何高德定制服务&#xff0c;每次刷完机去切换语言系统会弹出"高德地图已停止运行"弹窗&#xff0c;严重影响用户使用体…

【第三版 系统集成项目管理工程师】第6章 数据工程

持续更新。。。。。。。。。。。。。。。 【第三版】第六章 数据工程 6.1数据采集和预处理6.1.1 数据采集 P2346.1.2 数据预处理6.1.3 数据预处理方法1.缺失数据的预处理-P2352.异常数据的预处理-P2363.不一致数据的预处理-P2364.重复数据的预处理-P2365.格式不符数据的预处理…

面经总结dd

java基础: 为什么重写hashcode和equals? hash码由对象的内存地址或者对象的属性计算而出,可以作为键值对的键例如hashmap中的key通过hashcode高低位异或计算比如在hashmap中,hashcode是确定桶的位置,然后通过equals()方法找到正确的对象,即认为不同的对象有着相同的桶(…

Perl 循环

Perl 循环 Perl 是一种功能强大的编程语言,广泛用于文本处理、系统管理、网络编程等领域。在 Perl 中,循环是控制程序流程的关键组成部分,它允许我们重复执行代码块,直到满足特定的条件。本文将详细介绍 Perl 中的各种循环结构,包括 for 循环、while 循环、until 循环、f…

uniApp 封装VUEX

Vuex Store (index.js) import Vue from vue; import Vuex from vuex; import Cookies from js-cookie;Vue.use(Vuex);const saveStateKeys [vuex_user, vuex_token, vuex_demo];const initialState {vuex_user: { name: 用户信息 },vuex_token: Cookies.get(token) || ,vue…

UE5 03-物体碰撞检测

在你需要碰撞的物体上添加一个碰撞检测组件 碰撞预设 设置为NoCollision,这样移动过程中就不会有物理碰撞阻挡效果,只负责检测是否碰撞,比较难解释,如果学过Unity的话,可以把它理解成 Collision 为 Trigger

My sql 安装,环境搭建

以下以MySQL 8.0.36为例。 一、下载软件 1.下载地址官网&#xff1a;https://www.mysql.com 2. 打开官网&#xff0c;点击DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4.点击Archives选择合适版本 5.选择后下载第二个…

密码学复习

目录 基础 欧拉函数 欧拉函数φ(n)定义 计算方法的技巧 当a=a_1*a_2*……*a_n时 欧拉定理 剩余系 一些超简单密码 维吉尼亚 密钥fox 凯撒(直接偏移) 凯特巴氏(颠倒字母表) 摩斯密码(字母对应电荷线) 希尔(hill)密码 一些攻击 RSA 求uf+vg=1 快速幂模m^…

Python | Leetcode Python题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution:def rob(self, nums: List[int]) -> int:def robRange(start: int, end: int) -> int:first nums[start]second max(nums[start], nums[start 1])for i in range(start 2, end 1):first, second second, max(fi…

Bootstrap 图片

Bootstrap 图片 Bootstrap 是一个流行的前端框架,它提供了一套丰富的工具和组件,用于快速开发响应式和移动优先的网页。在本文中,我们将探讨如何使用 Bootstrap 来处理和展示图片,包括图片的响应式设计、图片样式和图片布局。 响应式图片 Bootstrap 通过其栅格系统提供了…

人工智能在物流领域的应用,智慧物流大有可为!

物流是复合型服务产业&#xff0c;作为经济的重要组成部分&#xff0c;受到人工智能技术的深刻影响。物流行业的人工智能应用也将助推人工智能技术的发展&#xff0c;人工智能技术应用于物流行业&#xff0c;应用领域包括以下方向&#xff1a; 第一、车货匹配系统 使用人工智…

CSS弹性布局:打造响应式与灵活的网页设计

一、弹性布局是什么&#xff1f; 弹性布局&#xff08;Flexbox&#xff09;是一种CSS布局模型&#xff0c;它提供了一种更加高效的方式来对容器中的项目进行布局、对齐和分配空间。与传统的布局方式相比&#xff0c;Flexbox旨在提供一个更加灵活的方式来布局复杂的网页结构&am…

AI智能音箱用2×15W立体声功放芯片NTP8918

智能音箱是近年来非常受欢迎的智能家居产品之一&#xff0c;它集成了人工智能技术和音频技术&#xff0c;能够为用户提供语音助手、音乐播放、智能家居控制等多种功能。其中&#xff0c;音频输出是智能音箱的核心功能之一&#xff0c;而功放芯片则是实现音频放大的关键组成部分…

00 如何根据规律在变化中求发展?

你好&#xff0c;我是周大壮。目前&#xff0c;我已在搜索推荐等算法技术领域从事研发近 10 年&#xff0c;做过诸多流量分发领域的算法技术工作。 如今任公司同城的算法架构师、技术委员会人工智能分会委员、公司本地服务事业群算法策略部负责人&#xff0c;我主要负责公司集…

计算机网络之局域网

目录 1.局域网的基本概念 2.LAN的特性 3.局域网特点 4.拓扑结构 5.传输媒体的选择 6.传输媒体 7.传输技术 8.传输技术距离问题 9.LAN的逻辑结构 10.局域网工作原理 上篇文章内容&#xff1a;OSI七层体系结构 1.局域网的基本概念 局域网 是将分散在有限地 理范围内&…

51单片机定时器/计数器

欢迎入群共同学习交流 时间记录&#xff1a;2024/7/3 一、电路原理图 51单片机具有两个定时器T0、T1 二、知识点介绍 1、寄存器介绍 &#xff08;1&#xff09;TMOD方式寄存器 T0为例介绍&#xff1a; 工作方式选择位M1、M0 常用方式为方式1、方式2&#xff0c;方式2低…

【按键精灵】#1找图、找色、移动和点击

关键字&#xff1a; 找图、找色、移动和点击 找图&#xff1a; 抓抓截图&#xff0c;添加到附件 FindPic 0,0,1024,768,"Attachment:\Xmind.bmp",0.9,intX,intYIf intX > 0 And intY > 0 Then TracePrint "找到了" //找到打印Else TracePri…

深入解析Dubbo架构层次

什么是Dubbo&#xff1f; Dubbo是阿里巴巴开源的一款高性能优秀的服务框架&#xff0c;致力于提供高性能和透明化的 RPC 远程服务调用方案&#xff0c;以及 SOA 服务治理方案。它的主要功能包括&#xff1a; 远程通信&#xff1a;提供高效的远程通信能力。负载均衡&#xff1…

Python | Leetcode Python题解之第214题最短回文串

题目&#xff1a; 题解&#xff1a; class Solution:def shortestPalindrome(self, s: str) -> str:n len(s)fail [-1] * nfor i in range(1, n):j fail[i - 1]while j ! -1 and s[j 1] ! s[i]:j fail[j]if s[j 1] s[i]:fail[i] j 1best -1for i in range(n - 1,…

js内置对象——Date

js为我们封装了处理时间的内置对象——Date&#xff0c;我们使用它提供的一些方法&#xff0c;便于我们操作时间,下面我们来看一下这些API &#xff01;&#xff01; 1、new Date() new Date() 用于创建一个时间对象 // 默认为当前时间 var d new Date();// 指定时间 日期的格…