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 mapper
        PUBLIC "-//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, sal
        from emp
    </select>

    <select id="getEmpById" resultType="com.xja.bean.Emp">
        select empno, ename, job, sal
        from emp
        where empno = #{id}
    </select>

    <insert id = "addEmp">
        insert into emp(ename,job,sal)
        values(#{ename},#{job},#{sal})
    </insert>

    <update id ="setSalById" >
        update emp
        set 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 student
            where stu_name like #{stuName}'%';
    </select>
</mapper>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CY3.5-COOH热稳定性Cyanine3.5-COOH星戈瑞

CY3.5-COOH的热稳定性是评估其性能和应用的指标之一。在实际应用中&#xff0c;特别是在高温环境下&#xff0c;热稳定性决定了染料能否保持其原有的物理化学性质&#xff0c;从而确保实验结果的准确性和可靠性。 研究表明&#xff0c;CY3.5-COOH花菁染料羧基科研试剂具有较高…

“直播曝光“有哪些媒体直播分流资源?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 我们线下举办活动时&#xff0c;往往希望活动进行更大的曝光&#xff0c;随着视频直播越来越被大众认可&#xff0c;甚至成了活动的标配&#xff0c;那么做活动视频直播的时候&#xff0…

魔众众包系统——革命性的在线任务接单平台

魔众众包系统&#xff0c;一个革命性的在线任务接单平台&#xff0c;最新版本为v1.9.0&#xff0c;发布日期为2024年3月10日。这个平台不仅提供了一个高效的任务分配和管理环境&#xff0c;还通过其先进的技术架构&#xff0c;确保了系统的稳定性和可靠性。无论是对于企业还是个…

【计算机网络】第 9 问:四种信道划分介质访问控制?

目录 正文什么是信道划分介质访问控制&#xff1f;什么是多路复用技术&#xff1f;四种信道划分介质访问控制1. 频分多路复用 FDM2. 时分多路复用 TDM3. 波分多路复用 WDM4. 码分多路复用 CDM 正文 什么是信道划分介质访问控制&#xff1f; 信道划分介质访问控制&#xff08;…

数据库索引及优化

数据库索引及优化 什么是索引&#xff1f; MySQL官方对索引的定义为&#xff1a;索引&#xff08;INDEX&#xff09;是帮助MySQL高效获取数据的数据结构。 索引的本质&#xff1a; 数据结构 为什么要引入索引&#xff1f; 引入索引的目的在于提高查询效率&#xff0c;就好像是…

数据库中的约束纯干货——主键约束

目录 &#xff08;一&#xff09;特点&#xff1a; &#xff08;二&#xff09;添加主键约束 2.1格式&#xff1a; 2.2举例&#xff1a; 2.3建立表级约束&#xff1a; 2.4建立表后增加主键约束 &#xff08;三&#xff09;复合主键 3.1格式&#xff1a; 3.2举例&#…

混压板如何计算走线损耗?

在电子电路设计中&#xff0c;混压板是一种极为常见的电路板类型&#xff0c;集成了不同电压等级的电路&#xff0c;然而在走线过程中存在一定的损耗&#xff0c;这些损耗处理不当会直接影响到电路的性能和稳定性&#xff0c;本文将介绍如何计算混压板的走线损耗。 1、走线损耗…

Retelling|Facebook2

录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…

马耳他公司注册

2004年5月1日&#xff0c;马耳他正式加入欧盟&#xff0c;当地的居民完全享受欧盟居民的待遇&#xff0c;所有的申根国家通行免签证&#xff0c;自由往来&#xff1b;2008年1月1日&#xff0c;马耳他开始使用欧元&#xff0c;正式加入欧盟经济商圈。良好的居住环境、优越的地理…

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…

FSV13罗德与施瓦茨FSV13频谱分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 FSV13 是一款速度极快且多功能的信号和频谱分析仪&#xff0c;适用于从事射频系统开发、生产、安装和维修工作的注重性能、注重成本的用户。 在开发应用中&#xff0c;罗德与施瓦茨 FSV13 凭借其出色的射频特性、同类产品中无…

三数之和【双指针】

1.先来看前面的三道双指针题目 发现&#xff1a;都是一个类型&#xff01; 2.照葫芦画瓢 递增排序固定⼀个数X在这个数后面的区间&#xff0c;找到两个数的和是X的相反数 去重 代码 #include <vector> class Solution { public:vector<vector<int>> threeS…

欧拉-马斯切罗尼常数

一、说明 知道欧拉常数是什么吗&#xff1f;知道啥是调和级数吗&#xff1f;这里给出欧拉常数的来龙去脉&#xff0c;和调和级数以及ln(n)的关系。 欧拉-马斯刻若尼常数: Euler-Mascheroni Constant 二、起源 欧拉-马斯刻若尼常数是一个数学常数&#xff0c;该常数最先由瑞士数…

网络七层模型之数据链路层:理解网络通信的架构(二)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于Java二手交易系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

【Canvas与艺术】硬朗风格十二棱表表盘

【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>硬朗风格十二棱表表盘</title><style type"text/css…

每日汇评:黄金在2024年第一季度创下历史新高,接下来会发生什么?

周四&#xff0c;金价创下2236美元的历史新高&#xff0c;为2024年第一季度画上了圆满的句号&#xff1b; 在美债收益率低迷、美国经济强劲的背景下&#xff0c;金价没有受到美元走强的影响&#xff1b; 在复活节期间&#xff0c;金价有望达到2251美元&#xff1b; 黄金价格位于…

【好书推荐】企业级数据架构

前言 2017年英国《经济学人》杂志提出一个观点&#xff1a;世界上最具价值的资源不再是石油&#xff0c;而是数据。围绕数据的各种概念的提出或者理论层面的探索从未停止过&#xff0c;例如数据要素、数字经济、数字化转型以及数据资产以及定价等。不同行业的企业乃至整个社会…

直播录制视频软件推荐,提升你的直播质量!

随着直播行业的蓬勃发展&#xff0c;直播录制视频软件也日益受到广大用户的青睐。无论是为了保存精彩的游戏瞬间&#xff0c;还是为了制作专业的教程视频&#xff0c;一款好的录制软件都是必不可少的。本文将详细介绍三款主流的直播录制视频软件&#xff0c;帮助读者了解它们的…

EfficientSAM 项目排坑

EfficientSAM 项目排坑 任务过程记录创建环境运行示例 任务 跑通这个项目代码 过程记录 创建环境 readme里没有说具体怎么配置环境&#xff0c;所以可能对我来说还挺困难的。 现把项目git下来&#xff1a; git clone https://github.com/yformer/EfficientSAM.git cd Effi…