Java BasicDAO的详解

简介: Java BasicDAO的详解

一、BasicDAO的介绍

二、BasicDAO的示意图

三、完成BasicDAO的简单实例

1、创建BasicDAO类

//开发BasicDAO,是其他DAO的父类
public class BasicDAO<T> {//泛型指定具体的类型
    private QueryRunner qr = new QueryRunner();
    //开发通用的DML方法,针对任意的表
    public int update(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            int update = qr.update(connection, sql, parameters);
            return update;
        } catch (SQLException e) {
            //将编译异常转换为运行异常,抛出
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }
    //返回多个对象(即查询的结果是多行),针对任意表
    /**
     * @param sql        sql语句可以有?号
     * @param clazz      传入一个类的Class对象 比如Actor.class
     * @param parameters 传入? 的具体的值,可以是多个
     * @return 根据Actor.class 返回对应的ArrayList集合
     */
    public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);
        } catch (SQLException e) {
            //将编译异常转换为运行异常,抛出
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }
    //查询单行结果的通用方法
    public T querySingle(String sql, Class<T> clazz, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);
        } catch (SQLException e) {
            //将编译异常转换为运行异常,抛出
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }
    //查询单行单列的方法,即返回单值的方法
    public Object queryScalar(String sql, Object... parameters) {
        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return qr.query(connection, sql, new ScalarHandler(), parameters);
        } catch (SQLException e) {
            //将编译异常转换为运行异常,抛出
            throw new RuntimeException(e);
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }
}

2、创建ActorDAO类继承BasicDAO类

public class ActorDAO extends BasicDAO<Actor>{
    //1.就有BasicDao的方法
    //2.根据业务需求,可以编写特有的方法
}

3、创建domain,Actor类

//Actor对象 和 actor表的记录对应
public class Actor {//JavaBean ,POJO,Domain对象
    private Integer id;
    private String name;
    private String sex;
    private Date borndate;
    private String phone;
    public Actor() {//一定要给一个无参构造器[反射需要]
    }
    public Actor(Integer id, String name, String sex, Date borndate, String phone) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.borndate = borndate;
        this.phone = phone;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBorndate() {
        return borndate;
    }
    public void setBorndate(Date borndate) {
        this.borndate = borndate;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    @Override
    public String toString() {
        return "Actor{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", borndate=" + borndate +
                ", phone='" + phone + '\'' +
                '}';
    }
}

4、创建测试类TestDAO

public class TestDAO {
    //测试ActorDAO 对Actor表的crud操作
    @Test
    public void testActorDAO() {
        ActorDAO actorDAO = new ActorDAO();
        //1.查询多行记录
        List<Actor> actors = actorDAO.queryMulti("SELECT * FROM actor WHERE id >= ?", Actor.class, 2);
        System.out.println("===查询结果===");
        for (Actor actor : actors) {
            System.out.println(actor);
        }
        //查询单行记录
        Actor actor = actorDAO.querySingle("SELECT * FROM actor WHERE id = ?", Actor.class, 2);
        System.out.println("===查询单行结果===");
        System.out.println(actor);
        //查询单行单例
        Object o = actorDAO.queryScalar("SELECT name FROM actor WHERE id = ?", 2);
        System.out.println("===查询单行单列===");
        System.out.println(o);
        //DML操作 (insert,delete,update)
//        int affectedRows = actorDAO.update("UPDATE actor SET NAME=? WHERE id = ?", "林青霞", 2);
//        int affectedRows = actorDAO.update("INSERT INTO actor VALUES(NULL,?,?,?,?)", "许三多", "男","1999-01-01","123456");
        int affectedRows = actorDAO.update("DELETE FROM actor WHERE id = ?", "5");
        System.out.println(affectedRows > 0 ? "执行成功" : "执行没有影响表");
    }
}

输出结果如下

===查询结果===
Actor{id=2, name='林青霞', sex='男', borndate=1980-01-03 08:00:00.0, phone='123456789'}
Actor{id=3, name='张三丰', sex='男', borndate=1999-01-10 08:00:00.0, phone='1234567890'}
Actor{id=5, name='许三多', sex='男', borndate=1999-01-01 08:00:00.0, phone='123456'}
===查询单行结果===
Actor{id=2, name='林青霞', sex='男', borndate=1980-01-03 08:00:00.0, phone='123456789'}
===查询单行单列===
林青霞
执行成功

JDBCUtilsByDruid工具类的封装,看这篇文章传送门

Java 数据库连接池C3P0,德鲁伊(Druid)的详解 里面有对JDBCUtilsByDruid工具类的封装。


目录
相关文章
[c++][记录]编译libusb-win32过程
[c++][记录]编译libusb-win32过程
419 0
|
5月前
|
中间件 PHP
在ThinkPHP框架中解决跨域问题的三种方法
以上就是在ThinkPHP框架中解决跨域问题的三种方法。希望这些方法能帮助你解决你的问题。
343 11
|
10月前
|
安全 Android开发 iOS开发
Android vs iOS:深入剖析两大移动操作系统的优劣与未来趋势####
【10月更文挑战第21天】 本文旨在通过技术视角,全面对比分析Android与iOS两大主流移动操作系统的架构差异、用户体验、安全性及生态系统等方面,探讨其各自优势与不足,并预测未来发展趋势。 ####
842 1
|
索引 Python
【Python】已解决:elasticsearch.exceptions.RequestError: TransportError(400, ‘search_phase_execution_exc
【Python】已解决:elasticsearch.exceptions.RequestError: TransportError(400, ‘search_phase_execution_exc
688 0
|
12月前
|
JavaScript 前端开发 索引
JavaScript 数组中splice()的用法
本文介绍了JavaScript数组方法splice()的三种用法:删除元素、插入元素和替换元素,通过具体代码示例展示了如何使用splice()方法进行数组的修改操作。
|
存储 JSON 监控
你好,iLogtail 2.0
你好,iLogtail 2.0!
1784 90
|
负载均衡 算法 网络虚拟化
ensp中链路聚合配置命令
链路聚合(Link Aggregation)是结合多条物理链路形成逻辑链路的技术,提升网络带宽、增强冗余性和优化负载均衡。在高带宽、高可靠性及负载均衡需求的场景如服务器集群、数据中心等中广泛应用。配置包括手动和自动模式,手动模式下,如LSW1和LSW2,通过`int eth-trunk`、`trunkport`等命令配置接口和成员链路。自动模式下,如SW3和LSW4,使用LACP协议动态聚合,通过`mode lacp-static`和`load-balance dst-mac`命令设置。配置后,使用`dis eth-trunk`检查聚合状态。
1681 1
ensp中链路聚合配置命令
|
druid Java 关系型数据库
Druid连接池的基本配置与使用
Druid连接池的基本配置与使用
4048 0
Druid连接池的基本配置与使用
|
数据采集 人工智能 运维
创新场景丨新能源产业升级步入关键期,星星充电以数智探路
基于快速部署、技术创新等因素的考量,星星充电选择创立之初就将业务“长”在云上。自2014年成立以来,一方面通过推出和建设更多类型的充电桩,来满足日益增长的消费者充电需求,为用户打造充电全生命周期平台;另一方面,基于物联网和云计算技术,推出了“云、管、端”的充电桩管理模型,将充电过程智能化和高效化。伴随着人工智能技术的不断成熟,星星充电也在探索如何将人工智能与业务场景深度集成并实现创新。
创新场景丨新能源产业升级步入关键期,星星充电以数智探路
|
前端开发 JavaScript Java
【十五】springboot整合WebSocket实现聊天室
【十五】springboot整合WebSocket实现聊天室
334 0