java 自定义封装jdbc dao类

2023-05-16

手动封装jdbc和dao层,体会其中的优点与不足。

注:本次采用的mysql数据库记得添加数据库的驱动包。


Dbhelper类:对jdbc进行封装,采用单例模式,不用每次都去连接数据库,释放连接,影响性能,对sql语句进行封装,利用列表数组动态添加数据,

不需要一个一个设置,操作时只需传sql 语句和列表数组,前提是?与数组中的参数要一一对应。返回结果封装:对于执行操作,结果只有成功与失败;

对于查询数据会封装进一个List<Map<String,String>>,同时释放结果集,提高系统的性能,方便用户操作。

不足的是,数据库的信息是硬编码,不利于扩展



package com.lzw.db1.db;



import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 该类是一个单例模式
 * jdbc封装类
 */
public class DbHelper {
    private static DbHelper dbHelper = null;
    private static Connection connection = null;
    private static final String DRIVEN = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/book";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "";

    private DbHelper() {
        if (connection == null) {
           getConnection();
        }
    }

    /**
     * 获取数据库连接
     */
    private void getConnection(){

        try {

            Class.forName(DRIVEN);
            connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            System.out.println("数据库连接成功!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取实例,
     * @return
     */
    public static DbHelper getInstance() {
        if (dbHelper == null) {
            dbHelper = new DbHelper();
        }
        return dbHelper;
    }

    /**
     *
     * @param sql sql语句
     * @param list 注入数据
     * @return
     */
    public boolean excute(String sql, List<String> list) {
        boolean is = false;
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if (list != null)
            for (int i = 0; i < list.size(); i++) {
                try {
                    preparedStatement.setString(i + 1, list.get(i));
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        try {
            int row = preparedStatement.executeUpdate();
            if (row > 0) {
                is = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return is;

    }

    /**
     *
     * @param sql  sql语句
     * @param list 注入数据
     * @return
     */

    public List<Map<String, String>> query(String sql, List<String> list) {
        List<Map<String, String>> resultlist = null;
        ResultSet resultSet = null;
        ResultSetMetaData resultSetMetaData = null;
        PreparedStatement preparedStatement = null;


        try {
            preparedStatement = connection.prepareStatement(sql);
            if (list != null)
                for (int i = 0; i < list.size(); i++) {

                    preparedStatement.setString(i + 1, list.get(i));

                }
            resultSet = preparedStatement.executeQuery();
            resultSetMetaData = resultSet.getMetaData();
            resultlist = new ArrayList<Map<String, String>>();
            while (resultSet.next()) {
                Map<String, String> map = new HashMap<String, String>();
                for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
                    //列示从1开始的
                    map.put(resultSetMetaData.getColumnName(i+1), resultSet.getString(i+1));
                }
                resultlist.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {

            try {
                if (resultSet != null)
                    resultSet.close();
                if(preparedStatement!=null)
                    preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }


        }
        return resultlist;

    }
}
  

UserDao:user表基本操作的封装



package com.lzw.db1.dao;

import com.lzw.db1.bean.User;
import com.lzw.db1.db.DbHelper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2015/12/6.
 */
public class UserDao {
    DbHelper dbHelper=null;
    public UserDao(){
        dbHelper=DbHelper.getInstance();
    }

    public User find(String id){
        String sql = "SELECT * FROM user where id=?";
        List<String> list = new ArrayList<String>();
        list.add(id);
        List<Map<String,String>> listresult=dbHelper.query(sql, list);
        if(listresult==null||listresult.size()==0){
            return  null;
        }else {
            User user=new User();
            user.setId(listresult.get(0).get("id"));
            user.setName(listresult.get(0).get("name"));
            user.setPassword(listresult.get(0).get("password"));
            return user;
        }

    }
    public boolean add(User user){
        String sql = "insert into user values(NULL ,?,?,UNIX_TIMESTAMP())";
        List<String> list = new ArrayList<String>();
        list.add(user.getName());
        list.add(user.getPassword());
        return  dbHelper.excute(sql,list);
    }

    public boolean update(User user){
        if(user==null||user.getId()==null){
            return false;
        }
        String sql = "update user set name=?,password=? where id=?";
        List<String> list = new ArrayList<String>();
        list.add(user.getName());
        list.add(user.getPassword());
        list.add(user.getId());
        return  dbHelper.excute(sql,list);
    }

    public boolean delete(String id){

        String sql = "delete from user where id=?";
        List<String> list = new ArrayList<String>();
        list.add(id);
       return dbHelper.excute(sql,list);

    }



}
  




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

java 自定义封装jdbc dao类 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 安卓手机利用DroidCam当电脑摄像头使用方法

    笔记本电脑有点老了 xff0c 摄像头好像坏了 xff0c 重装了一下午驱动都没弄好 xff0c 换了ubuntu系统也打不开摄像头 xff0c 然后就放弃了 xff0c 于是想到了能不能用android手机当笔记本电脑的摄像头 xff1f
  • Dell安装驱动程序出现的错误(DupAPI::Execute): *** Shell Execute Error. System error text

    在官网下的驱动却怎么也安装不上 xff0c 一直提示 The update installer operation is unsuccessful 然后打开日志文件查看 xfeff 04 10 19 10 12 11 Update Pack
  • 浮点数大小比较

    引言 在一次某公司的笔试题中出现了一题在一个无序的浮点数数组中找出相同的数 xff0c 那么在计算机中一般的整型的十进制数一般都是直接通过 61 61 来判断两个数是否相等的 xff0c 但是如果是浮点数还可以用这样的方式进行判断吗 xff
  • int的取值范围

    引言 在学C 43 43 或者Java的时候应该都会先了解各种基本数据类型的初值和它们的取值范围 xff0c 有些人可能会不太重视这块内容 xff0c 其实很重要 xff0c 很多大公司面试的过程中都会问到int的取值范围 xff0c 溢出
  • Intel汇编语言程序设计学习-第三章 汇编语言基础-上

    汇编语言基础 3 1 汇编语言的基本元素 有人说汇编难 xff0c 有人说汇编简单 xff0c 我个人不做评价 xff0c 下面是一个简单的实例 xff08 部分代码 xff09 xff1a main PROC mov eax 5 5送 E
  • 向量和矩阵范数

    参考 xff1a https en wikipedia org wiki Matrix norm Frobenius norm https blog csdn net Michael Corleone article details 752
  • ubuntu安装后分辨率只有一个选项

    ubuntu 16 04安装后分辨率只有一个选项 1024x768 xff0c 使用xrandr命令出现错误 xff1a xrandr Failed to get size of gamma for output default xff0c
  • android.hardware.Camera入坑之旅

    1 相机预览方向适配 可以参考谷歌官方适配方案 public static void setCameraDisplayOrientation Activity activity int cameraId android hardware C
  • MySQL深入的学习笔记

    MYSQL高级 MySql架构演变 这个很重要 软件的环境是如何从单应用算法极致优化的方向 到分布式的进化 这个时代 就会淘汰好多单体应用的coder 比如我自己 哈哈哈哈 1 0时代 单机单库 单应用 单数据库 快速 方便 好维护 并发量
  • Java变量的声明、初始化和作用域

    一 Java变量的声明 在 Java 程序设计中 xff0c 每个声明的变量都必须分配一个类型 声明一个变量时 xff0c 应该先声明变量的类型 xff0c 随后再声明变量的名字 下面演示了变量的声明方式 double salary int
  • 无线网卡无法启动(代码 10),怎么办?

    前言 无线网卡突然无法启动 xff0c 代码 10 xff0c 怎么办 xff1f 本文记述了作者遇到这个问题的经历和最终解决方法 xff0c 希望我的分享能给大家节约宝贵时间 一 我遇到的问题 先说明一下 xff1a 我用的是华硕的飞行堡
  • systemd内置变量

    替换符含义 b系统的 34 Boot ID 34 字符串 参见 random 4 手册 C缓存根目录 对于系统实例来说是 var cache xff1b 对于用户实例来说是 XDG CACHE HOME E配置根目录 对于系统实例来说是 e
  • IOS轻松实现仿网易新闻顶部滑动指示器(Scrollview实现)

    实现原理很简单 xff0c 就是利用了scrollview进行自定义 xff0c 对外部传入的scrollview滑动事件进行监听 xff0c 源码如下 xff1a xff08 1 xff09 h文件代码 ScrollViewIndicat
  • 【极客日常】Go语言string、int、float、rune、byte等数据类型的转换方法

    golang的数据类型转换是困惑新gopher的一大问题之一 相对于python xff0c golang的数据类型转换可要麻烦的多 xff0c 而且还不走寻常路地诞生了些新的方法跟名词 因此本文讲解golang常见数据类型string i
  • View的mParent变量初始化

    mParent变量实际上是PhoneWindow DecorView类型 xff0c 是所有应用窗口的根视图 xff0c 是FrameLayout的子类 View的requestLayout 函数也是调用了mParent requestLa
  • java:N的N次方

    题目描述 现给你一个正整数N xff0c 请问N N的最左边的数字是什么 xff1f 输入格式 输入包含多组测试数据 每组输入一个正整数N xff08 N lt 61 1000000 xff09 输出 对于每组输入 xff0c 输出N N的
  • CentOS升级curl

    1 安装repo rpm Uvh http www city fan org ftp contrib yum repo rhel6 x86 64 city fan org release 2 1 rhel6 noarch rpm 2 查看该
  • ACM:入口的选择------深度优先搜索

    入口的选择 Time Limit 1000MS Memory Limit 32768K Description Zeism玩的赛车游戏中 xff0c 有一种树形的赛道 树根表示赛道的终点 xff0c 任何一个叶子结点表示一个赛道的入口 xf
  • ACM:n!的位数 :斯特林公式

    n 的位数 Time Limit 2000MS Memory Limit 65536K Description 针对每个非负整数n xff0c 计算其n 的位数 Input 输入数据中含有一些整数n xff08 0 n xff1c 10 7
  • java 自定义封装jdbc dao类

    手动封装jdbc和dao层 xff0c 体会其中的优点与不足 注 xff1a 本次采用的mysql数据库记得添加数据库的驱动包 Dbhelper类 xff1a 对jdbc进行封装 xff0c 采用单例模式 xff0c 不用每次都去连接数据库