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连接对象的封装

java 复制代码
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接口

java 复制代码
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文件

java 复制代码
<?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>
相关推荐
Bonne journée2 分钟前
‌在Python中,print(f‘‘)是什么?
java·开发语言·python
2402_8575893623 分钟前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_8576226624 分钟前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
小懒编程日记29 分钟前
【数据结构与算法】B树
java·数据结构·b树·算法
Y_3_739 分钟前
【回溯数独】有效的数独(medium)& 解数独(hard)
java·数据结构·windows·算法·dfs·回溯
读心悦1 小时前
修改 MySQL 数据库中的唯一键
数据库·mysql
RangoLei_Lzs1 小时前
C++模版SFIANE应用踩的一个小坑
java·开发语言·ui
qq_213157891 小时前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#
北极无雪1 小时前
Spring源码学习(拓展篇):SpringMVC中的异常处理
java·开发语言·数据库·学习·spring·servlet
VXbishe1 小时前
(附源码)基于springboot的“我来找房”微信小程序的设计与实现-计算机毕设 23157
java·python·微信小程序·node.js·c#·php·课程设计