反射---第十九天
来源:互联网 发布:2017seo新手教程 编辑:程序博客网 时间:2024/04/28 16:46
泛型:ArrayList<数据类型> arr=new ...
泛型标志:T E K V
package com.test1;
import java.util.ArrayList;
public class Base<T1,T2> {
private T1 obj1;
private T2 obj2;
public Base(T1 obj1, T2 obj2) {
super();
this.obj1 = obj1;
this.obj2 = obj2;
}
public Base() {
super();
}
public T1 getObj1() {
return obj1;
}
public void setObj1(T1 obj1) {
this.obj1 = obj1;
}
public T2 getObj2() {
return obj2;
}
public void setObj2(T2 obj2) {
this.obj2 = obj2;
}
public static void main(String[] args) {
Base<String, Integer> base=new Base<String, Integer>("熊爱明",12);
Base<Integer, Integer> base2=new Base<Integer, Integer>(133,12);
System.out.println(base.getObj1()+"--"+base.getObj2());
System.out.println(base2.getObj1()+"--"+base2.getObj2());
}
}
反射:根据所需字符串将字符串转为类的对象及其属性和方法,并且可以进行操作
下面是DBhelper连接助手
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBHelper {
public Connection conn;//连接对象
public PreparedStatement pst;//操作对象
String url="jdbc:sqlserver://127.0.0.1:1433;databasename=dogDB";
String user="sa";
String password="123";
//加载驱动
public DBHelper(){
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
//连接对象
public void getConnection(){
try {
conn=DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
}
//增删改
public int execUpdate (String sql,Object...params){//该数组用于装?所代表的参数值
System.out.println(sql);
try {
//获取连接对象
getConnection();
//获取操作对象
pst=conn.prepareStatement(sql);
if(params!=null){
//遍历数组
for(int i=0;i<params.length;i++){
pst.setObject(i+1, params[i]);
}
}
//执行
return pst.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//查
public ResultSet execQuery (String sql,Object...params){//该数组用于装?所代表的参数值
System.out.println(sql);
try {
//获取连接对象
getConnection();
//获取操作对象
pst=conn.prepareStatement(sql);
if(params!=null){
//遍历数组
for(int i=0;i<params.length;i++){
pst.setObject(i+1, params[i]);
}
}
//执行
return pst.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//关闭连接
public void closeResource(ResultSet rs,PreparedStatement pst,Connection conn){
try {
if(rs!=null){
rs.close();
}
if(pst!=null){
pst.close();
}
if(conn!=null){
conn.close();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
下面是反射的增删改查
package com.dao;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.util.ArrayList;
import common.DBHelper;
//类名=表名 属性=列
public class BaseDao<T> {
DBHelper helper=new DBHelper();
//添加
public int add(T t,String className,String pk){
int n=0;
try {
String classPath="com.beans."+className;
//通过字符串产生类型 clazz
Class clazz=Class.forName(classPath);
//得到属性数组
Field[] fields=clazz.getDeclaredFields();
//得到方法数组
Method[]methods=clazz.getDeclaredMethods();
//insert into 表(列1,列2..) values (值1,值2..)
//insert into dog(name,age) values (?,?)
//构造sql
String wh="";
String sql="insert into "+className+" (";
for(Field f:fields){
//排除点主键
if(!f.getName().equals(pk)){
sql+=f.getName()+",";
wh+="?,";
}
}
//截取最后一个逗号
sql=sql.substring(0, sql.length()-1);
wh=wh.substring(0, wh.length()-1);
sql+=") values ("+wh+")";
System.out.println(sql);
//构建 值params
Object[]params=new Object[fields.length-1];
int index=0;
for(Field f:fields){
//排除点主键
if(!f.getName().equals(pk)){ // name age
for(Method m:methods){ //set getXXX
//得到所有的get方法
if(m.getName().substring(0, 3).equals("get")&&m.getName().substring(3).equalsIgnoreCase(f.getName())){ //getName getAge getId
//找到了和属性对象的getXXX方法了
//执行该方法
params[index]= m.invoke(t, null);
index++;
break;
}
}
}
}
//遍历数组params
// for(Object o:params){
// System.out.println(o);
// }
n=helper.execUpdate(sql, params);
} catch (Exception e) {
e.printStackTrace();
}finally{
helper.closeResource(null, helper.pst, helper.conn);
}
return n;
}
//删除
public int del(String className,String pk,int id){
//delete from 表 where id=?
//构建sql
String sql="delete from "+className+" where "+pk+"=?";
int n=helper.execUpdate(sql, id);
helper.closeResource(null, helper.pst, helper.conn);
return n;
}
//修改
public int upd(String className,T t,String pk){
int n=0;
try {
//update 表 set 列1=?,.... where id=?
String classPath="com.beans."+className;
Class clazz=Class.forName(classPath);
//得到属性数组
Field[] fields=clazz.getDeclaredFields();
//得到方法数组
Method[]methods=clazz.getDeclaredMethods();
//构建sql
String sql="update "+className+" set ";
for(Field f:fields){
if(!f.getName().equals(pk)){
sql+=f.getName()+"=?,";
}
}
//截取最后一个逗号
sql=sql.substring(0, sql.length()-1);
sql+=" where "+pk+"=?";
//构建 值params
Object[]params=new Object[fields.length];
int index=0;
for(Field f:fields){
//排除点主键
if(!f.getName().equals(pk)){ // name age
for(Method m:methods){ //set getXXX
//得到所有的get方法
if(m.getName().substring(0, 3).equals("get")&&m.getName().substring(3).equalsIgnoreCase(f.getName())){ //getName getAge getId
//找到了和属性对象的getXXX方法了
//执行该方法
params[index]= m.invoke(t, null);
index++;
break;
}
}
}
}
//params最后装入主键值
for(Method m:methods){
//找到主键 getId
if(m.getName().substring(0, 3).equals("get")&&m.getName().substring(3).toLowerCase().equals(pk)){
params[index]=m.invoke(t, null);
break;
}
}
n=helper.execUpdate(sql, params);
} catch (Exception e) {
// TODO: handle exception
}finally{
helper.closeResource(null, helper.pst, helper.conn);
}
return n;
}
public T getById(String className,String pk,int id){
ResultSet rs=null;
try {
String classPath="com.beans."+className;
Class clazz=Class.forName(classPath);
//select * from 表 where id=?
//构建sql
String sql="select * from "+className+" where "+pk+"=?";
rs=helper.execQuery(sql, id);
if(rs.next()){
//创建新对象
Object obj= clazz.newInstance();
Method[]methods=clazz.getDeclaredMethods();
for(Method m:methods){
//找到所有的set方法 setName setAge
if(m.getName().substring(0, 3).equals("set")){
m.invoke(obj, rs.getObject(m.getName().substring(3).toLowerCase()));
}
}
return (T)obj;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
helper.closeResource(rs, helper.pst, helper.conn);
}
return null;
}
public ArrayList<T> getByWhere(String where,String className){
ResultSet rs=null;
ArrayList<T> arr=new ArrayList<T>();
try {
String classPath="com.beans."+className;
Class clazz=Class.forName(classPath);
//select * from 表 where id=?
//构建sql
String sql="select * from "+className+" "+where;
rs=helper.execQuery(sql, null);
while(rs.next()){
//创建新对象
Object obj= clazz.newInstance();
Method[]methods=clazz.getDeclaredMethods();
for(Method m:methods){
//找到所有的set方法 setName setAge
if(m.getName().substring(0, 3).equals("set")){
m.invoke(obj, rs.getObject(m.getName().substring(3).toLowerCase()));
}
}
arr.add((T)obj);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
helper.closeResource(rs, helper.pst, helper.conn);
}
return arr;
}
}
- 反射---第十九天
- 第十九天
- 世界杯第十九天
- 第十九天:听课笔记
- 第十九天:总结
- 第十九天总结0415
- 星海第十九天
- 第十九天博客
- 第十九天:IO流
- php实战第十九天
- 拓胜第十九天
- 第十九天 笔记
- 实习篇---第十九天
- 19 第十九天【健身】
- .net学习第十九天
- Android第十九天 ActionBar
- Java学习第十九天
- UI第十九天:数据库
- java读取bitmap文件
- Alternative Thinking
- nyoj-195 飞翔【动态规划】
- (一) docker简介及组成-------学习笔记
- get和post的区别
- 反射---第十九天
- 单链表的基本操作(第一篇)
- 【Linux】【Docker】CentOs 6.x升级内核到3.10, 安装并升级docker1.9.1
- codeforces 832D Misha, Grisha and Underground
- VM虚拟机中Linux扩展磁盘空间的方法
- 运行时常量池与Class文件常量池的区别
- 下面有关继承、多态、组合的描述,说法错误的是?
- Leet Code 3. Longest Substring Without Repeating Characters (最长的没有重复字符的子字符串)
- JVM启动流程