jdbc baseDAO 以及 每个类的继承
首先是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 以及 每个类的继承的更多相关文章
- 基于hibernate的BaseDao及其实现类的设计
以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了.但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来.不过,有了反射,我们可以通过泛型来实现我们想要做的功 ...
- UML类图(上):类、继承和实现
面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- (转)Java:类与继承
原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...
- iBatis.net 类的继承extends和懒加载
<resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...
- python 类定义 继承
0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...
- JS原型继承和类式继承
前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...
- Java编程里类的继承
今天,我们将要讨论的内容是Java里面类的继承的相关概念. 说到继承,我相信大家都不陌生.生活中,子承父业,子女继承父母的财产,这就是继承.实际上,Java里的继承也是如此.对于一个类来说,它的数据成 ...
- Java:类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...
随机推荐
- 在VMware中配置网卡之NAT模式
为什么要在VMware中配置网卡? 因为在远程连接服务器时,需要虚拟机连接网络 虚拟机网络配置的三种模式:桥接模式,NAT模式,主机模式 NAT模式也称之为网络转换模式,两层路由: 第一层路由:物理机 ...
- java File类的使用以及一些函数
package file; import java.io.File; import java.io.IOException; import org.junit.jupiter.api.Test; /* ...
- 【BZOJ2639】矩形计算(二维普通莫队)
题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...
- [HDU2855]Fibonacci Check-up
题目:Fibonacci Check-up 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 分析: 1)二项式展开:$(x+1)^n = \sum^ ...
- [CSP-S模拟测试]:蔬菜(二维莫队)
题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...
- django搭建一个小型的服务器运维网站-重启服务器的进程
目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...
- DirectX - External Overlay - 源代码
Today i'm going to release a new version of my overlay.It's coded for beginners & users who want ...
- JS原型与原型链终极详解 (转载)
这篇文章需要认认真真仔仔细细的看才能看懂 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函 ...
- Redis 系列(02)数据结构
目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 ...
- Java 编程技巧之数据结构
前言: 介绍几种常见的java数据结构及应用. 使用HashSet判断主键是否存在 HashSet 实现 Set 接口,由哈希表(实际上是 HashMap )实现,但不保证 set 的迭代顺序,并允 ...