首页 > 数据库 >Java实现关系型数据库工具类JdbcUtils系列九:通用DAO

Java实现关系型数据库工具类JdbcUtils系列九:通用DAO

时间:2023-09-10 17:07:11浏览次数:57  
标签:JdbcUtils Java java DAO params sql import public conn



Java实现关系型数据库工具类JdbcUtils系列九:通用DAO

  • 一、创建对应数据库表的实体类
  • 二、数据库连接池Druid工具类
  • 三、DAO类
  • 四、BaseDAO
  • 五、DatabaseInfoDao
  • 六、通用DAO测试类


一、创建对应数据库表的实体类

数据库表结构

CREATE TABLE `databaseInfo` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `database_name` varchar(100) NOT NULL COMMENT '数据库名称',
  `table_name` varchar(100) NOT NULL COMMENT '表名',
  `table_comment` varchar(300) DEFAULT NULL COMMENT '表的描述',
  `table_rows` bigint(20) DEFAULT 0 COMMENT '表的行数',
  `column_key` varchar(100) NOT NULL COMMENT '表的主键',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_databasename_tablename` (`database_name`,`table_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='源数据库表信息';

根据表结构创建对应的实体类

import lombok.*;

import java.io.Serializable;

/**
 * <p>
 * 源数据库表信息
 * </p>
 *
 * @author fei.yang4
 * @since 2021-11-03
 */
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@ToString
@NoArgsConstructor
public class DatabaseInfo implements Serializable {

    /**
     * 数据库名称
     */
    private String databaseName;

    /**
     * 数据表全称,格式:dbName.tableName
     */
    private String tableName;

    /**
     * 表的描述
     */
    private String tableComment;

    /**
     * 表的行数
     */
    private Long tableRows;

    /**
     * 表的主键
     */
    private String tableKey;
}

二、数据库连接池Druid工具类

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.beanutils.PropertyUtils;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

public class JdbcUtils {
    private static DataSource ds = null;

    static {
        try {
            Properties props = new Properties();
            props.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
                throw new RuntimeException("读取配置文件异常", e);
        }
    }

    //Druid连接池
    public static Connection getDruidConnection() throws Exception {
        Connection conn = null;
        conn = ds.getConnection();
        return conn;
    }


    public static void release(Connection conn) throws SQLException {
        if(conn != null) conn.close();
    }


    public static void release(Connection conn, PreparedStatement ps) throws SQLException {
        if(ps!=null) ps.close();
        if(conn!=null) conn.close();
    }

    public static void release(Connection conn, PreparedStatement ps, java.sql.ResultSet rs) throws SQLException {
        if(rs!=null) rs.close();
        if(ps!=null) ps.close();
        if(conn!=null) conn.close();
    }
}

三、DAO类

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public interface DAO<T> {

    /**
     * 获取特殊值。如:最大值,总数等。
     * @param conn
     * @param sql
     * @param params
     * @return
     */
    public Object getValue(Connection conn,String sql,Object ... params) throws SQLException;

    /**
     * 查询多个对象并存入List<T>中
     * @param conn
     * @param sql
     * @param params
     * @return
     */
    public List<T> getList(Connection conn,String sql,Object ... params) throws SQLException;

    /**
     * 查询单个对象
     * @param conn
     * @param sql
     * @param params
     * @return
     */
    public T get(Connection conn,String sql,Object ... params) throws SQLException;

    /**
     * 考虑事务,通用的增删改
     * @param conn
     * @param sql
     * @param params
     * @return
     */
    public int update(Connection conn,String sql,Object ... params) throws SQLException;
}

四、BaseDAO

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public abstract class BaseDAO<T> implements DAO<T> {

    Class<T> clazz = null;

    public BaseDAO(){
        //1.获取带范型父类的类型
        Type type = this.getClass().getGenericSuperclass();

        //2.参数化类型
        ParameterizedType pt = (ParameterizedType) type;

        //3.获取真实参数
        Type[] types = pt.getActualTypeArguments();

        clazz = (Class<T>) types[0];
    }

    private QueryRunner qr = new QueryRunner();

    @Override
    public Object getValue(Connection conn, String sql, Object... params) throws SQLException {
        return qr.query(conn,sql,new ScalarHandler(),params);
    }

    @Override
    public List<T> getList(Connection conn, String sql,Object... params) throws SQLException {
        return qr.query(conn,sql,new BeanListHandler<>(clazz),params);
    }

    @Override
    public T get(Connection conn, String sql, Object... params) throws SQLException {
        return qr.query(conn,sql,new BeanHandler<>(clazz),params);
    }

    @Override
    public int update(Connection conn, String sql, Object... params) throws SQLException {
        return qr.update(conn,sql,params);
    }
}

五、DatabaseInfoDao

public class DatabaseInfoDao extends BaseDAO<DatabaseInfo> {
}

六、通用DAO测试类

import com.bigdata.plus.Entity.DatabaseInfo;
import com.bigdata.plus.Entity.DatabaseInfoDao;
import org.junit.Test;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public class DAOTest {

    @Test
    public void test1() throws SQLException, IOException, ClassNotFoundException {
        Connection conn = null;
        try{
            conn = JdbcUtils.getConnection();
            DatabaseInfoDao databaseInfoDao = new DatabaseInfoDao();
            String sql = "select t.TABLE_SCHEMA as databaseName,CONCAT_WS('.',t.TABLE_SCHEMA,t" +
                    ".TABLE_NAME)" +
                    " as " +
                    "tableName,t.TABLE_COMMENT as tableComment,t.TABLE_ROWS as tableRows,k.COLUMN_NAME as " +
                    "tableKey\n" +
                    "from INFORMATION_SCHEMA.TABLES as t\n" +
                    "inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE as k\n" +
                    "on k.TABLE_NAME=t.TABLE_NAME and CONSTRAINT_NAME = 'PRIMARY' and t.TABLE_SCHEMA=?";
            Object[] params = {"dw"};
            DatabaseInfo databaseInfo = databaseInfoDao.get(conn, sql, params);
            System.out.println(databaseInfo);
        } catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,null,null);
        }
    }


    @Test
    public void test2() throws SQLException, IOException, ClassNotFoundException {
        Connection conn = null;
        try{
            conn = JdbcUtils.getConnection();
            DatabaseInfoDao databaseInfoDao = new DatabaseInfoDao();
            String sql = "select t.TABLE_SCHEMA as databaseName,CONCAT_WS('.',t.TABLE_SCHEMA,t" +
                    ".TABLE_NAME)" +
                    " as " +
                    "tableName,t.TABLE_COMMENT as tableComment,t.TABLE_ROWS as tableRows,k.COLUMN_NAME as " +
                    "tableKey\n" +
                    "from INFORMATION_SCHEMA.TABLES as t\n" +
                    "inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE as k\n" +
                    "on k.TABLE_NAME=t.TABLE_NAME and CONSTRAINT_NAME = 'PRIMARY' and t.TABLE_SCHEMA=?";
            Object[] params = {"dw"};
            List<DatabaseInfo> list = databaseInfoDao.getList(conn, sql, params);
            for(DatabaseInfo databaseInfo : list){
                System.out.println(list);
            }
        } catch (SQLException e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,null,null);
        }
    }
}

Java实现关系型数据库工具类JdbcUtils系列九:通用DAO_通用DAO


标签:JdbcUtils,Java,java,DAO,params,sql,import,public,conn
From: https://blog.51cto.com/u_12080573/7426641

相关文章

  • 构建高性能全文搜索引擎:Java与Elasticsearch
    在今天的应用程序中,全文搜索功能变得越来越重要。无论是在线商店、博客网站还是企业应用,用户都希望快速而准确地找到他们需要的信息。Elasticsearch是一个强大的全文搜索引擎,可以轻松应对这一需求。本文将向你展示如何使用Java与Elasticsearch构建高性能的全文搜索引擎。什么是Elas......
  • 使用Nginx作为Java后端的反向代理
    什么是Nginx?Nginx是一款高性能、轻量级的开源Web服务器和反向代理服务器。它广泛用于提供Web服务、负载均衡、反向代理、HTTP缓存以及安全性增强等功能。Nginx的架构允许它处理大量并发连接,同时保持低的内存消耗。为什么使用Nginx?使用Nginx作为Java后端的反向代理有许多好处,包括:性......
  • Java应用程序中的数据库连接池优化
    什么是数据库连接池?数据库连接池是一种数据库连接的管理技术,它允许应用程序在需要时从池中获取数据库连接,而不是每次都创建新的连接。这样可以减少连接创建和销毁的开销,提高数据库访问性能。为什么需要数据库连接池?在Java应用程序中,频繁地创建和关闭数据库连接会导致性能下降,因为连......
  • 使用Java和Spring构建RESTful API
    Spring框架简介Spring是一个开源的Java应用程序框架,广泛用于构建企业级应用程序和RESTfulAPI。它提供了丰富的功能集,包括依赖注入、AOP(面向切面编程)、事务管理、Web开发和安全性等。以下是一些关键Spring模块:SpringCore:提供了核心功能,包括依赖注入和Bean管理。SpringBoot:简化了......
  • Java基础学习——字符串
    目录1String概述 2String构造方法代码实现和内存分析2.1创建方式2.2内存区1.StringTable(串池)2.直接赋值创建字符串方式内存图3.通过new创建字符串方式内存图 3字符串比较3.1“==”号比较的内容    1String概述总结:1.String是Java定义好......
  • Java版剑指offer:平衡二叉树
    Java版剑指offer:平衡二叉树描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(BalancedBinaryTree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉......
  • java版本剑指offer:链表中倒数最后k个结点
    java版本剑指offer:链表中倒数最后k个结点描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为0的链表。最简单的方式就是使用两个指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针......
  • java版本剑指offer:反转链表
    java版本剑指offer:反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}此题想考察的是:如何调整链表指针,来达到反转链表的目的。初始化:3个指针:1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向null2)cur指针指向待反转链表......
  • java剑指offer:两个链表的第一个公共结点
    java剑指offer:两个链表的第一个公共结点描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路:先假设链表A头结点与结点8的长度与链表B头结点与结点8的长度相等,那么就可以用双指针。......
  • Java版剑指offer:链表中环的入口结点
    Java版剑指offer:链表中环的入口结点描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可。而我们后台程序......