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

发布于:2024-03-29 ⋅ 阅读:(11) ⋅ 点赞:(0)

一  创建项目的准备工作


            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>

本文含有隐藏内容,请 开通VIP 后查看