mybatis泛型DAO接口

2023-10-26

本文将记录mybatis整合spring的泛型DAO接口,通过BasicDAOImpl实现类提供CRUD功能,其他DAO只需要继承和扩展BasicDAOImpl。


BasicDao接口定义
public interface BasicDAO<T extends BasicModel> {
    T find(Long id);
    
    T update(T bean);
    
    Long insert(T bean);
    
    int delete(Long id);
}


BasicDAOImpl实现类
public class BasicDAOImpl<T extends BasicModel> implements BasicDAO<T> {
    protected Logger log = LoggerFactory.getLogger(getClass());
    
    /**
     * 预定义的Statement
     */
    protected static final String INSERT = "insert";


    protected static final String UPDATE = "update";


    protected static final String DELETE_BY_ID = "deleteById";


    protected static final String GET_BY_ID = "getById";


    protected static final String DOT = ".";


    protected Class<T> entityClass = null;
    
    @SuppressWarnings("unchecked")
    public BasicDAOImpl() {
//获取参数化类型
        entityClass = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }


    protected String getStatementPrefix() {
        return entityClass.getSimpleName() + DOT;
    }
    
    protected SqlSession getSession() {
        return SqlSessionHolder.getSession();
    }


    public T find(Long id) {
        @SuppressWarnings("unchecked")
        List<T> list = getSession().selectList(getStatementPrefix()+GET_BY_ID, id);
        if(list.isEmpty()){
            throw new QueryException("查询数据失败");
        }else{
            return list.get(0);
        }
    }


    public T update(BasicModel bean) {
        int records = getSession().update(getStatementPrefix()+UPDATE, bean);
        if (records == 0 || records == -1) {
            throw new OptLockException("This record modified by another thread before commit,please try again");
        }
        return find(bean.getId());
    }


    public Long insert(BasicModel bean) {
        getSession().insert(getStatementPrefix()+INSERT, bean);
        return bean.getId();
    }


    public int delete(Long id) {
        return getSession().delete(getStatementPrefix()+DELETE_BY_ID, id);
    }
}


数据库session工具
public class SqlSessionHolder {
    private static final Log logger = LogFactory.getLog(SqlSessionHolder.class);


    private static ThreadLocal<SqlSession> sessionHolder = new ThreadLocal<SqlSession>();


    private static SqlSessionFactory sqlMapper = SqlMapClientHolder.getInstance().getSqlMapper();


    public static void clearSession() {
        if (sessionHolder.get() == null) {
            return;
        }
        sessionHolder.get().close();
        sessionHolder.set(null);
        logger.debug("session close");
    }


    public static SqlSession getSession() {
        if (sessionHolder.get() == null) {
            logger.debug("initial session");
            sessionHolder.set(sqlMapper.openSession(ExecutorType.REUSE, false));
        }
        return sessionHolder.get();
    }


    public static SqlSession getSession(ExecutorType executorType) {
        if (sessionHolder.get() == null) {
            sessionHolder.set(sqlMapper.openSession(executorType, false));  
            return sessionHolder.get();
        }
        return sessionHolder.get();
    }


    public static void setSession(SqlSession sqlSession) {
        sessionHolder.set(sqlSession);
    }


    public static void commitSession() {
        if (sessionHolder.get() == null) {
            return;
        }
        sessionHolder.get().commit(true);
        sessionHolder.get().close();
        sessionHolder.set(null);
        logger.debug("session close");
    }
    public static void rollbackSession() {
        if (sessionHolder.get() == null) {
            return;
        }
        sessionHolder.get().rollback(true);
        sessionHolder.get().close();
        sessionHolder.set(null);
        logger.debug("session close");
    }
}


mapper绑定
public class SqlMapClientHolder {


    private static SqlSessionFactory sqlMapper;


    private static final Log logger = LogFactory.getLog(SqlMapClientHolder.class);


    private static SqlMapClientHolder sqlMapClientHolder = new SqlMapClientHolder();
    
    private static String environmentId = "Test";
    
    private SqlMapClientHolder() {
        if (sqlMapper == null) {
            try {
                String ibatisResource = "ibatis-config.xml";
                Reader ibatisReader = Resources.getResourceAsReader(ibatisResource);
                sqlMapper = new SqlSessionFactoryBuilder().build(ibatisReader,environmentId);
                logger.info("SqlSessionFactory built successfully.");
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(LogMessageUtil.printStack(e));
                throw new RuntimeException(e);
            }
        }
    }


    public static SqlMapClientHolder getInstance() {
        return sqlMapClientHolder;
    }


    public SqlSessionFactory getSqlMapper() {
        return sqlMapper;
    }


public void setSqlMapper(SqlSessionFactory sqlMapper) {
this.sqlMapper = sqlMapper;
}
    
public static void setEnvironmentId(String environmentId) {
        SqlMapClientHolder.environmentId = environmentId;
    }
}


Mapper文件
<?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">
<mapper namespace="uservo">


     <insert id="insert" parameterType="uservo">
         <selectKey keyProperty="id" resultType="long" order="BEFORE">
            select user_sequence.nextval from dual
         </selectKey>
         INSERT INTO USER(
         <!-- 0 --> id,
         <!-- 1 --> name,
         <!-- 2 --> age
        )
         VALUES( 
         <!-- 0 --> #{ id:NUMERIC },
         <!-- 1 --> #{ name:VARCHAR },
         <!-- 2 --> #{ age:NUMERIC }  
        )
    </insert>


     <update id="update" parameterType="uservo">
          UPDATE USER SET 
             application = #{ name:VARCHAR },
            service = #{ age:NUMERIC }
         WHERE ID = #{id} 
     </update>


     <delete id="deleteById" parameterType="long">
          DELETE FROM USER WHERE ID = #{id} 
     </delete>


     <select id="getById" parameterType="long" resultType="uservo">
         SELECT * FROM USER WHERE ID = #{id}
     </select>
</mapper>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis泛型DAO接口 的相关文章

随机推荐

  • linux-docker

    unix liunx windows linux 文件系统 所有的资源都是目录在 root 根目录下 一 指令 ip addr ifconfig cd ls vim sudo 管理员身份 代表换行输入 pwd 查看所在目录 sudo sys
  • 12306模拟登陆一直提示系统繁忙_12306买高铁火车票显示待核验怎么办,最新解决方案...

    知道有些人没耐心 先说解决核心是12306里面人脸识别 亲测有效 全文没几个字一定要看不用去车站走冤枉路啊 身份信息不能自动核验 相信吃过亏的不止我一个 网上找了很多方法不行 问客服也没用 终于自己找到一个方法 相继解决了我妈和我朋友的待核
  • Maven项目中properties文件的加载方式

    Maven项目中 读取properties配置文件 1 properties文件在src main java的根目录中时加载文件使用 PropertyConfigurator configure log4j properties 2 pro
  • FFmpeg进阶: 音频滤镜大全

    在做音频处理模块的时候 为了对声音进行优化处理 我很多时候会使用各种算法对音频进行变换 效果包括变音变调 声音降噪等等 其实FFmpeg库里的滤镜模块包含了很多有用的音频滤镜算法 这对于提升开发效率避免重复造轮子是很有帮助的 这里翻译了一下
  • Android apk 项目一键打包并上传到蒲公英

    项目一键打包并上传到蒲公英 缘由 测试流程由 打包 找包准备上传 填写更新信息 然后上传 过于复杂 所以想要简化开发 阅读须知 需要读者了解如何在项目里面建立一个空的gradle plugin的过程 否则这篇文章不适合你 开始分析 我想要的
  • jdbc控制自动提交功能

    import java sql Connection import java sql DriverManager import java sql ResultSet import java sql SQLException import j
  • opencv-python入门学习(1)

    opencv python入门 环境安装与配置 图像入门 图片的读取 显示和保存 cv imread 读取图像 cv imshow 显示图像 cv imwrite 储存图像 视频的读取 显示和保存 从摄像机 文件中读取并显示视频 保存编辑后
  • npm安装composer-rest-server等出现错误node-pre-gyp install --fallback-to-build --library

    npm安装composer rest server等出现错误node pre gyp install fallback to build library grpc 1 10 1 install usr local lib node modu
  • 20大中国式弱点营销

    什么是弱点营销 宇宙的精灵 万物的灵长 说的是人类 但现实中 人性的弱点也不少 贪婪 恐惧 嫉妒 懒惰 好色 贪慕虚荣 难抵诱惑 害怕孤独 热爱免费 重视等级 迷信专家 崇拜名人 喜随波逐流 关于人性的一切弱点 正在被消费社会利用和营销 一
  • vector中find 的用法

    vector没有自带的find函数 需要用普通的find函数 使用如下 vector
  • CH2-Java编程基础(7个案例实现)

    案例2 1 库房出入货物程序设计 案例介绍 任务描述 现要对华为和小米两种手机产品进行入库 本案例要求编写一个模拟商品入库的程序 可以在控制台输入入库商品的数量 最后打印出仓库中所有商品详细信息以及所有商品的总库存数和库存商品总金额 商品信
  • 斗地主发牌算法JAVA

    首先定义一个卡牌类 public class Card private String numb private String color private int index public Card public Card String nu
  • 【vue】使用了 keep-alive 的 include,但是切换 router-view,页面还是会刷新

  • 二分图最大匹配与最大独立集

    一 概念部分 1 什么是二分图 通俗的说法 就是可以把图分成两部分 每一部分任意两点之间没有关系 同一部落 两部分之间点可能存在多种关系 2 怎么判断二分图 1 理论判定 如果某个图为二分图 那么它至少有两个顶点 且其所有回路的长度均为偶数
  • Ansible-基本概述

    为什么要自动化运维 纯手动软件安装部署方式 我们以 10 台机器部署 Nginx 为例 部署步骤如下 1 通过 ssh 登录一台机器 2 yum install y nginx 或者 获取安装包自行编译安装 3 配置 Nginx 4 启动
  • 微信小程序知识点GET

    1 app json中的pages用来设置小程序包含哪些页面以及页面的路径 window用来设置默认页面的窗口表现形式 tabBar用来设置小程序底部tab的表现 2 app js中的App 函数用来注册一个小程序 接受的对象参数用来指定小
  • mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法

    win10很完美 用的也很舒服 当然人无完人 也总有不尽如人意的时候 比如说我们经常用的远程mstsc 就出现了一个坑 既然出现坑了 我们就得把坑解决掉吧 下面就记录一下这个坑的解决方法 本文地址 https www cnblogs com
  • vue.js --父子组件通信

    目录 父子组件通信 父组件向子组件通信 子组件通过props接收 子组件向父组件通信 emit自定义事件 v model改造 emit传递父组件数据 emit传递单个父组件数据 emit传递多个父组件数据 总结 父子组件通信 父子组件通信
  • 线程的状态

    线程共有六种状态 初始状态 实现Runnable接口和继承Thread可以得到一个线程类 new一个实例出来 线程就进入了初始状态 2 1 就绪状态 就绪状态只是说你资格运行 调度程序没有挑选到你 你就永远是就绪状态 调用线程的start
  • mybatis泛型DAO接口

    本文将记录mybatis整合spring的泛型DAO接口 通过BasicDAOImpl实现类提供CRUD功能 其他DAO只需要继承和扩展BasicDAOImpl BasicDao接口定义 public interface BasicDAO