JAVA-JDBC: (4) DAO设计思想及骨架搭建

java基础知识【第22期】-- DAO模式和分层 导读: 本篇是JAVA基础系列的第22篇,今天我们梳理DAO模式开发及分层的相关知识。 1.分层开发 分层开发是一种化大为小,分而治之的软件开发方法。 分层开发的好处: 各层专注于自己功能的实现,便于提高质量 便于分工协作,提高开发效率 便于代码复用 便于程序扩展 分层开发的原则 封装性原则 每个层次向外公开接口,但是隐藏内部细节 顺序访问原则 下一层为上一层服务,但不使用上层的服务 在项目实际开发过程中,通常会将整个项目从上到... 阅读详情

这篇我们总结下JDBC中 数据访问对象(Data Access Object DAO)设计模式及其粗略的骨架搭建过程。至于DAO 编程中三个常常被忽略的方面:事务界定、异常处理和日志记录,可以参考博文:DAO异常和事务


1. DAO简介

数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开来。为每一个数据源提供 CRUD (创建、读取、更新、删除)操作。

这里写图片描述


2. JDBC 示例;

2.1 文件结构:

这里写图片描述

注释:

  • jdao.domain包下的Stu.java对应数据库中的Stu表。
  • jdao.dao包下的StuDao.java定义了业务逻辑层操作数据访问层所涉及到的方法。这里主要是CRUD方法。包下的DaoException.java定义了
  • SQLException异常从编译时异常到运行时异常的转换、同时也避免了对StuDao.java接口类的污染、降低由异常导致的耦合。
  • jdao.dao.impl包下的StuDaoImpl.java是StuDao.java的具体实现。具体来操作数据访问层的方法。
  • jdao.busi包下的StuDaoTest.java相当于业务逻辑层层的业务流程。
2.2 异常解释;
2.2.1 jdao.domain==>Stu.java
package jdao.domain;
import java.util.Date;
/**
 * 定义domain对象、对应于数据库中的Stu表。
 * 相应的字段名就是表的列名称;
 * @author Administrator
 */
public class Stu {

    private String stuId;
    private String stuName;
    private String sex;
    private float score;
    private Date birthday;

    public String getStuId() {
        return stuId;
    }
    public void setStuId(String stuId) {
        this.stuId = stuId;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public float getScore() {
        return score;
    }
    public void setScore(float score) {
        this.score = score;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
2.2.2 jdao.dao==>StuDao.java
package jdao.dao;
import jdao.domain.Stu;
/**
 * 业务逻辑层打交道的对象、业务逻辑层主要是通过
 * 对这些上层接口的操作来操作数据访问层;
 * @author Administrator
 *
 */
public interface StuDao {
    //向数据库中增加一个Stu;
    void addStu(Stu stu);
    //根据stu的id查找对象
    Stu findStuById(String stuId);
    //根据stu的name查找对象;
    Stu findStuByName(String stuName);
    //更新
    void updateStu(Stu stu);
    //删除
    void deleteStu(Stu stu);
}
2.2.3 jdao.dao.impl==>StuDaoImpl.java
package jdao.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import jdao.dao.StuDao;
import jdao.domain.Stu;
import jdao.utils.JDBCUtils;

public class StuDaoImpl implements StuDao {

    public void addStu(Stu stu) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql;
        try{
            //注册驱动建立连接
            conn = JDBCUtils.getConnection();
            sql = "insert into stu(stuid,sutname,sex,score,birthday) values(?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stu.getStuId());
            ps.setString(2, stu.getStuName());
            ps.setString(3, stu.getSex());
            ps.setFloat(4, stu.getScore());
            ps.setDate(5,new java.sql.Date(stu.getBirthday().getTime()));
            ps.executeUpdate();
        } catch (SQLException e) {
            //**  对异常的第一种处理方式、默认打印堆栈**
            e.printStackTrace();

            //** 把异常抛出去让上一层知道出错了、**
            //throw e;

        }finally{
            JDBCUtils.free(null, ps, conn);
        }

    }
}
2.2.4 jdao.dao.impl==>StuDaoImpl.java
package jdao.busi;
import java.util.Date;
import jdao.dao.StuDao;
import jdao.dao.impl.StuDaoImpl;
import jdao.domain.Stu;

public class StuDaoTest {
    private static StuDao stuDao = new StuDaoImpl();
    static void register(Stu stu){
        stuDao.addStu(stu);
        System.out.println("注册成功了,可以发邮件确认、进行下一步工作了");
    }

    public static void main(String[] args) {

        Stu stu = new Stu();
        stu.setStuId("S151210");
        stu.setStuName("qian");
        stu.setSex("nan");
        stu.setScore(99.9f);
        stu.setBirthday(new Date());

        register(stu);
    }
}

注释: 这里对异常的两种处理方式是十分危险和错误的。

  • 首先 对于catch(SQLException e){e.printStackTrace()} 说明;

这里写图片描述

我们在daoimpl实现中捕获了这个异常、却默认的打印了下堆中、那么就会出现下面这样的问题:

这里写图片描述

我们在实现中sql语句编写错了、或者出现一些错误导致了SQLException异常的产生。这样我们只是在后台简单的打印了下错误的堆栈信息、程序却继续的执行下去了,也就是说我们的业务逻辑层不知道在SQL操作中已经出错了,而是继续往下执行。进行下一步的处理,例如给用户发送邮件激活等、这样会在后面用户进行激活时,又会出现数据库中没有这个用户的信息的错误、此时找错误比较难。

  • 其次,对catch(SQLException e){ throw e} 说明;
    由于SQLException e 是一个编译时异常。此时我们需要改接口StuDao.java 让addStu(Stu stu)也抛出SQLException异常、并且在业务逻辑层就会面临两个问题:第一捕获这个异常、第二:继续向上抛这个异常:代码修改如下:
    这里写图片描述
    相应的StuDao接口类也得抛异常,不可能孩子抛父亲不抛。
    这里写图片描述
    相应的业务逻辑层的StuDaoTest如下:
    这里写图片描述

注释:这种情况最大的弊病在于:Dao接口被污染了,被耦合了,因为它抛出来具体的异常SQLException 、如果我们底层数据访问层访问的不是数据库,而是文件、那么这里相应的会变成抛IO异常。那么就是在说、我们业务逻辑层是在给具体的数据访问层打交道、而不能是单单的对接口打交道了。

2.4 异常的正确处理方式、我们在下面完整的代码中显示:

3. 完整的代码如下:

这里写图片描述

  • 1. jdao.domain==>Stu.java 如 2.2.1所示

  • 2. jdao.dao==>StuDao.java 如2.2.2所示

  • 3. jdao.dao.impl==>StuDaoImpl.java 如下:

package jdao.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import jdao.dao.DaoException;
import jdao.dao.StuDao;
import jdao.domain.Stu;
import jdao.utils.JDBCUtils;

public class StuDaoImpl implements StuDao {

    public void addStu(Stu stu) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql;
        try{
            conn = JDBCUtils.getConnection();
            sql = "insert into stu(stuid,stuname,sex,score,birthday) values(?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stu.getStuId());
            ps.setString(2, stu.getStuName());
            ps.setString(3, stu.getSex());
            ps.setFloat(4, stu.getScore());
            ps.setDate(5,new java.sql.Date(
            stu.getBirthday().getTime()));
            ps.executeUpdate();
        } catch (SQLException e) {
            //对这个异常不能随便的处理;将其转化成一个运行是异常、
            //如果出错让程序自己停下来、
            throw new DaoException(e.getMessage(),e);           
        }finally{
            JDBCUtils.free(null, ps, conn);
        }

    }

    @Override
    public Stu findStuById(String stuId) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql;
        Stu stu = null;
        try{
            conn = JDBCUtils.getConnection();
            sql = "select stuid,stuname,sex,score,birthday from stu where stuid =?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stuId);
            rs = ps.executeQuery();

            while(rs.next()){
                stu = stuMapping(rs);
            }
        } catch (SQLException e) {
            throw new DaoException(e.getMessage(),e);           
        }finally{
            JDBCUtils.free(rs, ps, conn);
        }
        return stu;
    }

    //重复步骤、我们把它抽成一个方法;
    private Stu stuMapping(ResultSet rs) throws SQLException {
        Stu stu;
        stu = new Stu();
        stu.setStuId(rs.getString("stuid"));
        stu.setStuName(rs.getString("stuname"));
        stu.setSex(rs.getString("sex"));
        stu.setScore(rs.getFloat("score"));
        stu.setBirthday(rs.getDate("birthday"));
        return stu;
    }

    @Override
    public Stu findStuByName(String stuName) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql;
        Stu stu = null;
        try{
            conn = JDBCUtils.getConnection();
            sql = "select stuid,stuname,sex,score,birthday from stu where stuname =?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stuName);
            rs = ps.executeQuery();

            while(rs.next()){
                stu = stuMapping(rs);
            }
        } catch (SQLException e) {
            throw new DaoException(e.getMessage(),e);           
        }finally{
            JDBCUtils.free(rs, ps, conn);
        }
        return stu;
    }

    @Override
    public void updateStu(Stu stu) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql;
        try{
            //注册驱动建立连接
            conn = JDBCUtils.getConnection();
            sql = "update stu set stuname = ?, sex = ?, score = ?, birthday = ? where stuid= ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stu.getStuName());
            ps.setString(2, stu.getSex());
            ps.setFloat(3, stu.getScore());
            ps.setDate(4, new java.sql.Date(stu.getBirthday().getTime()));
            ps.setString(5, stu.getStuId());

            ps.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new DaoException(e.getMessage(),e);
        }finally{
            JDBCUtils.free(null, ps, conn);
        }
    }

    @Override
    public void deleteStu(Stu stu) {
        Connection conn = null;
        PreparedStatement ps = null;
        String sql;
        try{
            //注册驱动建立连接
            conn = JDBCUtils.getConnection();
            sql = "delete from stu where stuid= ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, stu.getStuId());            
            ps.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new DaoException(e.getMessage(),e);
        }finally{
            JDBCUtils.free(null, ps, conn);
        }
    }

}
  • * 4. jdao.busi==>StuDaoTest.java 如下:*
package jdao.busi;

import java.util.Date;

import jdao.dao.StuDao;
import jdao.dao.impl.StuDaoImpl;
import jdao.domain.Stu;

public class StuDaoTest {
    private static StuDao stuDao = new StuDaoImpl();
    //注册用户
    static void register(Stu stu){
        stuDao.addStu(stu);
        System.out.println("注册成功了,可以发邮件确认、进行下一步工作了");
    }

    //查找用户根据id
    static Stu getStuById(String stuId){
        return stuDao.findStuById(stuId);
    }

    //查找用户根据name
    static Stu getStuByName(String stuName){
        return stuDao.findStuByName(stuName);
    }

    //根据用户的id修改用户的信息
    static void reviseStuById(Stu stu){
        stuDao.updateStu(stu);
    }

    //根据用户的id删除用户信息;
    static void freeStuById(Stu stu){
        stuDao.deleteStu(stu);
    }
    public static void main(String[] args) {

        Stu stu = new Stu();
        stu.setStuId("S151206");
        stu.setStuName("song");
        stu.setSex("nan");
        stu.setScore(80.6f);
        stu.setBirthday(new Date());

        register(stu);

        Stu stuOne = getStuById("S151208");
        Stu stuTwo = getStuByName("qian");
        System.out.println(stuOne.toString());
        System.out.println(stuTwo.toString());

        reviseStuById(stu);
        freeStuById(stu);

    }

}

* 5. jdao.dao==>DaoException.java 如下:*
只是简单的继承了运行时异常、并没有做具体的处理;

package jdao.dao;

public class DaoException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public DaoException() {
        super();
        // TODO Auto-generated constructor stub
    }

    public DaoException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }

    public DaoException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

    public DaoException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public DaoException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }
}
3.2 对上面代码的进一步修正;

首先在命名上说明一点:我们将 StuDaoImpl.java重命名成: StuDaoJDBCImpl.java 为了强调这个接口的实现是通过JDBC技术来实现的。
其次 我们发现在业务逻辑层还存在下面这个问题,使得业务层不单单与StuDao接口打交道并且与具体的StuDao的实现耦合上了。如下:

这里写图片描述
注释:因为改名了这里应该是:

private static StuDao stuDao = new StuDaoJDBCImpl();

由于截图是先做得,这里不在更改了。
我们通过工程设计模式来解决这个问题:

新的 src 文件结构如下:

这里写图片描述

jdao.property==>StuDao.property:

stuDaoClass=jdao.dao.impl.StuDaoJDBCImpl

jdao.dao==>DaoFactory.java:

package jdao.dao;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public final class DaoFactory {
    /**
     * 注意这两个静态引用的初始化先后顺序,因为我们把
     * 类似静态代码块的东西放在了构造方法中了;
     */
    private static StuDao stuDao = null;

    private static DaoFactory instance = new DaoFactory();

    //私有了自己的构造方法、让不能被创建
    private DaoFactory(){
        //实现类似静态代码块的功能
        try {
            Properties property = new Properties();

            //property.load(new FileInputStream(new File("src/jdao/property/StuDao.property")));

            InputStream ips = DaoFactory.class.getClassLoader().
            getResourceAsStream("jdao/property/StuDao.property");
            property.load(ips);

            String stuDaoInitialClass = property.getProperty("stuDaoClass");
            stuDao = (StuDao) Class.forName(stuDaoInitialClass).newInstance();
        } catch (IOException 
        | InstantiationException 
        | IllegalAccessException 
        | ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public StuDao getStuDao(){
        return stuDao;
    }

    public static DaoFactory getInstance() {
        // TODO Auto-generated method stub
        return instance;
    }
}

4. 不错的参考文档:

1. 以系统登录界面解析三层架构 :
http://www.cnblogs.com/javawebsoa/archive/2013/05/21/3091747.html

2. JAVA三层架构 SSH:
http://www.cnblogs.com/nin-w/p/5959038.html

3. JAVA类加载过程的几篇文章:
http://wiki.jikexueyuan.com/project/java-vm/class-loading-mechanism.html


路漫漫其修远兮、愿你我不忘初心、继续前行!!

JDBC中DAO层设计与实现 JDBC(全称:Java Data Base Connectivity)是java数据库连接简称 ,提供连接各种数据库的能力。JDBC API主要的功能1.与数据库建立连接;2.执行SQL语句;3.处理结果。JDBC关键字的使用1.DriverManager:依据数据库的不同,管理JDBC驱动;2.Connection:负责连接数据库并且担任传送数据库的任务;3.Statement:由Connec... 阅读详情

相关推荐

Java JDBC数据库 之 DAO 封装

http://www.verejava.com/?id=16998506642443下载 Oracle 或者 Mysql Jar 驱动 mysql-connector-java-3.0.10-stable-bin.jar ojdbc14.jar package com.dao; import java.util.List; import com.entity.Dept; publi...

verejava的博客 965

JavaJDBC

java数据库连接,是一种用于执行SQL语句的java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。Java API:供程序调用的接口类,集成在java.sql包中DriverManager类作用:管理各种不同的jDBC驱动Connection 接口 与特定数据库的连接Statement 接口 执行sqlPreparedStatement接口 执行sqlResultSet接口 接收查询结果。

zl_nian的博客 4148

【JAVA高级】——初识JDBC中DAO数据访问对象

初识JDBC中DAO数据访问对象

不迁怒,不贰过。小知识,大智慧。 1226

JAVA之JDBC

JDBC学习笔记

qq_44708895的博客 5063

【全解析 | PTA】浙大版《Python 程序设计》题目集-第一章

Python浙大版PTA题解

wzhh_的博客 5525

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1031

Java-JDBC

1)JDBC为访问不同的数据库提供了统一的接口;2)Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库,从而完成对数据库的各种操作;3)JDBC基本原理:Java程序提供接口规范,让不同数据库实现,在Java程序中统计调用接口的方法即可4)模拟JDBC实现:创建数据库连接接口(Interface)→数据库实现接口创建操作方法→创建实现对象赋给接口引用,通过接口实现对象完成对数据库的操作。

Ego_Ekko的博客 2806

Python实战:用NumPy实现LU分解与QR分解(附代码对比)

本文深入探讨了使用NumPy实现LU分解与QR分解的实战方法,通过代码对比分析了两种矩阵分解技术的原理、数值稳定性差异及核心应用场景。LU分解适用于高效求解线性方程组,而QR分解凭借其正交化特性,在求解最小二乘问题和处理病态矩阵时更具优势。文章提供了详细的Python代码示例,帮助开发者根据具体问题选择最合适的分解方法。

php55的博客 1212

java分层思想_Java分层思想

从最常规的分层结构来说,系统层次从上到下依次为:表现层/UI层/界面层:主要是客户端的展示。服务层/业务层:直接为客户端提供的服务或功能。也是系统所能对外提供的功能。领域层:系统内的领域活动。DAO层:数据访问对象,通过领域实体对象来操作数据库。其中有些指导原则(精华):1、上层总是依赖其下层,依赖关系不跨层。2、表现层除外,同一层之间方法不允许相互调用。这是实际开发中一些开发者容易范的错误!如果...

weixin_35523284的博客 1012

Ubuntu下安装Hive3.1.2教程(附MySQL安装方法及安装包)

文章目录前言一、安装Hive1. 下载压缩包并解压2. 安装Hive3. 配置环境变量4. 修改配置文件二、MySQL安装与配置1. 安装MySQL2. 安装MySQL jdbc包3. 为Hive创建MySQL账号三、验证Hive安装及错误处理1. 启动Hadoop2. 启动hive3. 运行Hive实例总结 前言 Hive 的安装需要建立在 Hadoop 的之上(类似于Hbase),关于 Hadoop 的单机安装以及伪分布式安装可以参考作者的另两篇博客: Ubuntu下单机安装Hadoop详细教程(附

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘

本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。

2403_85993278的博客 1512

JDBC中DAO+service设计思想

一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想。   高可读性、   高复用性、   高扩展性、 b) JDBC代码实现的增删改查操作是有复用需求的。所以需要将对数据库的增删改查操作进行封装。 c) DAO类:特殊类。只对对数据库进行CRUD(增删改查)的操作进行具体的封装。 d) 注意:DAO类的个数取决于ta

含江君 1775

【升级U8+】不能将值 NULL 插入列 ‘VT_ID‘,表 ‘VoucherItems‘;列不允许有 Null 值。

不能将值 NULL 插入列 ‘VT_ID’,表 ‘UFDATA_006_2012.dbo.VoucherItems’;列不允许有 Null 值。INSERT 失败。

努力不懈的为广大客户提供优质的产品与真诚、贴心、专业的服务! 513

java数据库 JDBC的Dao模式(适合初学者)

java 连接数据库首先要导入一个jar包 我们来了解一下什么是jdbc 其实JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java AP 读下面代码需要大概了解Statement常用的方法: ResultSet executeQuery(String sql):执行SQL查询并且获取ResultSet对象 Int exec...

不知有鱼的博客 1万+

手把手教你学GPU的KMD专栏--3.4 中断处理机制与优化

记住,中断处理是GPU与CPU通信的"桥梁",没有高效的中断处理,GPU的性能将无法充分发挥。KMD通过"快进快出"原则、事件标志机制、GPU本机围栏等技术,实现高效、低延迟的中断处理。:GPU本机围栏机制允许GPU在满足特定条件(如围栏值达到某个阈值)时才触发中断,而不是每次围栏更新都触发中断,从而显著减少CPU唤醒次数,降低功耗。正如Microsoft GPU架构师在2022年WinHEC大会上指出:"没有好的中断处理,再强大的GPU也会被系统延迟拖垮。:多个GPU设备共享中断,导致中断处理混乱。

MHD0815的博客 111

RAG 实战:LangChain + 向量数据库构建知识问答系统

从文档加载、分割、嵌入到检索增强生成,完整实现一个基于本地文档的知识问答系统。

kaixin110a的博客 186

JDBC之DAO

JDBC准备工作 下载 mysql-connector-java-8.0.25.jar 官网下载地址:https://dev.mysql.com/downloads/connector/j/ 下载mysql对应版本的 创建项目,在项目下创建lib文件夹,把 mysql-connector-java-8.0.25.jar添加到lib文件夹中 然后再src中正常创建包,就可以写JDBC 有关代码了 可以在mysql中查看连接数量: ​ 可以让程序先睡几秒,然后mysql客户端执行 sh

zhouhe_的博客 1108

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

20190301——Dao设计思想与搭建骨架

这个是User实体类 package domain; import java.util.Date; public class User { private int id; private String name; private Date birthday; private float money; public int getId() { ...

寄蜉蝣于天地,渺沧海之一粟。 197

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java中service设计_JDBC中DAO+service设计思想

一.DAO设计思想a)Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想。高可读性、高复用性、高扩展性、b)JDBC代码实现的增删改查操作是有复用需求的。所以需要将对数据库的增删改查操作进行封装。c)DAO类:特殊类。只对对数据库进行CRUD(增删改查)的操作进行具体的封装。d)注意:DAO类的个数取决于table的个数(一份库表对应一个DAO类)e)...

weixin_28869649的博客 359

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jdbc之二:DAO模式

1、创建Dao接口。 package com.ljh.jasonnews.server.dao; import java.sql.Connection; public interface Dao { public Connection getConnection() throws DaoException; } 2、创建BaseDao类,实现Dao接口,主要完成数据库的打开与关闭

jediael_lu的专栏 8281

JDBC之DAO层封装思想超详解

dbutils,全称commons-dbutils,它 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。其中QueryRunner类封装了SQL的执行,是线程安全的。可以实现增、删、改、查、批处理。考虑了事务处理需要共用Connection。该类最主要的就是简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

siaok的博客 1630

JAVA JDBC的单表查询通用dao层代码实现

获取数据库连接对象代码实 package com.eduask.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static Connection conn = null; pri

max_wcsdn的博客 3687

关于mysql,需要掌握的基础(二):JDBC和DAO层

关于mysql,需要掌握的基础(二):JDBC和DAO层

伟庭的博客 1572

Java jdbc 使用Dao层

java jdbc Dao层 优化Java jdbc连接(使用Dao优化) 提示:以下是本篇文章正文内容,下面案例可供参考 一.Dao是什么? Dao主要是为了提高数据库操作的执行效率和提高代码的复用性,将整体重新为封装一个Dao层,也就是数据访问层 ,用来持续访问数据库. 二.加载连接引擎与连接方法 package com.cn.TBproject; import java.sql.Connection; import java.sql.DriverManager; import java.sql.P

Henlenl的博客 701

Java从0到1搭建项目(jdbc版)

JDBC版项目从0到1怎么做,实例演示!!!

Best_jiangX的博客 2419

Dao层设计思想、JdbcUtils类、数据库连接池技术

1 Dao设计思想 Java语言要操作数据库表里面的数据时,要使用jdbc,但是jdbc的代码非常的繁琐,如果经常操作数据的话,这些代码的重复度会很高。所以我们把经常对表的相关操作封装到我们的dao类。这样就提高了代码的利用率,提高了系统的可维护性,可扩展性。 Dao(data access object)数据访问对象。 Dao里面需要有以下几个组件: 1.Person类。实体类。 a) 这个类跟...

Java开发,人工智能,边缘计算,致力于掌握前沿技术 988
上一篇: JAVA-JDBC: (3)操作日期类型和CLOB、BLOB类型
下一篇: Java多线程基础知识回顾与总结
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值