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 ...
随机推荐
- 每天CSS学习之border-spacing
border-spacing是CSS2的一个属性.其作用是规定表格的相邻单元格边框之间的距离.如果表格的border-collapse属性值为collapse时,border-spacing设置无效. ...
- 生产者与消费者问题,C++利用bind基于对象实现与面向对象实现
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- win10企业版激活
slmgr.vbs /upk slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /skms zh.us.to slmgr /ato
- page指令import属性实例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- SimpleDateFormat的安全问题解决方法
问题: SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类. 而且SimpleDateFormat ...
- mybatis-generator没有自动生成代码和Junit测试controller
本来mybatis的generator想要自动生成增删改的,但是到后来语句就两个select,原因是数据中没有给字段加primary,就不会有删改增. 以及Controller的Junit测试 先导入 ...
- linux各种系统下载地址
1.Arch Linux Arch Linux在安装过程中提供了强大的可定制选择,支持你下载和安装自己所需的程序包.虽然这个选择对新手来说没有多大的帮助,但是它确实能够帮助那些使用Arch构建系统和存 ...
- robotframework·WEB端基础
date:2018526 day10 一.导入库 导入的库分两种,一种是导入常用库,如String.Collections等(Library String.Collections,再运用库中的关键字) ...
- 微信小程序中时间转化为时间戳(安卓和苹果兼容性)
在IOS中时间显示NAN,后来才知道是由于安卓和IOS时间解析时间的时间格式不一致: 在安卓机中2018-06-21 16:00:21 IOS识别的格式是 2018/06/21: 所以在处理IOS机器 ...
- threejs绘制顺序
renderer.sortObjects = false; 然后,scene.add(),就可以先add先画了,否则add的顺序和渲染出来的顺序不一定一致.