package cn.javass.common.db;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public abstract class JDBCTemplate<M,Q extends M> {
public M getByUuid(Q qm,int uuid) {
Q q = null;
try {
q = (Q) qm.getClass().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
Method ms[] = qm.getClass().getMethods();
for(Method mth : ms){
if(mth.getName().equalsIgnoreCase("setUuid")){
try {
mth.invoke(q, uuid);
} catch (Exception e) {
e.printStackTrace();
}
}
}
List<M> list = this.getByCondition(q,1,100,new ArrayList<String>());
if(list!=null && list.size()>0){
return list.get(0);
}
return null;
}
public List<M> getAll(Q qm,int fromNum,int toNum) {
Q q = null;
try {
q = (Q) qm.getClass().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return this.getByCondition(q,fromNum,toNum,new ArrayList<String>());
}
public int getCount(Q qm){
return this.getCount(qm, new ArrayList<String>());
}
public int getCount(Q qm,List<String> excludeName) {
int count = 0;
Connection conn = null;
try{
//1
conn = DbConn.getConn();
//2:
String sql = this.getCountMainSql(qm);
sql = this.prepareSql(sql, qm,excludeName);
System.out.println("sql=="+sql);
//3:
PreparedStatement pstmt = conn.prepareStatement(sql);
//4:
this.setValue(pstmt, qm,0,0,excludeName);
//5:
ResultSet rs = pstmt.executeQuery();
rs.next();
count = rs.getInt(1);
//6:
rs.close();
pstmt.close();
}catch(Exception err){
err.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return count;
}
public List<M> getByCondition(Q qm,int fromNum,int toNum){
return this.getByCondition(qm, fromNum,toNum,new ArrayList<String>());
}
public List<M> getByCondition(Q qm,int fromNum,int toNum,List<String> excludeName) {
List<M> list = new ArrayList<M>();
Connection conn = null;
try{
//1
conn = DbConn.getConn();
//2:
String sql = this.getQueryByConditionMainSql(qm);
sql = this.prepareSql(sql, qm,excludeName);
//翻页
sql = this.needPageSql(sql);
System.out.println("sql=="+sql);
//3:
PreparedStatement pstmt = conn.prepareStatement(sql);
//4:
int count = this.setValue(pstmt, qm,fromNum,toNum,excludeName);
this.setPageValue(pstmt, count, fromNum, toNum);
//5:
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
M tempM = this.rs2model(rs,qm);
list.add(tempM);
}
//6:
rs.close();
pstmt.close();
}catch(Exception err){
err.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
private String needPageSql(String sql){
String str = "with aa as ("+sql+") select * from aa where r>=? and r<=?";
return str;
}
protected String getQueryByConditionMainSql(Q m)throws SQLException {
return this.getQueryByConditionMainSqlSelectPart(m)+this.getQueryByConditionMainSqlFormPart(m)+this.getQueryByConditionMainSqlWherePart(m);
}
protected String getQueryByConditionMainSqlSelectPart(Q m)throws SQLException {
return "select rownum r,t.* ";
}
protected String getQueryByConditionMainSqlFormPart(Q m)throws SQLException {
String tempStr = m.getClass().getSuperclass().getSimpleName();
tempStr = tempStr.substring(0,tempStr.length()-5);
return " from tbl_"+tempStr+" t ";
}
protected String getQueryByConditionMainSqlWherePart(Q m)throws SQLException {
return " where 1=1 ";
}
protected String getCountMainSql(Q m)throws SQLException {
String tempStr = m.getClass().getSuperclass().getSimpleName();
tempStr = tempStr.substring(0,tempStr.length()-5);
String sql = "select count(*) from tbl_"+tempStr+" t where 1=1 ";
return sql;
}
protected String prepareSql(String sql,Q qm,List<String> excludeName)throws SQLException {
StringBuffer buffer = new StringBuffer(sql);
Field fs[] = qm.getClass().getSuperclass().getDeclaredFields();
Field fs2[] = qm.getClass().getDeclaredFields();
for(Field f : fs){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
if(excludeName.contains(f.getName())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("java.lang.String")){
String v = ""+this.getValue(qm, f.getName());
if(v!=null && v.trim().length()>0 && !v.equalsIgnoreCase("null")){
buffer.append(" and t."+f.getName()+" like ? ");
}
}else if(type.endsWith("int")){
int v = Integer.parseInt(""+this.getValue(qm, f.getName()));
if(v > 0){
if(this.isAreaValue(fs2, f.getName())){
buffer.append(" and t."+f.getName()+" >=? ");
}else{
buffer.append(" and t."+f.getName()+" =? ");
}
}
}else if(type.endsWith("float")){
float v = Float.parseFloat(""+this.getValue(qm, f.getName()));
if(v > 0){
if(this.isAreaValue(fs2, f.getName())){
buffer.append(" and t."+f.getName()+" >=? ");
}else{
buffer.append(" and t."+f.getName()+" =? ");
}
}
}else if(type.endsWith("long")){
long v = Long.parseLong(""+this.getValue(qm, f.getName()));
if(v > 0){
if(this.isAreaValue(fs2, f.getName())){
buffer.append(" and t."+f.getName()+" >=? ");
}else{
buffer.append(" and t."+f.getName()+" =? ");
}
}
}
}
for(Field f : fs2){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("int")){
int v = Integer.parseInt(""+this.getValue(qm, f.getName()));
if(v>0){
buffer.append(" and t."+f.getName().substring(0,f.getName().length()-1)+" <=? ");
}
}else if(type.endsWith("float")){
float v = Float.parseFloat(""+this.getValue(qm, f.getName()));
if(v > 0){
buffer.append(" and t."+f.getName().substring(0,f.getName().length()-1)+" <=? ");
}
}else if(type.endsWith("long")){
long v = Long.parseLong(""+this.getValue(qm, f.getName()));
if(v > 0){
buffer.append(" and t."+f.getName().substring(0,f.getName().length()-1)+" <=? ");
}
}
}
return buffer.toString();
}
protected int setValue(PreparedStatement pstmt,Q qm,int fromNum,int toNum,List<String> excludeName) throws SQLException{
int count = 1;
Field fs[] = qm.getClass().getSuperclass().getDeclaredFields();
Field fs2[] = qm.getClass().getDeclaredFields();
for(Field f : fs){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
if(excludeName.contains(f.getName())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("java.lang.String")){
String v = ""+this.getValue(qm, f.getName());
if(v!=null && v.trim().length()>0 && !v.equalsIgnoreCase("null")){
pstmt.setString(count, "%"+v+"%");
count++;
}
}else if(type.endsWith("int")){
int v = Integer.parseInt(""+this.getValue(qm, f.getName()));
if(v > 0){
pstmt.setInt(count, v);
count++;
}
}else if(type.endsWith("float")){
float v = Float.parseFloat(""+this.getValue(qm, f.getName()));
if(v > 0){
pstmt.setFloat(count, v);
count++;
}
}else if(type.endsWith("long")){
long v = Long.parseLong(""+this.getValue(qm, f.getName()));
if(v > 0){
pstmt.setLong(count, v);
count++;
}
}
}
for(Field f : fs2){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("int")){
int v = Integer.parseInt(""+this.getValue(qm, f.getName()));
if(v>0){
pstmt.setInt(count, v);
count++;
}
}else if(type.endsWith("float")){
float v = Float.parseFloat(""+this.getValue(qm, f.getName()));
if(v > 0){
pstmt.setFloat(count, v);
count++;
}
}else if(type.endsWith("long")){
long v = Long.parseLong(""+this.getValue(qm, f.getName()));
if(v > 0){
pstmt.setLong(count, v);
count++;
}
}
}
return count;
}
private void setPageValue(PreparedStatement pstmt,int count,int fromNum,int toNum) throws SQLException{
//翻页
if(fromNum > 0 && toNum >0){
pstmt.setInt(count, fromNum);
count++;
pstmt.setInt(count, toNum);
count++;
}
}
protected M rs2model(ResultSet rs,Q qm) throws Exception{
M retm = (M)(qm.getClass().getSuperclass().newInstance());
Field fs[] = qm.getClass().getSuperclass().getDeclaredFields();
for(Field f : fs){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("java.lang.String")){
retm = this.setValue(retm, f.getName(), rs.getString(f.getName()));
}else if(type.endsWith("int")){
retm = this.setValue(retm, f.getName(), rs.getInt(f.getName()));
}else if(type.endsWith("float")){
retm = this.setValue(retm, f.getName(), rs.getFloat(f.getName()));
}else if(type.endsWith("long")){
retm = this.setValue(retm, f.getName(), rs.getLong(f.getName()));
}
}
return retm;
}
private M setValue(M m,String name,Object value){
Method ms [] = m.getClass().getMethods();
for(Method mth : ms){
if(mth.getName().equalsIgnoreCase("set"+name)){
try {
mth.invoke(m, value);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
return m;
}
private boolean isAreaValue(Field fs2[] , String name){
for(Field f : fs2){
if(f.getName().equalsIgnoreCase(name+"2")){
return true;
}
}
return false;
}
public void create(M m) {
this.myExecuteUpdate(m, 1);
}
private String getTableName(M m){
String tempStr = m.getClass().getSimpleName();
tempStr = tempStr.substring(0,tempStr.length()-5);
return tempStr;
}
protected String getCreateSql(M m){
//约定大于配置
Field fs[] = m.getClass().getDeclaredFields();
StringBuffer buffer = new StringBuffer();
for(Field f : fs){
if(!Modifier.isTransient(f.getModifiers())){
buffer.append("?,");
}
}
String s = buffer.toString();
s = s.substring(0,s.length()-1);
String sql = "insert into tbl_"+this.getTableName(m)+" values("+s+")";
return sql;
}
protected void setCreateValue(PreparedStatement pstmt,M m)throws SQLException{
Field fs[] = m.getClass().getDeclaredFields();
int count = 1;
for(Field f : fs){
if(Modifier.isTransient(f.getModifiers())){
continue;
}
String type = f.getType().toString();
if(type.endsWith("java.lang.String")){
pstmt.setString(count,""+this.getValue(m, f.getName()));
count++;
}else if(type.endsWith("int")){
pstmt.setInt(count, Integer.parseInt(""+this.getValue(m, f.getName())));
count++;
}else if(type.endsWith("float")){
pstmt.setFloat(count, Float.parseFloat(""+this.getValue(m, f.getName())));
count++;
}else if(type.endsWith("long")){
pstmt.setLong(count, Long.parseLong(""+this.getValue(m, f.getName())));
count++;
}
}
}
private Object getValue(M m,String name) {
Object ret = null;
Method ms[] = m.getClass().getMethods();
for(Method mth : ms){
if(mth.getName().equalsIgnoreCase("get"+name)){
try {
ret = mth.invoke(m, new Object[]{});
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ret;
}
////////////////////////////////////////////
public void update(M m) {
this.myExecuteUpdate(m, 2);
}
protected String getUpdateSql(M m){
Field fs[] = m.getClass().getDeclaredFields();
StringBuffer buffer = new StringBuffer("update tbl_"+this.getTableName(m)+" set ");
for(Field f : fs){
if(!Modifier.isTransient(f.getModifiers()) && !f.getName().equalsIgnoreCase("uuid")){
buffer.append(f.getName()+"=?,");
}
}
String s = buffer.toString();
s = s.substring(0,s.length()-1);
String sql = s + " where uuid=?";
return sql;
}
protected void setUpdateValue(PreparedStatement pstmt,M m)throws SQLException{
Field fs[] = m.getClass().getDeclaredFields();
int count = 1;
for(Field f : fs){
if(Modifier.isTransient(f.getModifiers()) || f.getName().equalsIgnoreCase("uuid")){
continue;
}
String type = f.getType().toString();
if(type.endsWith("java.lang.String")){
pstmt.setString(count,""+this.getValue(m, f.getName()));
count++;
}else if(type.endsWith("int")){
pstmt.setInt(count, Integer.parseInt(""+this.getValue(m, f.getName())));
count++;
}else if(type.endsWith("float")){
pstmt.setFloat(count, Float.parseFloat(""+this.getValue(m, f.getName())));
count++;
}else if(type.endsWith("long")){
pstmt.setLong(count, Long.parseLong(""+this.getValue(m, f.getName())));
count++;
}
}
//设置uuid
String v = ""+this.getValue(m, "uuid");
if(v!=null && v.trim().length()>0 && !v.equalsIgnoreCase("null")){
pstmt.setInt(count, Integer.parseInt(v));
}else{
pstmt.setInt(count, 0);
}
}
/////////////////////////////////////
public void delete(M m) {
this.myExecuteUpdate(m, 3);
}
protected String getDeleteSql(M m){
String sql = "delete from tbl_"+this.getTableName(m)+" where uuid=?";
return sql;
}
protected void setDeleteValue(PreparedStatement pstmt,M m)throws SQLException{
pstmt.setInt(1, Integer.parseInt(""+this.getValue(m, "uuid")));
}
////////////////////////////////
private void myExecuteUpdate(M m,int type) {
Connection conn = null;
try{
//1
conn = DbConn.getConn();
//2:
String sql = "";
if(type==1){
sql = this.getCreateSql(m);
}else if(type==2){
sql = this.getUpdateSql(m);
}else if(type==3){
sql = this.getDeleteSql(m);
}
System.out.println("now myexecuteupdate sql=="+sql);
//3:
PreparedStatement pstmt = conn.prepareStatement(sql);
//4:
if(type==1){
this.setCreateValue(pstmt, m);
}else if(type==2){
this.setUpdateValue(pstmt, m);
}else if(type==3){
this.setDeleteValue(pstmt, m);
}
//5:
pstmt.executeUpdate();
//6:
pstmt.close();
}catch(Exception err){
err.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
最近下载更多
huangtian LV3
2023年7月11日
lsq54365 LV14
2022年6月20日
没朋友的键盘侠 LV8
2022年5月19日
zzfzzf LV7
2022年4月22日
tangjj7260 LV18
2021年12月25日
guaixia163 LV13
2021年12月21日
heihus LV3
2021年9月6日
yangsha868 LV9
2021年8月13日
MarkLee 琥珀川 LV13
2021年7月21日
above-null LV1
2021年3月22日
最近浏览更多
yidongdematong LV2
6月12日
gann2015 LV25
6月4日
不错不
2024年10月10日
暂无贡献等级
lqzixi LV4
2024年10月9日
allknow2008
2024年7月31日
暂无贡献等级
lun123456
2024年6月22日
暂无贡献等级
微信网友_6790506018131968 LV1
2024年1月1日
XNDIC522
2023年11月6日
暂无贡献等级
weilaizhisheng LV21
2023年9月28日
huangtian LV3
2023年7月11日

