• 反射的应用,jdbc封装


    实现在Java中查询数据库并保存在Java中

     1.创建Dept类(要查找的类)

    package cn.ljs;
    
    public class Dept {
    	private int deptno;
    	private String dname;
    	private String loc;
    
    	public int getDeptno() {
    		return deptno;
    	}
    
    	public void setDeptno(int deptno) {
    		this.deptno = deptno;
    	}
    
    	public String getDname() {
    		return dname;
    	}
    
    	public void setDname(String dname) {
    		this.dname = dname;
    	}
    
    	public String getLoc() {
    		return loc;
    	}
    
    	public void setLoc(String loc) {
    		this.loc = loc;
    	}
    
    	public Dept() {
    		super();
    	}
    
    	public Dept(int deptno, String dname, String loc) {
    		super();
    		this.deptno = deptno;
    		this.dname = dname;
    		this.loc = loc;
    	}
    
    	@Override
    	public String toString() {
    		return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
    				+ "]";
    	}
    
    }
    

      

     2.自定义的工具类

    package cn.ljs.utill;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    
    public class Jdbcutill {
    
    
    	private static String drive = "";
    	private static String url = "";
    	private static String user = "";
    	private static String password = "";
    
    	static {
    		try {
    			// 以流的形式获取db.properties
    			InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
    					
    			// 创建Properties 类,通过load流读取到该对象中
    			Properties prop = new Properties();
    			prop.load(in);
    			drive = prop.getProperty("drive");
    			url = prop.getProperty("url");
    			user = prop.getProperty("user");
    			password = prop.getProperty("password");
    			
    			System.out.println(drive);
    			System.out.println(url);
    			System.out.println(user);
    			System.out.println(password);
    
    			// 1.加载数据库驱动类
    			Class.forName(drive);
    			
    
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.out.println("配置文件失败");
    		}
    	}
    
    	public static Connection getConnection() {
    		Connection connection = null;
    		try {
    			connection = DriverManager.getConnection(url, user, password);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		return connection;
    
    	}
    
    	public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
    		if (conn != null) {
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		if (ps != null) {
    			try {
    				ps.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		if (rs != null) {
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

    3.配置文件

    # do not write space
    drive=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
    user=SCOTT
    password=tiger
    

    4实现在Java中查询数据库并保存在Java中    

    package cn.ljs;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import 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 cn.ljs.utill.Jdbcutill;
    
    public class TestUser {
        public static void main(String[] args) throws Exception {
            TestUser testUser = new TestUser();
            List list = testUser.rowToBean("select * from dept", Dept.class);
            for (int i = 0; i < list.size(); i++) {
                Dept dept = (Dept)list.get(i);
                System.out.println(dept);
            }
        }
        
        
        public List rowToBean(String sql,Class cls) throws Exception{
            List list = new ArrayList<>();
            //调用自定义的方法,加载数据库,创建数据库的连接对象
            Connection conn = Jdbcutill.getConnection();
            //创建预编译对象,结果集对象
            PreparedStatement ps= null;
            ResultSet rs = null;
            
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            // 每一个rs对象都对应一个ResultSetMetaData对象
            ResultSetMetaData metaData = rs.getMetaData();
            // 获取查询的列数
            int count = metaData.getColumnCount();
            
            //遍历
            while(rs.next()){
                Object object = cls.newInstance();
                for (int i = 0; i < count; i++) {
                    //获取第几列的名字
                    String fieldName = metaData.getColumnName(i+1).toLowerCase();
                    //通过类名获取类中的属性的描述
                    Field field = cls.getDeclaredField(fieldName);
                    //通过类名,拼接的方法名,属性描述的类型获取set方法
                    Method method = cls.getDeclaredMethod(getSetMethodName(fieldName),field.getType());
                    //通过结果集获取数据库中的属性值
                    Object objval = rs.getObject(fieldName);
                    //执行setfangfa(需要类的对象名,数据库的属性值)
                    if (objval != null) {
                        if (objval instanceof Number) {
                            if (field.getType().getName().equals("int")
                                    || field.getType().getName().equals("java.lang.Integer")) {
                                method.invoke(object, rs.getInt(fieldName));
                            } else if (field.getType().getName().equals("long")
                                    || field.getType().getName().equals("java.lang.Long")) {
                                method.invoke(object, rs.getLong(fieldName));
                            } else if (field.getType().getName().equals("double")
                                    || field.getType().getName().equals("java.lang.Double")) {
                                method.invoke(object, rs.getDouble(fieldName));
                            } else if (field.getType().getName().equals("short")
                                    || field.getType().getName().equals("java.lang.Short")) {
                                method.invoke(object, rs.getShort(fieldName));
                            } else if (field.getType().getName().equals("byte")
                                    || field.getType().getName().equals("java.lang.Byte")) {
                                method.invoke(object, rs.getByte(fieldName));
                            } else if (field.getType().getName().equals("float")
                                    || field.getType().getName().equals("java.lang.Float")) {
                                method.invoke(object, rs.getFloat(fieldName));
                            }
                        } else {
                            method.invoke(object, objval);
                        }
                    }
                    //关闭资源
                    
                    
                }
                    
                list.add(object);
            }
            
            Jdbcutill.close(conn, ps, rs);    
            
            
            return list;
        }
        //拼接set方法名
        public String getSetMethodName(String fieldName){
            return "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
        }
    
        
        
    }
  • 相关阅读:
    Why is exponentiation applied right to left? Python
    What do these operators mean (** , ^ , %, //)? [closed] Python
    Difference between npm and yarn
    could not find a part GeneratedMSBuildEditorConfig.editorconfig
    git checkout b 本地分支 origin/远程分支 规格严格
    Instant Gratification with Flowable Open Source 规格严格
    【Linux】Linux中在mate桌面和gnome桌面root自动登录设置 规格严格
    Centos7修改网卡名字方法 规格严格
    Flowable的基本操作 规格严格
    SpringBoot+flowable实现工作流 规格严格
  • 原文地址:https://www.cnblogs.com/heviny/p/10758686.html
Copyright © 2020-2023  润新知