JDBC封装
在模拟servlet调用dao中,我们发现在dao的实现类中有许多重复代码,我们可以将其封装起来。
步骤:
一. 创建一个类 DBUtil
1加载驱动和建立链接的代码 完全一样
加载驱动写到静态代码快中 :因为 驱动只需要加载一次即可 比如:你安装了一台电脑 只需要下载一次qq 以后直接使用就可以了
类的静态代码块 随着类的加载 只执行一次
建立连接的代码 单独创建一个方法 通过返回值返回连接对象:为什么连接要连接多次?因为来连接用完了就关闭了
2 关闭的代码也需要封装
3 增删改的预处理代码 也基本一样
4.查询单独封装
A List<Map<String,Object>>
B 如果我们不知道表有哪些列 该怎么办?
出现什么问题:1 我们不能根据列名获取该列对应的数据
2 在存储到map中的时候 也不知道该用什么key来映射
解决方案: 1 可以通过列的编号取数据
2 可以通过列的编号获取列名
出现的问题: 我们可以通过列的编号获取列的名字和数据,那么我们不确定一张表有多少列,取得时候上限是多少呢?
解决方案 : 可以获取一张表有多少列
代码如下:
/**
* JDBC工具类
*/
public class DBUtil {
//注册驱动代码
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//建立连接
public static Connection getConnection(){
try {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEnconding=UTF-8", "root", "root");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/** 增删改的通用方法
* @paramString sql 要执行的sql
* @paramObject[] obj 对象类型的数组 里面存放着 sql执行的占位符参数
* 【name,age,id】
* 【id】
* 【name,age】
* Object... 可变参数
* */
public static boolean executeUpdate(String sql,Object... args){
Connection conn = null;
PreparedStatement ps = null;
try {
conn = getConnection();
ps = conn.prepareStatement(sql); for (int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
int i = ps.executeUpdate(); if (i>0)return true;
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭
close(conn,ps,null);
}
return false;
} /**
* 查询的通用方法
* @param sql
* @param args
* @return
*/
public static List<Map<String,Object>> executeQuery(String sql,Object... args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet set = null;
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
/* 有可能有参数 */
for (int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
/*执行*/
set = ps.executeQuery();
/*需要将所有数据都存放到 List中 每一行 用一个 map存放*/
List<Map<String,Object>> list = new ArrayList<>();
/*获取本次查询结果集有多少列*/
int count = set.getMetaData().getColumnCount(); while(set.next()){
Map<String, Object> map = new HashMap<>();//一行数据 用一个map 接收 for(int i=0;i<count;i++){
String name = set.getMetaData().getColumnLabel(i+1);
map.put(name,set.getObject(name));
}
/*将每行的map存放到 List中*/
list.add(map);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally {
close(conn,ps,set);
}
return null;
} /** 关闭的通用方法
*
* */
private static void close(Connection conn,PreparedStatement st,ResultSet set){
try {
if(set!=null){
set.close();
}
if(st!=null){
st.close();
}
if(conn != null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
} }
二.使用工具类前的代码:

三.使用后的代码:
public class StudentDAOImpl implements IStudentDAO {
//增加
@Override
public boolean add(Student s) {
String sql = "insert into student (name,age) values (?,?)";
return DBUtil.executeUpdate(sql,s.getName(),s.getAge());
}
//删除
@Override
public boolean delete(int id) {
String sql = "delete from student where id = ?";
return DBUtil.executeUpdate(sql,id);
}
//修改
@Override
public boolean update(Student s) {
String sql = "update student set name=?,age=? where id = ?";
return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId());
}
//查询,结果封装成map(只能查一条)
@Override
public Map<String, Object> getStudent(int id) {
String sql = "select * from student where id = ?";
List<Map<String, Object>> list = DBUtil.executeQuery(sql, id);
if(list.size()>0){
return list.get(0);
}
return null;
}
//查询,多条map放进list集合中
@Override
public List<Map<String, Object>> getAllStudent() {
String sql = "select * from dog";
return DBUtil.executeQuery(sql);
}
}
JDBC封装的更多相关文章
- 优化JDBC封装
可重用性较强的JDBC封装 以下为代码,注释中写了主要思想 主类 com.util.JDBCUtil.java package com.util; import java.lang.reflect.F ...
- jdbc封装代码
jdbc封装代码 package jdbcUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- JDBC封装的工具类
1. JDBC封装的工具类 public class JDBCUtil { private static Properties p = new Properties(); private static ...
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...
- Mysql,JDBC封装
1.完成对数据库的表的增删改的操作 2.查询返回单条记录 3.查询返回多行记录 4.可以使用反射机制来封装,查询单条记录 5.反射机制,查询多条记录 package myjdbc; import ja ...
- Java JDBC封装模式
模仿DBUtils里面的一些用法,下面是一些简单的实现数据集的操作的方法 下面使用到的两个bean.首先是userbean package bean; public class user { Stri ...
- Springmvc对就jdbc封装的操作
解释: JdbcTemplate 封装常用的JDBC方法 HibernateTemplate 封装常用Hibernate方法 JdbcDaoSupport JDBC数据访问对象的基类 Hibern ...
- 使用DbUtils对JDBC封装实现面向实体查询
直接上代码 package org.smart4j.chapter2.helper; import org.apache.commons.dbcp2.BasicDataSource; import o ...
- Phoenix的jdbc封装
一.Phoenix版本 <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>p ...
随机推荐
- Java Swing 简单介绍
Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...
- 读书笔记 C# 接口之浅析
一.接口可以包含 属性.方法.事件和索引器: 二.接口不能被实例化: 三.一个类可以继承多个接口: 四.接口不能包含方法的实现: 五.继承接口的类必须实现接口中所有成员: 六.显式实现接口的成员,不能 ...
- Android : App通过LocalSocket 与 HAL间通信
LocalSocket其通信方式与Socket差不多,只是LocalSocket没有跨越网络边界.对于*nix系统来说,“一切皆为文件”,Socket也不例外,Socket按照收发双方的媒介来说有三种 ...
- Java 中的代理模式及动态代理
原文:https://blog.csdn.net/briblue/article/details/73928350
- Effective Java (ENUM篇)
我们存放一些静态变量,像是一些变量和设置,等等等等,我们尽量使用ENUM,因为ENUM是不可实例化和继承的,所以他很安全,它是在程序一开始运行的时候进行一些编译,修改ENUM不需要再次编译. 在什么时 ...
- os.path和sys.path的区别
os.path是module,包含了各种处理长文件名(路径名)的函数. sys.path是由目录名构成的列表,python从中查找扩展模块(python源模块)编译模块,或者二进制扩展),启动pyth ...
- Day10作业及默写
1,继续整理函数相关知识点,写博客. 2,写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*number): sum=0 for num in number: sum+=nu ...
- opendressinghash //use resize array
public class opendressinghash<Key, Value> { private static final int INIT_CAPACITY = 4; privat ...
- laravel 添加验证码
1. 安装依赖 composer require gregwar/captcha 2.使用 use Gregwar\Captcha\CaptchaBuilder; use DB; use Requ ...
- Window下部署Maven Nexus
Nexus下载地址:https://www.sonatype.com/download-oss-sonatype 选择相应的版本下载后,本人下载的是nexus-2.12.0-01-bundle.zip ...