JDBC操作封装
这两天学习了一下jdbc的封装,依据的是下面这篇
http://wenku.baidu.com/link?url=FaFDmQouYkKO24ApATHYmA5QzUcj-UE-7RSSZaBWPqkKB8i13eYw2LGGEsgs_BRyBf7vB_zgB0vBxFXvhXhmLzBfBEPzPCvMvzMvesUwOzW
然后在它的基础上作了修改,简化参数,做了数据类型方面的休整。还不算完全成型,因为对“0”的处理还没有好的解决方案。下面贴出代码。
先贴一个Student实体类
package com.some.entity; import java.io.Serializable;
import java.sql.Date; public class Student implements Serializable {
private int id;
private String stuNumber;
private String stuPassword;
private String stuName;
private String stuSex;
private String stuIdentification;
private String stuIsGat;
private String stuPhone;
private int departmentId;
private int majorId;
private String gradeNow;
private int nationMark;
private String bithday;// 格式为2015/10/13
private String address;
private String politics; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getStuNumber() {
return stuNumber;
} public void setStuNumber(String stuNumber) {
this.stuNumber = stuNumber;
} public String getStuPassword() {
return stuPassword;
} public void setStuPassword(String stuPassword) {
this.stuPassword = stuPassword;
} public String getStuName() {
return stuName;
} public void setStuName(String stuName) {
this.stuName = stuName;
} public String getStuSex() {
return stuSex;
} public void setStuSex(String stuSex) {
this.stuSex = stuSex;
} public String getStuIdentification() {
return stuIdentification;
} public void setStuIdentification(String stuIdentification) {
this.stuIdentification = stuIdentification;
} public String getStuIsGat() {
return stuIsGat;
} public void setStuIsGat(String stuIsGat) {
this.stuIsGat = stuIsGat;
} public String getStuPhone() {
return stuPhone;
} public void setStuPhone(String stuPhone) {
this.stuPhone = stuPhone;
} public int getDepartmentId() {
return departmentId;
} public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
} public int getMajorId() {
return majorId;
} public void setMajorId(int majorId) {
this.majorId = majorId;
} public String getGradeNow() {
return gradeNow;
} public void setGradeNow(String gradeNow) {
this.gradeNow = gradeNow;
} public int getNationMark() {
return nationMark;
} public void setNationMark(int nationMark) {
this.nationMark = nationMark;
} public String getBithday() {
return bithday;
} public void setBithday(String bithday) {
this.bithday = bithday;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getPolitics() {
return politics;
} public void setPolitics(String politics) {
this.politics = politics;
}
}
Student.java
然后是数据库连接工具类
package com.sql.util; import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; public class DatabaseConnection {
private static final String driver = "com.mysql.jdbc.Driver";// 数据库驱动
private static final String url = "jdbc:mysql://localhost:3306/sports_test";// 链接数据库名称
// ,localhost替换成域名
private static final String user = "root";// mysql的登陆用户名
private static final String password = "1234";// mysql的登陆密码
private Connection conn = null; public DatabaseConnection() throws Exception {// 在构造方法中进行数据库连接
try {
Class.forName(driver);//实现静态方法
this.conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
} public Connection getConnection() {
return this.conn;
} public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} public static void closePreparedStatement(PreparedStatement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
DatabaseConnection.java
顺便贴一个简易hash函数
package com.change.util; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public final class GetHash {
public static String getMD5(String str){
String hashedStr=null;
try{
MessageDigest md=MessageDigest.getInstance("MD5");
md.update(str.getBytes());
byte ss[]=md.digest();
hashedStr=bytes2String(ss);
}catch(NoSuchAlgorithmException e){ }
return hashedStr;
} private static String bytes2String(byte[] aa){
String hash="";
for(int i=0;i<aa.length;i++){
int temp;
if(aa[i]<0){
temp=256+aa[i];
}else{
temp=aa[i];
}
if(temp<16){
hash+="0";
}
hash+=Integer.toString(temp,16);
}
hash=hash.toUpperCase();
return hash;
} // public static void main(String[] args) {
// String a="123456";
// String b="1234567";
// String c="fast";
// String hashA=GetHash.getMD5(a);
// String hashB=GetHash.getMD5(b);
// String hashC=GetHash.getMD5(c);
// System.out.println(hashA);
// System.out.println(hashB);
// System.out.println(hashC);
// //E10ADC3949BA59ABBE56E057F20F883E
// //FCEA920F7412B5DA7BE0CF42B8C93759
// //31D4541B8E926A24F0C9B835B68CFDF3
// }
}
GetHash.java
顺便贴一个转换编码的类,有时做下载功能的时候需要用到
package com.change.util; import java.io.UnsupportedEncodingException; public class ChangeISO {
public static String parseGBK(String sIn) {
if ((sIn == null) || (sIn.equals(""))) {
return sIn;
}
try {
return new String(sIn.getBytes("GBK"), "ISO-8859-1");
} catch (UnsupportedEncodingException usex) {
}
return sIn;
} public static String parseUTF8(String sIn) {
if ((sIn == null) || (sIn.equals(""))) {
return sIn;
}
try {
return new String(sIn.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException usex) {
}
return sIn;
}
}
Change
最后就是jdbc增删查改的封装了,有了这个感觉方便很多,不需要像以前一个操作写一大坨函数,我真是太笨了= =
package com.sql.util; import java.security.Timestamp;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal; import com.change.util.GetHash;
import com.some.entity.Student; /**
* @see 这个类用于封装sql操作
*/
public class DatabaseOperator { /**
* @param conn
* Connection对象
* @param obj
* vo对象(实体)
* @param sql
* StringBuilder 对象
* @return List集合
* @throws Exception
*/ public static List<?> getSelectList(Connection conn, Object obj,
StringBuilder sql) {
int isFirstParameter = 0;
// 用于装入vo对象中设置属性值的真实属性值
List<Object> fieldValue = new ArrayList<>();
// 返回一个list集合,装的是执行过查询的集合,集合resultList装的一般是vo对象
List<Object> resultList = new ArrayList<>(); try {
// 获取对象的所属的类
Class<?> c = obj.getClass();
// 取得本类的全部属性
Field[] f = c.getDeclaredFields(); for (int i = 0; i < f.length; i++) {
String name = f[i].getName();
String get = DatabaseOperator.getGos("get", name); // Java 反射机制中 getMethod()和getDeclaredMethod()区别
// getMethods()和getDeclaredMethods()区别
// 前者只返回共有方法 后者返回全部3种(不包括继承)
Method m = c.getDeclaredMethod(get);
Object value = m.invoke(obj);
if (value != null && value != ""
&& !String.valueOf(value).equals("0")) {
System.out.println(value);
// 如果是第一个条件参数,不需要加上and
if (isFirstParameter == 0) {
sql.append(" " + name + " = ?");
isFirstParameter++;
// 填入要附加的条件参数
fieldValue.add(value);
} else {
sql.append(" and " + name + " = ?");
// 填入要附加的条件参数
fieldValue.add(value);
} }
}
System.out.println(sql);
PreparedStatement ps = conn.prepareStatement(sql.toString());
for (int i = 0; i < fieldValue.size(); i++) {
// System.out.println(fieldValue.size());
// System.out.println(fieldValue.get(i));
ps.setObject(i + 1, fieldValue.get(i));
}
// 定义结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Object o = c.newInstance();
// f是本类全部属性
for (int i = 0; i < f.length; i++) {
String name = f[i].getName();
// System.out.println(name);
String set = DatabaseOperator.getGos("set", name);
// System.out.println(set);
// 获取类的set方法
// System.out.println(f[i].getType());
Method m = c.getDeclaredMethod(set, f[i].getType());
m.setAccessible(true);
// System.out.println(m.getName());
Object value = rs.getObject(i + 1);
// System.out.println(value + "======");
if (value != null) {
// String r = f[i].getType().toString();
// System.out.println(r);
String rsType = value.getClass().getSimpleName();
// System.out.println(rsType + "++++"); // 判断从数据库读出的数据的数据类型,这里比较奇怪
if (rsType.equals("Long")) {
m.invoke(o, Integer.parseInt(value.toString()));
} else if (rsType.equals("Integer")) {
m.invoke(o, value);
} else if (rsType.equals("Double")) {
m.invoke(o, ((BigDecimal) value).doubleValue());
} else if (rsType.equals("Float")) {
m.invoke(o, ((BigDecimal) value).floatValue());
} else if (rsType.equals("Date")
|| rsType.equals("Timestamp")) {
// System.out.println("da");
if (rsType.equals("Date")) {
m.invoke(o, ((Date) value).toString());
} else {
m.invoke(o, ((Timestamp) value).toString());
}
} else if (rsType.equals("String")) {
m.invoke(o, value);
} else {
// System.out.println("未知");
}
}
}
resultList.add(o);
}
return resultList; } catch (Exception e) {
e.printStackTrace();
} return resultList;
} /**
*
* @param conn
* Connection对象
* @param sql1
* StringBuilder 可以增加长度,用于拼接指定的需要插入的列名
* @param obj
* vo对象
* @return int 0,1执行结果
* @throws Exception
*/
public static int doInsert(Connection conn, StringBuilder sql1, Object obj)
throws Exception {
Class<?> c = obj.getClass();
Field[] f = c.getDeclaredFields();
// StringBuilder 可以增加长度,用于拼接values后面的属性值
StringBuilder sql2 = new StringBuilder();
// 用于装入vo对象中设置属性值的真实属性值
List<Object> fieldValue = new ArrayList<>(); sql1.append("(");
sql2.append("values(");
for (int i = 0; i < f.length; i++) {
String name = f[i].getName();
String get = getGos("get", name);
Method m = c.getDeclaredMethod(get);
Object value = m.invoke(obj); if (value != null && value != ""
&& !String.valueOf(value).equals("0")) {
sql1.append(name + ",");
sql2.append("?,");
fieldValue.add(value);
}
} int j = sql1.length() - 1;
if (sql1.lastIndexOf(",") == j) {
int start = sql1.length() - 1;
int end = sql1.length();
sql1.replace(start, end, "");
}
int k = sql2.length() - 1;
if (sql2.lastIndexOf(",") == k) {
int start = sql2.length() - 1;
int end = sql2.length();
sql2.replace(start, end, "");
}
sql1.append(")");
sql2.append(")");
StringBuilder sql = sql1.append(sql2);
System.out.println(sql); PreparedStatement ps = conn.prepareStatement(sql.toString());
// System.out.println(fieldValue.size());
for (int i = 0; i < fieldValue.size(); i++) {
// System.out.println(fieldValue.get(i));
ps.setObject(i + 1, fieldValue.get(i));
}
// 执行
int result = ps.executeUpdate();
return result;
} /**
* @param conn
* Connection对象
* @param sql
* 删除的sql语句(index:delete from student)
* @param id
* 删除的主键
* @return int 0,1执行结果
*/
public static int doDelete(Connection conn, String sql, String primaryKey,
int id) {
sql = sql + " where " + primaryKey + " = ?";
int result = 0;
try {
System.out.println(sql);
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
} /**
* @param conn
* Connection对象
* @param sql
* 要执行的sql语句
* @param obj
* 一般是vo对象
* @param primaryKey
* 表中的主键, 更新是基于主键更新的
* @return int 0,1执行结果
* @throws
*/
public static int doUpdate(Connection conn, StringBuilder sql, Object obj,
String primaryKey, Integer id) throws Exception {
Class<?> c = obj.getClass();
Field[] f = c.getDeclaredFields();
// list类型,用于在程序计数传入的属性值
List<Object> fieldValue = new ArrayList<>(); sql.append(" set"); for (int i = 0; i < f.length; i++) {
String name = f[i].getName();
String get = getGos("get", name);
Method m = c.getDeclaredMethod(get);
Object value = m.invoke(obj); int j = name.toLowerCase().indexOf(primaryKey.toLowerCase());
if (value != null && value != "" && j < 0) {
// System.out.println(f[i].getName());
sql.append(" " + name + " = ?,");
fieldValue.add(value);
}
} // 去掉最后一个逗号
int k = sql.length() - 1;
if (sql.lastIndexOf(",") == k) {
int start = sql.length() - 1;
int end = sql.length();
sql.replace(start, end, "");
} if (id != null) {
sql.append(" where " + primaryKey + " = ?");
} System.out.println(sql);
PreparedStatement ps = conn.prepareStatement(sql.toString());
for (int i = 0; i < fieldValue.size(); i++) {
// System.out.println(fieldValue.get(i));
ps.setObject(i + 1, fieldValue.get(i));
}
if (id != null) {
ps.setObject(fieldValue.size() + 1, id);
System.out.println(id);
}
int result = ps.executeUpdate();
System.out.println(result);
return result;
} /**
* @see getGos是获取get或者set,用于得到一个属性的get和set方法,例如getName()
* @param s:set 或者 get @param name:属性
*
* @return String类型
*/
public static String getGos(String s, String name) {
String str = s + name.substring(0, 1).toUpperCase() + name.substring(1);
return str;
} public static void main(String[] args) {
DatabaseConnection dc = null;
try {
dc = new DatabaseConnection();
Connection conn = dc.getConnection(); // // 查询
// Student student1 = new Student();
// // student1.setStuNumber("14020031096");
// StringBuilder sql1 = new StringBuilder();
// // sql1.append("select * from student where");
// sql1.append("select * from student");
// @SuppressWarnings("unchecked")
// List<Student> stuList = (List<Student>) DatabaseOperator
// .getSelectList(conn, student1, sql1);
// System.out.println(stuList.get(0).getStuNumber());
// System.out.println(stuList.get(0).getId());
// for (int i = 0; i < stuList.size(); i++) {
// System.out.println(stuList.get(i).getStuName());
// } // 增加
// Student student2 = new Student();
// student2.setStuName("萌重宝宝");
// student2.setStuNumber("22222222222");
// student2.setStuPassword(GetHash.getMD5("123456"));
// StringBuilder sql2 = new StringBuilder();
// sql2.append("insert into student");
// int result=doInsert(conn, sql2, student2);
// if(result==1){
// System.out.println("insert成功");
// }else{
// System.out.println("insert失败");
// } // 删除
// String sql3 = "delete from student";
// String primaryKey = "id";
// int id = 15458;
// int result=doDelete(conn, sql3, primaryKey, id);
// if(result==1){
// System.out.println("delete成功");
// }else{
// System.out.println("delete失败");
// } // 更新
// Student student4 = new Student();
// student4.setStuName("萌重儿子");
// StringBuilder sql4 = new StringBuilder();
// sql4.append("update student");
// String primaryKey = "id";
// int id = 15456;
// DatabaseOperator.doUpdate(conn, sql4, student4, primaryKey, id);
} catch (Exception e) {
e.printStackTrace();
} }
}
DatabaseOperator
主要是4个函数,还有一个拼接字符串函数,主函数是使用范例。
啦啦啦跑步去
JDBC操作封装的更多相关文章
- 玩转Spring全家桶笔记 03 Spring的JDBC操作以及SQL批处理的实现
1 spring-jdbc core JdbcTemplate 等相关核心接口和类(核心) datesource 数据源相关的辅助类(内嵌数据源的初始化) object 将基本的JDBC操作封装成对象 ...
- jdbc操作mysql(三):利用注解封装
案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...
- jdbc操作mysql(二):封装
案例四:封装共有操作 封装一个数据库的会话的类 import java.sql.*; public class ConnectionUtil { /** * 获取连接对象的方法,返回一个Connect ...
- Java的JDBC操作
Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...
- jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...
- Java使用Jdbc操作MySql数据库(一)
这个示例是Java操作MySql的基本方法. 在这个示例之前,要安装好MySql,并且配置好账户密码,创建一个logininfo数据库,在数据库中创建userinfo数据表.并且在表中添加示例数据. ...
- 使用JdbcTemplate简化JDBC操作 实现数据库操作
使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高. Spring JDBC框架由4个部分组成,即core.datasource.object.support. org ...
- 简单通用JDBC辅助类封装
哎,最近很好久没在博客园写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernate 里面的SimpleJdbcTemplate,这里 ...
- jdbc操作mysql
本文讲述2点: 一. jdbc 操作 MySQL .(封装一个JdbcUtils.java类,实现数据库表的增删改查) 1. 建立数据库连接 Class.forName(DRIVER); connec ...
随机推荐
- IOS设备设计完整指南(转载)
http://blog.sina.com.cn/s/blog_6cc9af670102vq12.html
- Javascript base64加密 解密
var base64encodechars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ...
- Oracle表空间常用操作
--创建表空间 create tablespace test datafile 'E:\test2_data.dbf' SIZE 20M autoextend on next 5M maxsize 5 ...
- 使用Kotlin开发Android应用(I):简单介绍
使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...
- hdu 4521 线段树改点求点的应用
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- netty demo
Netty 4.0 demo netty是一个异步,事件驱动的网络编程框架&工具,使用netty,可以快速开发从可维护,高性能的协议服务和客户端应用.是一个继mina之后,一个非常受欢迎的 ...
- java命令行运行main时jar及其配置
run.bat中的内容如: set mypath=%cd%/../set classpath=%mypath%\conf;%mypath%\lib\*start /b java -Xms64m -Xm ...
- WCF学习心得
之前很经常听说WCF,不过没有怎么接触过,直到最近才真正使用到WCF,虽然也只是皮毛而已,在此也做个记录总结吧. 下图是我使用WCF的练手项目,由于是使用VS2010直接创建的WCF服务应用程序,VS ...
- 删除数组中等于某个key的所有元素
题目描述: 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 这道题目做暴力的想法就是,用一个指针从头到尾遍历,删除哪个元素就把后面的元素统一向前移动一个位置.但是这样的时间复杂度很 ...
- strcat()的编写
1.strcat() #include <windows.h> #include <assert.h> #include <iostream> //strcat() ...