首先是baseDAO,用来作为DAO的父类

package dao;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList; import jdbc.utils.JDBCUtils; public abstract class BaseDAO {
//使用PreparedStatement实现对不同表的通用的返回一个对象的查询操作
//使用泛型机制,参数里先传入一个类的类型
public <T> T getInstance(Connection con,Class<T> clazz,String sql,Object...args) {
PreparedStatement ps = null;
ResultSet res = null;
try {
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} //获得数据集和元数据集
res = ps.executeQuery();
ResultSetMetaData rsmd = res.getMetaData();
int col = rsmd.getColumnCount(); if(res.next()) {
T t = clazz.newInstance();
for(int i=0;i<col;i++) {
Object value = res.getObject(i+1); //要获得的数据值
String colLabel = rsmd.getColumnLabel(i+1); //要获得的元数据名称 //通过反射给t对象指定的colName属性赋值为value
Field field = clazz.getDeclaredField(colLabel); field.setAccessible(true);
field.set(t,value);
} System.out.println("执行成功");
return t;
} }
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(null, ps, res);
} return null;
} //返回对不同表的通用的返回多个对象的查询操作 --考虑上事物的版本
public <T> ArrayList<T> getForList(Connection con,Class<T> clazz,String sql,Object...args){
PreparedStatement ps = null;
ResultSet res = null;
try {
ps=con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} //获得数据集和元数据集
res = ps.executeQuery();
ResultSetMetaData rsmd = res.getMetaData();
int col = rsmd.getColumnCount(); ArrayList<T> list = new ArrayList<T>();
while(res.next()) {
T t = clazz.newInstance();
for(int i=0;i<col;i++) {
Object value = res.getObject(i+1); //要获得的数据值
String colLabel = rsmd.getColumnLabel(i+1); //要获得的元数据名称 //通过反射给t对象指定的colName属性赋值为value
Field field = clazz.getDeclaredField(colLabel);
field.setAccessible(true);
field.set(t,value);
} list.add(t);
}
System.out.println("执行成功");
return list;
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(null, ps, res);
}
return null;
} //用来处理聚合函数等只返回一个值的sql语句
public <T>T getValue(Connection con,String sql,Object...args){
PreparedStatement ps = null;
ResultSet res = null;
try {
ps = con.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
} res = ps.executeQuery();
System.out.println("查询成功");
if(res.next()) {
return (T)res.getObject(1);
}
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(null, ps, res);
}
return null;
} //通用增删改,参数为预编译的sql,和可变形参args用来充当占位符 --可处理事物版本
public int update(Connection con,String sql,Object ...args) {
PreparedStatement ps=null;
try {
//2.预编译sql,返回ps实例
ps=con.prepareStatement(sql);
//填充占位符,sql中的占位符个数=args数组长度
for(int i=0;i<args.length;i++) {
ps.setObject(i+1, args[i]);
}
//4.执行, excute()方法如果执行查询操作,则此方法返回true,如果执行增删改,则返回false
//ps.execute();
System.out.println("修改成功");
return ps.executeUpdate();
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
//5.关闭资源
JDBCUtils.closeResource(null, ps);
}
return 0;
}
}

设有一个类是student类

package bean;

import java.sql.Date;

public class Student {
private int studentId;
private String studentName;
private int studentAge;
private boolean studentSexy;
private Date studentBirthday;
private String classId;
public Student() {
super();
}
public Student(int studentId, String studentName, int studentAge, boolean studentSexy, Date studentBirthday,
String classId) {
super();
this.studentId = studentId;
this.studentName = studentName;
this.studentAge = studentAge;
this.studentSexy = studentSexy;
this.studentBirthday = studentBirthday;
this.classId = classId;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
this.studentAge = studentAge;
}
public boolean getStudentSexy() {
return studentSexy;
}
public void setStudentSexy(boolean studentSexy) {
this.studentSexy = studentSexy;
}
public Date getStudentBirthday() {
return studentBirthday;
}
public void setStudentBirthday(Date studentBirthday) {
this.studentBirthday = studentBirthday;
}
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
@Override
public String toString() {
return "Student [studentId=" + studentId + ", studentName=" + studentName + ", studentAge=" + studentAge
+ ", studentSexy=" + studentSexy + ", studentBirthday=" + studentBirthday + ", classId=" + classId
+ ", getStudentId()=" + getStudentId() + ", getStudentName()=" + getStudentName() + ", getStudentAge()="
+ getStudentAge() + ", getStudentSexy()=" + getStudentSexy() + ", getStudentBirthday()="
+ getStudentBirthday() + ", getClassId()=" + getClassId() + ", getClass()=" + getClass()
+ ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
} }

其对应的 sql中 表的格式为

要实现student的DAO,先设计一个接口类,申明所有方法

package dao;

import java.sql.Connection;
import java.sql.Date;
import java.util.ArrayList; import bean.Student; public interface StudentDAO {
void insert(Connection con,Student stu); void deleteById(Connection con,int id);
//把标号为id的表记录属性改为stu
void updateById(Connection con,int id,Student stu); Student getById(Connection con,int id); ArrayList<Student> getAll(Connection con); Long getCount(Connection con); String getMaxBirthday(Connection con);
}

然后是实现以上方法的studentDAOImpl

package dao;

import java.sql.Connection;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar; import bean.Student;
import jdbc.utils.JDBCUtils; public class StudentDAOImpl extends BaseDAO implements StudentDAO{ @Override
public void insert(Connection con, Student stu) {
String sql = "insert into student values(?,?,?,?,?,?)";
update(con,sql,stu.getStudentId(),stu.getStudentName(),stu.getStudentAge(),
stu.getStudentSexy(),stu.getStudentBirthday(),stu.getClassId()); } @Override
public void deleteById(Connection con, int id) {
String sql = "delete from student where stuid = ?";
update(con,sql,id);
} @Override
public void updateById(Connection con, int id, Student stu) {
String sql = "update student set stuName = ?,stuAge = ?,stuSexy = ?,stuBirthday = ?,classId = ?";
update(con,sql,stu.getStudentName(),stu.getStudentAge(),
stu.getStudentSexy(),stu.getStudentBirthday(),stu.getClassId());
} @Override
public Student getById(Connection con, int id) {
String sql = "select stuId as studentId,stuName as studentName,stuAge as studentAge from student where stuid = ?";
Student stu = getInstance(con,Student.class,sql,id);
return stu;
} @Override
public ArrayList<Student> getAll(Connection con) {
String sql = "select stuId as studentId,stuName as studentName,stuAge as studentAge from student";
ArrayList<Student> list= getForList(con,Student.class,sql);
return list;
} @Override
public Long getCount(Connection con) {
String sql = "select count(*) from student";
Long res = Long.valueOf(getValue(con,sql).toString());
return res;
} @Override
public String getMaxBirthday(Connection con) {
String sql = "select max(stuBirthday) from student";
return getValue(con,sql).toString();
} static public void main(String []args) {
Connection con = null;
StudentDAOImpl ob = new StudentDAOImpl();
try {
con = JDBCUtils.getConnection(); java.util.Date d = new java.util.Date(99,0,26);//从1900-1-1开始,
java.sql.Date date = new java.sql.Date(d.getTime()); Student stu = new Student(111,"周恩杰",20,true,date,"09031");
//ob.insert(con, stu); //ob.deleteById(con, 111);
stu.setStudentAge(21);
//ob.updateById(con, 111, stu); Student stu1 = ob.getById(con, 101);
System.out.println(stu1); ArrayList<Student> list = ob.getAll(con);
list.forEach(System.out::println); Long res = ob.getCount(con);
String ss = ob.getMaxBirthday(con);
System.out.println(res);
System.out.println(ss);
}
catch(Exception ex) {
ex.printStackTrace();
}
finally {
JDBCUtils.closeResource(con, null, null);
}
}
}

jdbc baseDAO 以及 每个类的继承的更多相关文章

  1. 基于hibernate的BaseDao及其实现类的设计

    以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了.但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来.不过,有了反射,我们可以通过泛型来实现我们想要做的功 ...

  2. UML类图(上):类、继承和实现

    面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. (转)Java:类与继承

    原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...

  5. iBatis.net 类的继承extends和懒加载

    <resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...

  6. python 类定义 继承

    0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...

  7. JS原型继承和类式继承

    前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...

  8. Java编程里类的继承

    今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ...

  9. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

随机推荐

  1. 在VMware中配置网卡之NAT模式

    为什么要在VMware中配置网卡? 因为在远程连接服务器时,需要虚拟机连接网络 虚拟机网络配置的三种模式:桥接模式,NAT模式,主机模式 NAT模式也称之为网络转换模式,两层路由: 第一层路由:物理机 ...

  2. java File类的使用以及一些函数

    package file; import java.io.File; import java.io.IOException; import org.junit.jupiter.api.Test; /* ...

  3. 【BZOJ2639】矩形计算(二维普通莫队)

    题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...

  4. [HDU2855]Fibonacci Check-up

    题目:Fibonacci Check-up 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 分析: 1)二项式展开:$(x+1)^n = \sum^ ...

  5. [CSP-S模拟测试]:蔬菜(二维莫队)

    题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...

  6. django搭建一个小型的服务器运维网站-重启服务器的进程

    目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...

  7. DirectX - External Overlay - 源代码

    Today i'm going to release a new version of my overlay.It's coded for beginners & users who want ...

  8. JS原型与原型链终极详解 (转载)

    这篇文章需要认认真真仔仔细细的看才能看懂 一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函 ...

  9. Redis 系列(02)数据结构

    目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...

  10. Java 编程技巧之数据结构

    前言: 介绍几种常见的java数据结构及应用. 使用HashSet判断主键是否存在 HashSet 实现 Set 接口,由哈希表(实际上是 HashMap )实现,但不保证 set  的迭代顺序,并允 ...