BasicDAO

韩顺平 零基础30天学会Java

一、基本说明

1、DAO:data access object 数据访问对象

2、这样的通用类,称为BasicDao,是专门和数据库交互的,及万恒对数据库(表)的crud操作

3、在BasicDao基础上实现一张表,对应一个Dao,更好的完成功能

BasicDAO应用示例

完成一个简单的设计

com.hspedu.dao_

1、com.hspedu.dao_.utils //工具类

2、com.hspedu.dao_.domain //javaBean

3、com.hspedu.dao_.dao 存放XXXDAO和BasicDAO

4、com.hspedu.dao_.test 写测试类

  • 最终的文件结构

操作步骤

  • 首先在数据库中创建一张表 actor
  • 在com.hspedu.dao_.utils 包下创建 Druid.java 用于连接数据库

    package com.hspedu.dao_.utils;

    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.alibaba.druid.support.spring.stat.annotation.Stat;

    import javax.sql.DataSource;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;

    /**

    • @author 易

    • @version 1.0
      */
      public class Druid {
      //首先是变量
      private static DataSource ds;

      //使用静态代码块初始化
      static {
      //使用Proerties得到配置文件
      Properties properties = new Properties();
      try {
      properties.load(new FileInputStream("src/druid.properties"));
      ds = DruidDataSourceFactory.createDataSource(properties);
      } catch (Exception e) {
      throw new RuntimeException(e);
      }

      }

      //创建连接
      public static Connection getConection() throws SQLException {
      return ds.getConnection();
      }

      //关闭连接--resultset,statement,connection
      public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
      if (resultSet != null) {
      resultSet.close();
      }
      if (statement != null) {
      statement.close();
      }
      if (connection != null) {
      connection.close();
      }
      }
      }

  • 在 com.hspedu.dao_.domain 包下创建 Actro.java

    package com.hspedu.dao_.domain;

    /**

    • @author 易

    • @version 1.0
      */
      public class Actor {
      //属性
      private Integer id;
      private String name;
      private String sex;
      private String borndate;
      private String phon;

      //给一个无参构造,反射需要
      public Actor() {
      }

      //给定构造器
      public Actor(Integer id, String name, String sex, String borndate, String phon) {
      this.id = id;
      this.name = name;
      this.sex = sex;
      this.borndate = borndate;
      this.phon = phon;
      }

      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 String getBorndate() {
      return borndate;
      }

      public void setBorndate(String borndate) {
      this.borndate = borndate;
      }

      public String getPhon() {
      return phon;
      }

      public void setPhon(String phon) {
      this.phon = phon;
      }

      @Override
      public String toString() {
      return "Actor{" +
      "id=" + id +
      ", name='" + name + ''' +
      ", sex='" + sex + ''' +
      ", borndate='" + borndate + ''' +
      ", phon='" + phon + ''' +
      '}';
      }
      }

  • 在 com.hspedu.dao_.dao 包下创建 BasicDAO.java 开发 DAO 的通用操作是其他 DAO 的父类

    package com.hspedu.dao_.dao;

    import com.hspedu.chapter25.utils.Druid;
    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.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;

    /**

    • @author 易

    • @version 1.0

    • 开发BasicDAO,是其他DAO的父类
      /
      public class BasicDAO {
      //泛型指定具体的类型
      //首先创建一个QueryRunner
      private QueryRunner queryRunner = new QueryRunner();
      /
      增*/
      /* 删*/
      /* 改*/

      /**

      • @param sql sql 语句

      • @param parameters 给占位符赋值

      • @return 返回受到影响的行数
        */
        public int update(String sql, Object... parameters) {

        Connection connection = null;
        try {
        //得到连接
        connection = Druid.getConnection();
        //执行sql
        int rows = queryRunner.update(connection, sql, parameters);
        return rows;
        } catch (Exception e) {
        throw new RuntimeException(e);
        } finally {
        //关闭连接
        Druid.close(null, null, connection);
        }
        }
        /* 查*/
        //查询到多行

      /**

      • @param sql sql语句,可以有?

      • @param cls 传入一个类的 Class 对象,例如 Actor.class

      • @param parameters 可变形参,传入?具体的值,可以是多个

      • @return 根据 Actor.class 返回对应的 ArrayList 集合
        */
        public List selectMul(String sql, Class cls, Object... parameters) {

        Connection connection = null;
        try {
        //创建连接
        connection = Druid.getConnection();
        //执行sql
        List list = queryRunner.query(connection, sql, new BeanListHandler(cls), parameters);
        //返回结果
        return list;
        } catch (SQLException e) {
        throw new RuntimeException(e);
        } finally {
        //关闭连接
        Druid.close(null, null, connection);
        }
        }
        //查询单行的方法

      /**

      • @param sql sql 语句
      • @param cls 传入一个类的Class对象,例如 Actor.class
      • @param parameters 传入多个形参,给占位符赋值
      • @return 根据 Actor.class 返回单行数据
        */
        public T selectSingle(String sql, Class cls, Object... parameters) {
        Connection connection = null;
        try {
        //获得连接
        connection = Druid.getConnection();
        //执行sql
        T t = queryRunner.query(connection, sql, new BeanHandler(cls), parameters);
        //返回结果
        return t;
        } catch (SQLException e) {
        throw new RuntimeException(e);
        } finally {
        //关闭连接
        Druid.close(null, null, connection);
        }
        }
        //查询单行单列的方法

      /**

      • @param sql sql 语句
      • @param parameters 多个形参,
      • @return 返回单值
        */
        public Object selectSacal(String sql, Object... parameters) {
        Connection connection = null;
        try {
        connection = Druid.getConnection();
        Object query = queryRunner.query(connection, sql, new ScalarHandler(), parameters);
        return query;
        } catch (SQLException e) {
        throw new RuntimeException(e);
        } finally {
        Druid.close(null, null, connection);
        }
        }
        }
  • 在 com.hspedu.dao_.dao 包下创建 ActorDAO.java 继承 BasicDAO

    package com.hspedu.dao_.dao;

    import com.hspedu.dao_.domain.Actor;

    /**

    • @author 易
    • @version 1.0
      */
      public class ActorDAO extends BasicDAO {
      //1、有BasicDAO 的方法
      //2、歌剧业务需求可以编写自己的方法
      }
  • 在 com.hspedu.dao_.test 包下创建 TestDAO.java 用于测试刚才开发的功能

    package com.hspedu.dao_.test;

    import com.hspedu.dao_.dao.ActorDAO;
    import com.hspedu.dao_.domain.Actor;
    import org.junit.Test;

    import java.util.List;

    /**

    • @author 易

    • @version 1.0
      */
      public class TestDAO {
      //测试ActorDAO对actor表的crud操作
      @Test
      public void testActorDAO() {
      ActorDAO actorDAO = new ActorDAO();
      //查询多条结果
      List actors = actorDAO.selectMul("select * from actor", Actor.class);
      //输出结果
      System.out.println("输出结果");
      for (Actor actor : actors) {
      System.out.println(actor);
      }
      //
      //测试一个插入语句
      int update = actorDAO.update("insert into actor values(null,?,?,?,?)", "jerry", "男", "1898-09-07", "1110");
      System.out.println(update > 0 ? "成功" : "失败");

      }

    }

相关推荐
geovindu34 分钟前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠1 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
余槐i1 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务
EatFan2 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长2 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
jinyishu_2 小时前
向量数据库入门:记录结构、索引、检索与选型
数据库
写后端的胖头鱼6 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
路远的数据库笔记6 小时前
SQL Server迁移国产数据库怎么做?九套口岸库零停机割接实战
数据库·经验分享·sqlserver·dba
樱花落木兰6 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
kaiyou20267 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习