通常真正实际开发时,dao层虽然会涉及很多实体,但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法,下面介绍两种方法

第一种:借助元数据类ResultSetMetaData来实现方法的封装,使用Map或者List集合来实现数据的封装(自己感觉使用Map封装数据比实体好),代码如下:

public class BaseDao {private Connection connection;public BaseDao() {connection = getConnection();}/*** 获取数据连接*/public Connection getConnection() {Connection connection = null;try {//获取数据源对象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");//通过数据源获取连接connection = dataSource.getConnection();System.out.println(connection);} catch (SQLException e) {e.printStackTrace();System.out.println("获取数据库连接失败!");}return connection;}/*** 添、改、删操作* @param sql sql语句* @param objects 占位符需传递的参数* @return*/public int update(String sql, Object ...objects) {int flag = 0;PreparedStatement pst = null;try {pst = connection.prepareStatement(sql);for (int i = 0 ; i <objects.length ; i++){pst.setObject(i+1, objects[i]);}flag = pst.executeUpdate();} catch (SQLException e) {e.printStackTrace();System.out.println("更新操作失败!");}finally{if (pst != null) {try {pst.close();} catch (SQLException e) {e.printStackTrace();}}}return flag;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public List<Map> getResultMapList(String sql , Object ...objects) {PreparedStatement pst = null;ResultSet result = null;List<Map> list = new ArrayList<>();try {pst = connection.prepareStatement(sql);for (int i = 0 ; i <objects.length ; i++){pst.setObject(i+1, objects[i]);}result = pst.executeQuery();while(result.next()){Map<String, Object> map = new HashMap<>();ResultSetMetaData metaData = result.getMetaData();int count = metaData.getColumnCount();for (int i = 0; i < count; i++) {String label = metaData.getColumnLabel(i+1);map.put(label, result.getObject(i+1));}list.add(map);}} catch (SQLException e) {e.printStackTrace();System.out.println("查询操作失败!");}finally{try {if (pst != null) {pst.close();}if (result != null) {result.close();}}catch (SQLException e) {e.printStackTrace();}}return list;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public Map getResultMap(String sql , Object ...objects) {List<Map> list = getResultMapList(sql, objects);return list != null ? list.get(0) : null;}public static void main(String[] args) {BaseDao dao = new BaseDao();String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";dao.update(sql, "zhangsan" , 6);String sql2 = "DELETE FROM USER WHERE ID > ?";dao.update(sql2 , 4);String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";dao.update(sql3 , "樊少皇" , "123456");String sql4 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER WHERE ID = ?";Map map = dao.getResultMap( sql4, 20007);String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";List<Map> resultMapList = dao.getResultMapList(sql5, 10);System.out.println(resultMapList);}
}

第二种:直接借助工具类dbutils实现封装,代码如下:

public class BaseDao {private Connection connection;private QueryRunner queryRunner;public BaseDao() {connection = getConnection();queryRunner = new QueryRunner();}/*** 获取数据连接*/public Connection getConnection() {Connection connection = null;try {//获取数据源对象ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");//通过数据源获取连接connection = dataSource.getConnection();System.out.println(connection);} catch (SQLException e) {e.printStackTrace();System.out.println("获取数据库连接失败!");}return connection;}/*** 添、改、删操作* @param sql sql语句* @param objects 占位符需传递的参数* @return*/public int update(String sql, Object ...objects) {int flag = 0;try {flag = queryRunner.execute(connection, sql, objects);} catch (SQLException e1) {e1.printStackTrace();}return flag;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public List<Map<String, Object>> getResultMapList(String sql , Object ...objects) {List<Map<String, Object>> list = null;try {list = queryRunner.query(connection, sql, new MapListHandler(), objects);} catch (SQLException e1) {e1.printStackTrace();}return list;}/*** 将查询结果集信息封装成一个Map* @param sql* @param objects* @return*/public Map<String, Object> getResultMap(String sql , Object ...objects) {Map<String, Object> map = null;try {map = queryRunner.query(connection, sql, new MapHandler(), objects);} catch (SQLException e) {e.printStackTrace();}return map;}public static void main(String[] args) {BaseDao dao = new BaseDao();String sql = "UPDATE USER SET UNAME = ? WHERE ID = ?";dao.update(sql, "zhangsan" , 1);String sql2 = "DELETE FROM USER WHERE ID > ?";dao.update(sql2 , 4);String sql3 = "INSERT INTO USER (UNAME , PASSWORD) VALUES (? ,?)";dao.update(sql3 , "刘德华" , "123456");String sql4 = "SELECT count(1) count FROM USER ";Map map = dao.getResultMap( sql4);System.out.println(map);String sql5 = "SELECT ID , UNAME , PASSWORD , STATUS FROM USER LIMIT ?";List<Map<String, Object>> resultMapList = dao.getResultMapList(sql5, 10);System.out.println(resultMapList);}
}

29、jdbc操作数据库(6)相关推荐

  1. Java系列技术之JDBC操作数据库-钟洪发-专题视频课程

    Java系列技术之JDBC操作数据库-22人已学习 课程介绍         JDBC连接数据库是Java系列技术中数据库知识的核心技术,是学习后续课程JavaWeb入门前需要掌握的基础! 这门课的前 ...

  2. JavaWeb:用JDBC操作数据库

    JDBC系列阅读 JavaWeb:用JDBC操作数据库 JavaWeb:JDBC之事务 JavaWeb:JDBC之数据库连接池 使用JDBC实现水果超市管理系统 1. 什么是JDBC JDBC的全称是 ...

  3. 25、jdbc操作数据库(2)

    说一下使用jdbc时涉及到的一些基本的接口和类 java.sql.Driver 是数据库驱动接口,com.mysql.jdbc.Driver是mysql对应的驱动,由数据库供应商实现,用于提供驱动,实 ...

  4. 24、jdbc操作数据库(1)

    什么是jdbc? 看一下官方怎么说,JDBC 英文名Java DataBase Connectivity,使用java连接数据库的工具,就是一组使用java代码来执行SQL语句的API. Jdbc有什 ...

  5. java监听数据库操作_第十六篇——JDBC操作数据库之监听器

    JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...

  6. Mybatis介绍、jdbc操作数据库原始写法以及Mybatis架构

    文章目录 Mybatis介绍 jdbc操作数据库原生写法 使用jdbc编程问题总结 Mybatis架构 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个 ...

  7. jdba访问mysql_Java中JDBC操作数据库的步骤

    Java中JDBC操作数据库的步骤,今天给喜欢Java开发或者是想要参加Java培训学习的小伙伴们分享一些Java技能干货,那就是Java阐述jdba操作数据库的步骤,废话不多说了,随小编一起来看一下 ...

  8. java完整JDBC操作数据库

    java使用JDBC操作数据库的包含以下7个主要步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的 ...

  9. 说说JDBC 操作数据库的步骤?

    分析&回答 1)加载(注册)数据库驱动(到JVM). 2)建立(获取)数据库连接. 3)创建(获取)数据库操作对象. 4)定义操作的SQL语句. 5)执行数据库操作. 6)获取并操作结果集. ...

  10. 【JDBC】JDBC 简介 ( JDBC 概念 | JDBC 本质 | 使用 JDBC 操作数据库的好处 | JDBC 提供的 API 组件 )

    文章目录 一.JDBC 概念 二.JDBC 本质 三.使用 JDBC 操作数据库的好处 四.JDBC 提供的 API 组件 一.JDBC 概念 JDBC 全称 Java DataBase Connec ...

最新文章

  1. 使用计算机视觉在钢铁平面上检测焊接缺陷
  2. ​Xamarin iOS教程之视图显示图像
  3. 【Web安全】JSP内存马研究
  4. 2017年11月04日普及组 Biotech
  5. android studio 运行 Java Application
  6. (前端)html与css,css 4 、继承性和层叠性
  7. Java当中TreeMap用法
  8. SEO按天关键词计费排名查询系统源码
  9. python 双冒号切片_Numpy 学习笔记
  10. js判断一个元素是否在数组中
  11. ubuntu本地虚拟机搭建服务器,window配合虚拟机VMware搭建虚拟ubuntu服务器入坑集锦...
  12. JS AES加密解密实现
  13. 【广东大学生网络攻防大赛-WriteUp(非官方)】Reverse | pyre
  14. win7下建立的虚拟机无法连上网络,提示本地连接受限制
  15. php获取qq头像地址,获取 QQ 头像地址,并且不暴露 QQ 号
  16. 宋朝五子登科家族金榜进士涂大任后裔在松滋
  17. 河钢唐钢微尔云计算中心对外签订首个合同
  18. 1年赋能100家环保机构,阿里云发布“青山绿水”计划
  19. Python400集大型视频,无偿分享,从正确方向学习python,全套python入门完整视频
  20. 24. 两两交换链表中的节点-两两反转链表-LeetCode

热门文章

  1. 7-50 畅通工程之局部最小花费问题 (35 分)(思路加详解)来呀兄弟们冲呀呀呀呀呀呀呀
  2. [JavaWeb-Servlet]Servlet的体系结构
  3. [剑指offer]面试题10:二进制中1的个数
  4. dfs中return回溯问题
  5. 计算机用英语表示方法有哪些,在计算机领域中,通常用英文单词“bit”来表示( )...
  6. Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul
  7. Java将五个整数存入整形数组_异常处理:从命令行输入5个整数,放入一整型数组,然后打印输出。。。...
  8. python2字符串编码方式_一、基础部分-2.字符串编码
  9. 串操作指令及其应用程序的设计与调试运行——汇编实验四 用8086汇编完成下题 编制一程序,从键盘输入两个长度不同的字符串,设字符串长度小于25个字符。要求在屏幕上以右边对齐的形式显示出
  10. Java开发Web Service的几种解决方案