package com.imau.entry;
/*
*
-
用户表
*/
public class User {private Integer id;
private String uname;
private String upass;
private String utel;public User(){
}
public User(Integer id,String uname,String upass,String utel){
this.id= id; this.uname=uname; this.upass=upass; this.utel=utel;
}
public User(String uname,String upass,String utel){
this.uname=uname; this.upass=upass; this.utel=utel;
}
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id=id;}
public String getUname(){
return uname;
}
public void setUname(String uname){
this.uname=uname;}
public String getUpass(){
return upass;
}
public void setUpass(String upass){
this.upass=upass;}
public void setUtel(String utel){
this.utel=utel;
}
public String getUtel(){
return utel;
}@Override
public String toString() {
return “User [id=” + id + “, uname=” + uname + “, upass=” + upass + “, utel=” + utel + “]”;
}
}
package com.imau.dao;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.iamu.jdbc.DBUtils;
//数据库操作的基本父类
public class DaoImpl implements Dao {
private Connection conn;
private PreparedStatement pstm;
//反射
Class<T> type;
private String tableName;
//获取T的class对象,获取泛型的类型,泛型是在被子类继承时才确定
public DaoImpl()
{
//给反射泛型
//获取子类的类型
Class clazz=this.getClass();
//获取父类的类型
//getGenericSuperclass()用来获取当前类的父类的类型
//ParameterizedType表示的是带泛型的类型
ParameterizedType parameterizedType=(ParameterizedType) clazz.getGenericSuperclass();
//获取具体的泛型类型getActualTypeArguments获取具体的泛型的类型
//这个方法会返回一个type的数组
Type[] types=parameterizedType.getActualTypeArguments();
//获取具体的泛型的类型
this.type=(Class<T>) types[0];
//获取表名
tableName=type.getSimpleName().toLowerCase();
}
@Override
public boolean add(T t) {
try{
//表名;插入字段
String sql="insert into"+tableName+"(";
StringBuffer sFlied=new StringBuffer();
StringBuffer sVal=new StringBuffer();
Field fields[]=type.getDeclaredFields();
for (int i=1;i<fields.length;i++){
if(i!=fields.length-1){
sFlied.append(fields[i].getName()).append(",");
sVal.append("?");
}else{
sFlied.append(fields[i].getName());
sVal.append("?");
}
}
sql=sql+sFlied.toString()+") values("+sVal.toString()+")";
System.out.println("sql="+sql);
//1.获取连接
conn=DBUtils.getConn();
//2.执行命令
//2.1拼接sql
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
System.out.println(sql);
for (int i=1;i<fields.length;i++){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(fields[i].getName(),type);
//属性可读的方法
Method method=pd.getReadMethod();
pstm.setObject(i, method.invoke(t));
}
//3.处理结果
pstm.executeUpdate();
//4.关闭连接
DBUtils.close(conn,pstm,null);
}catch(Exception e){
e.printStackTrace();
}
return false;
}
//按照主键
@Override
public int delete(T t) {
try{
//表名;插入字段
String sql="delete from "+tableName+" where id=?";
Field fields[]=type.getDeclaredFields();
//1.获取连接
conn=DBUtils.getConn();
//2.执行命令
//2.1拼接sql
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
for (int i=1;i<fields.length;i++){
if(fields[i].getName().equals("id")){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(fields[i].getName(),type);
//属性可读的方法
Method method=pd.getReadMethod();
pstm.setObject(i, method.invoke(t));
System.out.println("fields[i].getName()"+fields[i].getName()+","+i);
} else{
continue;
}
}
//3.处理结果
pstm.executeUpdate();
//4.关闭连接
DBUtils.close(conn,pstm,null);
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
@Override
public int update(T t) {
try{
//update user set uname='',upass=,''where id=1;
String sql="update "+tableName+"set";
StringBuffer sFlied=new StringBuffer();
StringBuffer sVal=new StringBuffer();
Field fields[]=type.getDeclaredFields();
for (int i=1;i<fields.length;i++){
if(i!=fields.length-1){
sFlied.append(fields[i].getName()).append("=").append("?,");
}else{
sFlied.append(fields[i].getName()).append("=").append("?");
}
}
sql=sql+sFlied+" where id=?";
System.out.println("sql="+sql);
//1.获取连接
conn=DBUtils.getConn();
//2.执行命令
//2.1拼接sql
pstm=conn.prepareStatement(sql);
//2.2填充占位符 如何调用对象的get方法
System.out.println(sql);
for (int i=0;i<fields.length;i++){
//属性描述
PropertyDescriptor pd=new PropertyDescriptor(fields[i].getName(),type);
//属性可读的方法
Method method=pd.getReadMethod();
if(i==0){
pstm.setObject(fields.length, method.invoke(t));
}else{
pstm.setObject(i, method.invoke(t));
}
}
System.out.println(sql);
//3.处理结果
pstm.executeUpdate();
//4.关闭连接
DBUtils.close(conn,pstm,null);
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
@Override
public int query() {
return 0;
}
}
package com.iamu.jdbc;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import javax.sql.*;
import com.imau.dao.user.UserDaoImpl;
import com.imau.entry.User;
public class Text {
public static void main(String[] args) throws Exception{
UserDaoImpl daoImpl=new UserDaoImpl();
daoImpl.delete(new User("admin123","123456","12355"));
}
}
package com.iamu.jdbc;
import java.sql.*;
import javax.sql.*;
/**
*
-
@author John
*数据库工具类
*/
public class DBUtils {private static Connection conn=null;
private static String url=“jdbc:mysql://localhost:3306/student”;
private static String user=“root”;
private static String password=“123456”;//对外提供数据库连接的
public static Connection getConn(){try{ Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection(url, user, password); return conn; }catch(Exception e){ e.printStackTrace(); } return null;
}
//释放数据库资源
public static void close(Connection conn,PreparedStatement pstm,ResultSet rs){try{ if(rs!=null){ rs.close(); } if(pstm!=null){ pstm.close(); } if(conn!=null){ conn.close(); } }catch(Exception e){ e.printStackTrace(); }
}
}