day69实现MyBatis 的Mapper接口 封装SqlSession对象 mapper接口形参怎么给占位符赋值

一  创建项目的准备工作


            1 添加jar包
                    MySql.jar .MyBatis.jar
            2  在src中配置MyBatis.xml文件

二  封装SqlSession对象


        1  SqlSessionFactoryBuilder  生命周期
           这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需 要存在了。 因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量)。
        2 SqlSessionFactory
          一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。
        3 SqlSession
          每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围

 和DButil工具类的创建一样,实现对sqlSession连接对象的封装

package com.xja.util;import com.mysql.cj.Session;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;public class SqlSessionUtil {private SqlSessionUtil(){}private static SqlSessionFactory sqlSessionFactory;static{try(InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");) {sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (Exception e) {e.printStackTrace();}}private static  ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();public  static SqlSession getSqlSession(){SqlSession session = threadLocal.get();if (session == null){session = sqlSessionFactory.openSession();threadLocal.set(session);}return session;}public static void closeSqlSession(){try {SqlSession sqlSession = threadLocal.get();if (sqlSession != null){sqlSession.close();}} finally {threadLocal.remove();}}public static void commitSqlSession(){SqlSession sqlSession = threadLocal.get();sqlSession.commit();}public static void rollbackSqlSession(){SqlSession sqlSession = threadLocal.get();sqlSession.rollback();}public static <T>T getMapper(Class<T> type){T mapper = getSqlSession().getMapper(type);return mapper;}}


三 创建数据表及实体类
       Emp 表  ,实现类Emp实体类(编号,姓名,职位,工资)

 四  创建Mapper接口及Mapper映射xml文档
       

        1  com.xja.mapper
        2 Mapper.xml中命名空间与mapper接口同名(包名.接口名)
        3 在mybatis.xml中注册mapper.xml文档
        4 测试类:
                通过sqlSession.getMapper(XXXMapper.class) :返回对应的Mapper接口对象
                通过mapper对象调用方法

Mapper接口

package com.xja.mapper;import com.xja.bean.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {List<Emp> getAll();Emp getEmpById(Integer id);void addEmp(Emp emp );void setSalById(@Param("sal") Double sal,@Param("empno") Integer empno);
}

 mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 命名空间 -->
<mapper namespace="com.xja.mapper.EmpMapper"><select id="getAll" resultType="com.xja.bean.Emp">select empno, ename, job, salfrom emp</select><select id="getEmpById" resultType="com.xja.bean.Emp">select empno, ename, job, salfrom empwhere empno = #{id}</select><insert id = "addEmp">insert into emp(ename,job,sal)values(#{ename},#{job},#{sal})</insert><update id ="setSalById" >update empset sal = #{sal}where empno = #{empno}</update><!--        <update id = "setEmp"   parameterType="" useGeneratedKeys="false"    >--><!--            update emp set empno = 1--><!--            where empno = #{empno}--><!--        </update>--><!--    <delete id="deleteEmp"  parameterType="" databaseId="" >--><!--        delete from emp where empno = 7132--><!--    </delete>--></mapper>


五  参数个数和类型


            1 仅有一个参数时(8种包装类或String)
                    参数名没有要求, 但mapper接口中方法的参数名必须与sql语句中#{名} 一致
            2 当参数为实体类的对象时
                    要求SQL中的#{名} 中的名必须与实体类属性名相同
            3 当参数个数多余一个时,
                    1) 参数列表默认存储到map集合中 [arg1, arg0, param1, param2]
                    在SQL语句,通过key读, 第一个值: #{arg0} 或#{param1}
                    2)把方法的参数改为map类型 : Map<String,Object>  ,把列名作为key,值作为value
                    3 )在mapper使用注解 :  @Param("名") 与#{名} 名称一致.而方法参数名没有要求
  六 : 列名与属性名不对应
        1 在SQL语句中,给列名起别名,让别名与属性名一致
        2 在mapper映射文件中使用添加标签 : resultMap的标签 ,调协列名与属性名的映射
            注意:把查询语句返回类型resultType改为resultMap

<mapper namespace="com.xja.bean.Emp">    
<resultMap id = "studentMapper" type = "com.xja.bean.Student"><id column = "stu_id" property = "stuId"></id><result column = "stu_name" property="stuName"></result><result column = "stu_sex" property="stuSex"></result><result column = "stu_age" property="stuAge"></result><result column = "stu_phone" property="stuPhone"></result><result column = "stu_address" property="stuAddress"></result></resultMap><select id="getStuByName" resultMap="studentMapper">select *from studentwhere stu_name like #{stuName}'%';</select>
</mapper>

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

九河云荣获“华为2024·亚太区年度杰出合作伙伴奖”

2024年3月26日~27日&#xff0c;以“加速智能化&#xff0c;一切皆服务”为主题的华为亚太生态伙伴大会在东莞隆重开幕&#xff0c;九河云作为专业的多云管理服务商&#xff0c;凭借多年来在云领域的赋能发展应邀出席并荣获“亚太区年度杰出伙伴奖”&#xff0c;这不仅彰显了九…

为什么要学Python?Python的优势在哪?

人生苦短&#xff0c;我用 Python 不知道从什么时候开始流行这句话 Python 是个什么神仙编程语言 为啥全世界都在鼓励孩子学 Python 简单容易上手 国内、国际的竞赛机会多&#xff0c;含金量足 Python 好就业、薪资高 下面且看详细分析 01 什么是Python / 科技编程老师…

MYSQL8.0安装、配置、启动、登入与卸载详细步骤总结

文章目录 一.下载安装包1.方式一.官网下载方式二.网盘下载 二.解压安装三.配置1.添加环境变量 三.验证安装与配置成功四.初始化MYSQL五.注册MySQL服务六.启动与停止MYSQL服务七.修改账户默认密码八.登入MySQL九.卸载MySQL补充&#xff1a;彻底粉碎删除Mysql 一.下载安装包 1.方…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

rust使用Command库调用cmd命令或者shell命令,并支持多个参数和指定文件夹目录

想要在不同的平台上运行flutter doctor命令&#xff0c;就需要知道对应的平台是windows还是linux&#xff0c;如果是windows就需要调用cmd命令&#xff0c;如果是linux平台&#xff0c;就需要调用sh命令&#xff0c;所以可以通过cfg!实现不同平台的判断&#xff0c;然后调用不同…

【python】深入探讨flask是如何预防CSRF攻击的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【C++杂货铺】内管管理

目录 &#x1f308;前言&#x1f308; &#x1f4c1; C/C中内存分布 &#x1f4c1; new 和 delete的使用 &#x1f4c1; new 和 delete的优点 &#x1f4c1; new 和 delete的原理 &#x1f4c2; operator new 和 operator delete函数 &#x1f4c2; 内置类型 &#x1f4c2…

对iOS的内存存储的一些理解

最近写项目的时候遇到了一些内存上的问题&#xff08;比如内存泄漏等等&#xff09;&#xff0c;通过网上的方法解决后&#xff0c;好奇iOS的数据是如何存储的&#xff0c;特记于此。 一、iOS的内存区域 iOS 中应用程序使用的计算机内存不是统一分配空间&#xff0c;运行代码使…

Javascript — 异步方法与异常捕获问题

问题&#xff1a;try catch为什么不能捕获未被 await 修饰的异步方法异常 async function throwError() {throw new Error("自定义Error&#xff01;") }let testOne async () > {console.debug("start testOne")try {throwError()} catch (e) {conso…

【问题分析】InputDispatcher无焦点窗口ANR问题【Android 14】

1 问题描述 Monkey跑出的无焦点窗口的ANR问题。 特点&#xff1a; 1&#xff09;、上层WMS有焦点窗口&#xff0c;为Launcher。 2&#xff09;、native层InputDispacher无焦点窗口&#xff0c;上层为”recents_animation_input_consumer“请求了焦点&#xff0c;但是”rece…

大话设计模式之简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;属于工厂模式的一种。在简单工厂模式中&#xff0c;有一个工厂类负责根据输入参数的不同来创建不同类的实例。 简单工厂模式包含以下几个要素&#xff1a; 1. **工厂类&#xff0…

太阳能发电园区3D可视化:揭秘绿色能源新纪元

在科技飞速发展的今天&#xff0c;绿色能源已成为推动社会进步的重要力量。太阳能发电作为绿色能源的重要代表&#xff0c;正在全球范围内掀起一股清洁能源的革命浪潮。 太阳能发电园区作为集中展示太阳能发电技术和应用的场所&#xff0c;其规模之大、设备之复杂&#xff0c;常…

ClickHouse03-小白如何快速搭建ClickHouse集群

普通测试通常使用ClickHouse单节点就可以了&#xff0c;但是生产环境不免需要考虑多活、负载等高可用问题&#xff0c;集群就成了基础需求 ClickHouse在集群的选择上&#xff0c;作者已知的有两种&#xff1a; 使用ZooKeeper作为节点协调的组件&#xff0c;使用ClickHouse-Kee…

算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个整数数组 nums&#xff0c;其中 nums[i] 表示第 i 天的预约时间长度。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是数组…

201基于matlab的成绩管理系统

基于matlab的成绩管理系统。自带的GUI界面设计了一个成绩管理界面&#xff0c;可进行成绩的载入、查询、绘图、求平均分。可更改自己的数据进行录入。包含作业文档。程序已调通&#xff0c;可直接运行。 201 matlab 成绩管理系统 GUI - 小红书 (xiaohongshu.com)

C语言函数的定义、声明、调用与返回

在C语言中&#xff0c;函数是一种模块化和结构化的编程方式&#xff0c;用于封装特定的功能和逻辑。通过函数&#xff0c;可以将程序分解成多个小的模块&#xff0c;使得程序结构更清晰、易于理解和维护。本文将深入介绍C语言中函数的定义、声明、调用与返回&#xff0c;以帮助…

git的使用日常习惯规范与一些特殊操作

git的使用日常习惯规范与一些特殊操作 操作习惯规范创建本地新分支&#xff0c;推送新分支到云端仓库1.创建一个本地的login分支2.创建新分支后切换到新分支3.推送新分支到云端 git的特殊操作撤回commit&#xff08;取消提交到本地版本库的动作&#xff0c;本地工作区写的代码不…

基于单片机锂电池电量检测数码管显示系统设计

**单片机设计介绍&#xff0c;基于单片机锂电池电量检测数码管显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机锂电池电量检测数码管显示系统设计的主要目标是实时、准确地检测锂电池的电量&#xff0c;并…

uniapp中安装vant2

1.uniapp项目搭建 因为是安装vant2所以项目选择vue2&#xff0c;如果vue3项目的话安装vant3 2.安装vant npm i vantlatest-v2 3.在main.js文件引入挂载vant 说明&#xff1a;// #ifndef VUE3这里是vue2模板用来挂载注册组件的地方&#xff1b;// #ifdef VUE3这里是vue3模板…

数据结构学习——链表面试题

1. 删除链表中等于给定值 val 的所有结点。 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* prevNULL;struct ListNode* curhead;while(cur){if(cur-&…