首先是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. SCJP读书之知识点:

    1:实例变量和局部变量 实例变量:是在类中进行声明的,可以有public,private等修饰符进行修饰. 局部变量:在方法中进行声明,生命周期就是方法开始,到方法结束.但是可以进行对象的引用来调用. ...

  2. win 10配置安装iis

    站长喜欢本地配置iss调试网站后发布到网上,但是前提是系统得配置好iis.随着Win10的出现,越来越多的人装上了Win10, 但是小编最近发现很多旧版本windows系统用户在升级到windows ...

  3. 9.28 linux系统基础优化

    关闭SELinux(是美国安全局对强制访问的实现)功能 [root@wen ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selin ...

  4. delphi 程序嵌入桌面效果的实现

    function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN; var dc, dc_c: HDC; ...

  5. Distinctive Character

    Distinctive Character Sol bfs寻找最优解. 考虑一开始把他给的状态加进队列里,这些状态的答案都是0. 每次枚举不同的一位拓展,同时要保证这个新状态没有出现过. 效率O(2^ ...

  6. 【系统架构理论】一篇文章精通:Spring Cloud Netflix Eureka

    是官方文档的总结 http://spring.io/projects/spring-cloud-netflix#overview 讲解基于2.0.2版本官方文档 https://cloud.sprin ...

  7. Hibernate:More than one row with the given identifier was found解决办法

    今天写一个Action 通过 HQL 查询一个表 出现异常 “More than one row with the given identifier was found” 问题原因: 数据库出现数据异 ...

  8. 如何利用nginx实现负载均衡(总结)

    如何利用nginx实现负载均衡(总结) 一.总结 一句话总结: 推荐使用nginx七层(应用层)负载均衡的实现:配置那是相当的简单 1.nginx配置实例? |||-begin #这里的域名要和下面p ...

  9. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

  10. delphi在64位系统下写注册表注意事项

    HKEY_LOCAL_MACHINE写这个主键下的项,在64位系统下可能会重定向,所以构造时要加KEY_WOW64_64KEY reg := TRegistry.Create(KEY_WRITE or ...