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

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>

相关文章:

  • Knative 助力 XTransfer 加速应用云原生 Serverless 化
  • OpenCV的图像颜色空间转换、缩放、裁剪与旋转
  • 葵花卫星影像应用场景及数据获取
  • 机器学习优化算法(深度学习)
  • AI短视频制作一本通:文本生成视频、图片生成视频、视频生成视频
  • 十一、Spring源码学习之registerListeners方法
  • 2024华为软件精英挑战赛记录
  • consul集群部署三server一client
  • macOS Sonoma如何查看隐藏文件
  • CMakeLists生成动态库.so和静态库.a
  • SnapGene 5 for Mac 分子生物学软件
  • 某某消消乐增加步数漏洞分析
  • LeetCode 406. 根据身高重建队列
  • STM32G473之flash存储结构汇总
  • 工业边缘计算网关在工业中的应用以及其为工业生产带来的效益-天拓四方
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2019年如何成为全栈工程师?
  • Druid 在有赞的实践
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Logstash 参考指南(目录)
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Puppeteer:浏览器控制器
  • 成为一名优秀的Developer的书单
  • 服务器之间,相同帐号,实现免密钥登录
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 以太坊客户端Geth命令参数详解
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #考研#计算机文化知识1(局域网及网络互联)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $NOIp2018$劝退记
  • (007)XHTML文档之标题——h1~h6
  • (07)Hive——窗口函数详解
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (day 12)JavaScript学习笔记(数组3)
  • (二十四)Flask之flask-session组件
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net MVC4 上传大文件,并保存表单
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net 高效开发之不可错过的实用工具
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @staticmethod和@classmethod的作用与区别
  • []sim300 GPRS数据收发程序
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Asp.net MVC]Bundle合并,压缩js、css文件