用Hibernate 的感觉 搞来搞去的东西太多了。
用Ibatis 的感觉 和Hibernate 差不多。
他们两个用的文件甚多...弄来弄去。太麻烦了,无聊时间写了个
支持多种形式操作的 JDBC 操作数据库的持久方法
mport java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.xzj.common.DataBaseUtil;
/**
* Support Map String[] Object
*
* 参数必须是#name#形式
*
* 删除不支持多个相同的 ID 删除 如果要用只能用 String[] 形式传参
*
* @author Administrator
*
*/
public class JdbcAction implements Jdbc {
private Connection con;
private PreparedStatement ptmst;
private ResultSet rs;
public JdbcAction(){
con=DBConnection.getConnection();
}
/**
* 直接执行 add,update,delete Method
*
* @param sql
* @return Integer
*/
public int executeSQL(String sql){
int rows=0;
try {
ptmst=con.prepareStatement(sql);
rows=ptmst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DataBaseUtil.close(con, ptmst);
}
return rows;
}
/**
* 带参数的处理的 add,update,delete Method
* @param sql
* @param obj
* @return Integer
*/
public int executeSQL(String sql,Object obj){
int rows=0;
try {
con.setAutoCommit(false);
rows=executeSql(sql,obj).executeUpdate();
con.commit();
} catch (SQLException e) {
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
DataBaseUtil.close(con, ptmst);
}
return rows;
}
public Object selectObjResult(String sql,Object param,Object obj){
List<Object> list=selectResult(sql,param,obj);
return list.size()==0?null:list.get(0);
}
public List<Object> selectResult(String sql,Object param,Object obj){
List<Object> list=new ArrayList<Object>();
try {
rs=executeSql(sql,obj).executeQuery();
/**
* explain:
* get select result column name
*/
ResultSetMetaData rsmd=rs.getMetaData();
int columnCount=rsmd.getColumnCount();
String [] column=new String[columnCount];
for(int k=1;k<=columnCount;k++){
column[k-1]=rsmd.getColumnName(k);
}
/**
* get select data
*
*/
Object objSelect=null;
while(rs.next()){
try {
objSelect=obj.getClass().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
list.add(instantiationObjectData(objSelect,rs,column));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DataBaseUtil.close(con, ptmst, rs);
}
return list;
}
private Object getObjectValue(String columName,Object obj){
String methodName="";
Object rs=null;
try {
for(int k=0;k<obj.getClass().getDeclaredMethods().length;k++){
methodName=obj.getClass().getDeclaredMethods()[k].getName();
if(methodName.substring(0, 3).equals("get")&&methodName.substring(3, methodName.length()).toLowerCase().equals(columName.toLowerCase())){
rs=(Object) obj.getClass().getDeclaredMethods()[k].invoke(obj,new Object[]{});
break;
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
methodName=null;
return rs;
}
private static Object instantiationObjectData(Object obj,ResultSet rs,String [] column){
String methodName="";
for(int k=0;k<obj.getClass().getDeclaredMethods().length;k++){
methodName=obj.getClass().getDeclaredMethods()[k].getName();
try {
if(methodName.substring(0, 3).equals("set")){
for(int n=0;n<column.length;n++){
if(column[n].toLowerCase().equals(methodName.substring(3, methodName.length()).toLowerCase())){
obj.getClass().getDeclaredMethods()[k].invoke(obj,rs.getObject(column[n]));
break;
}
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
}
methodName=null;
return obj;
}
private PreparedStatement executeSql(String sql,Object obj){
//获得参数
String [] setParam=param(sql);
for(int k=0;k<setParam.length;k++){
sql=sql.replace("#"+setParam[k]+"#", "?");
}
try{
ptmst=con.prepareStatement(sql);
if(null!=obj){
if(obj instanceof String[]){
String [] paramArray=(String []) obj;
for(int k=0;k<setParam.length;k++){
ptmst.setObject(k+1,paramArray[k]);
}
}else if(obj instanceof int []){
int [] paramArray=(int []) obj;
for(int k=0;k<paramArray.length;k++){
ptmst.setObject(k+1,paramArray[k]);
}
}else if(obj instanceof Map){
Map map=(Map)obj;
for(int k=0;k<setParam.length;k++){
ptmst.setObject(k+1, map.get(setParam[k]));
}
}else {
for(int k=0;k<setParam.length;k++){
ptmst.setObject(k+1, getObjectValue(setParam[k],obj));
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return ptmst;
}
private String [] param(String sql){
String [] sqlSet=sql.trim().split("#");
String [] setParam=new String[sqlSet.length/2];
for(int k=0;k<setParam.length;k++){
setParam[k]=sqlSet[(k+1)*2-1];
}
return setParam;
}
}
那个数据库连接没写上去。。
不知道效率怎么样。没测试过。。里面还有好多需要优化。代码有些还不是很规范。。
下面是我用到的一些基本测试。
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.xzj.domain.Student;
public class JdbcTest {
public static void testSave(){
Jdbc jdbc=JdbcUtil.JdbcAction();
Map map=new HashMap();
map.put("name", "周星驰");
map.put("sex", "女");
map.put("age", new Date());
Student stu=new Student();
stu.setName("冰山");
stu.setSex("女");
stu.setAge(new Date());
String sql="insert into Student(name,sex,age) values(#name#,#sex#,#age#)";
jdbc.executeSQL(sql, map);
}
public static void testUpdate(){
Jdbc jdbc=JdbcUtil.JdbcAction();
Map map=new HashMap();
map.put("id", 2);
map.put("name", "周星驰");
map.put("sex", "男");
map.put("age", new Date());
String sql="update student set name=#name#,sex=#sex#,age=#age# where id=#id#";
jdbc.executeSQL(sql, map);
}
public static void testDelete(){
Jdbc jdbc=JdbcUtil.JdbcAction();
String [] sql={
"delete from Student where id=#id#",
"delete from Student where id=#id# or id=#id#",
"delete from Student where id=#id# or id=#id# or id=#id#"};
int []p={21,22,23};
jdbc.executeSQL(sql[2], p);
}
public static void testSelect(){
Jdbc jdbc=JdbcUtil.JdbcAction();
Student stu=new Student();
stu.setId(1001);
stu.setName("测试");
stu.setSex("女");
stu.setAge(new Date());
List<Object> list=jdbc.selectResult("select id,name,sex,age from Student",null,stu);
System.out.println("编号\t姓名\t性别\t年龄");
System.out.println("---------------------------------");
for(int k=0;k<list.size();k++){
stu=(Student) list.get(k);
System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getSex()+"\t"+stu.getAge());
}
}
public static void main(String [] args){
//testSave();
//testUpdate();
//testDelete();
testSelect();
}
}
import java.util.Date;
public class Student {
private Integer id;
private String name;
private String sex;
private Date age;
private String born;
public String getBorn() {
return born;
}
public void setBorn(String born) {
this.born = born;
}
public Date getAge() {
return age;
}
public void setAge(Date age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
希望各位能给出指点。。修改一些不必之处。。
分享到:
- 2009-02-06 17:57
- 浏览 959
- 评论(0)
- 论坛回复 / 浏览 (0 / 1512)
- 查看更多
相关推荐
TestYourVPS余晖脉脉的瞎改版,改自 的VPS一键测试脚本和 的Superbench,看看就好,诸位大佬们不要介意哈
Google 警告三星:不要瞎改 Linux 内核代码,会影响 Android 安全。 这到底是怎么一回事呢? 据 ZDNet 报道,根据 Google Project Zero (GPZ)的说法,三星试图通过修改内核代码来阻止对 Galaxy 智能手机的攻击,结果...
先打开再关闭把眼睛闪瞎
支持抖音(娱乐&电商&团购)无人直播、淘宝无人直播、快手(娱乐&电商&团购)无人直播、小红书无人直播、Tiktok无人直播、京东无人直播等多达12个平台的无人直播。全网支持平台最多的AI智能中控平台,全网率先开放Gpt...!
原始分辨率下文字太小,眼睛估计得看瞎 放大dpi后,这问题,那问题,好多 百度知道,淘宝,这网页文字颜色也非常的浅,看着眼睛很累人 看了半天是字体若的祸 暂时发现Arial与Tahoma字体,在dpi放大后,会出现这...
"行业制造-电动装置-LED模组瞎灯侦测电路、LED模组及其瞎灯侦测方法.zip"这个压缩包文件包含了一个关于LED模组瞎灯侦测的重要主题,这涉及到如何检测并处理LED模组中的故障灯珠,以确保整体照明效果的稳定性和可靠性...
瞎写.c
这个是我参加2017数模,自己瞎编的一个具有空间连续性的仿元胞自动机的鬼东西。。。。。为了实现了交通流模拟中的安全距离和啥的,里面有交通流换道等。。。因为我自己改得也很混乱,大家有什么问题可以问我哦~ 欢迎...
直接扔项目Assets下随便文件夹里,在Tools窗口下找到Text变化工具就是了 选择Canvas组件或者要改的字体父物体,拖拽上去获取所有子物体...改项目字体时闲麻烦瞎写的,轻喷,免费送了,注释详细编写简单,可以自己再改改
瞎做的,文字内容可以自己改。对了打开这个千万不能盯着屏幕看很长时间。我是个编程小白,还请各位大佬多多关照。
网上书店销售系统,有用户注册、登陆、购买、查询等;还有管理员的添加、删除、修改、书籍等等 不要下啊,瞎传的
七只瞎老鼠PPT模板.pptx
瞎写着玩的MyRequest.rar
由于支持换行,而且需要带光标,找了好久也没有现成的代码可用,也只能自己瞎改。 光标的位置计算,采用了3个CCTextfiled作为计算参考,而且在输入每个字符的时候都会创建,效率自己不会很高。 代码是改的,很垃圾。 ...
2023新版视频通话照妖镜多模板 ... ...否则生成的链接是不能进行拍照的 新增邮箱通知功能(方便第一时间查看照片) live/images/FM 文件内图片为随机背景封面 ...可自行ps增加背景封面图片 ...请勿瞎改
2023新版视频通话照妖镜 多模板需开启https (ssl证书协议,百度ssl,宝塔自带免费)注意:请开启强制https://(ssl协议)否则生成的链接是不能进行拍照的新增邮箱通知功能(方便第一时间查看照片)live/...请勿瞎改
瞎爬爬 网易云音乐评论
【标题】:“自己瞎写的仿QQ程序” 这个标题暗示了一个个人项目,可能是一个初学者或者爱好者尝试模仿腾讯QQ的功能而创建的一个简易通讯软件。QQ是中国非常流行的一款即时通讯工具,它提供了聊天、文件传输、群组...
也有程序直接把文字写在java程序了,所以在smali目录下也可能会有一些,smali目录的.smali文件是对java文件的解析,不能瞎改,汉化的话要注意,搜索整个目录,找到你要汉化的文字,替换成就行,注意,里面的参数别瞎改,不然...