反射的应用,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);
} }
反射的应用,jdbc封装的更多相关文章
- 优化JDBC封装
可重用性较强的JDBC封装 以下为代码,注释中写了主要思想 主类 com.util.JDBCUtil.java package com.util; import java.lang.reflect.F ...
- jdbc封装代码
jdbc封装代码 package jdbcUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- 利用java反射将结果集封装成为对象和对象集合
java反射机制是什么 反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法: 反射机制能够做什么 1.判断运行对象的所属类 2.构造任意一个类的对象 3.获取任意一个类的属 ...
- JDBC封装的工具类
1. JDBC封装的工具类 public class JDBCUtil { private static Properties p = new Properties(); private static ...
- Mysql,JDBC封装
1.完成对数据库的表的增删改的操作 2.查询返回单条记录 3.查询返回多行记录 4.可以使用反射机制来封装,查询单条记录 5.反射机制,查询多条记录 package myjdbc; import ja ...
- 使用DbUtils对JDBC封装实现面向实体查询
直接上代码 package org.smart4j.chapter2.helper; import org.apache.commons.dbcp2.BasicDataSource; import o ...
- java jdbc 封装。。
JDBC工具类...package it.cast.jdbcutils; import java.io.InputStream; import java.sql.Connection; import ...
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...
- Java JDBC封装模式
模仿DBUtils里面的一些用法,下面是一些简单的实现数据集的操作的方法 下面使用到的两个bean.首先是userbean package bean; public class user { Stri ...
随机推荐
- selenium——键盘操作
很多键盘操作实际是没有意义的.
- SQL Server with ties 语句
With ties 语句是与top.order by 语句联合使用的语句:我们在实际查询过程中会遇到这样的情况,比如查询考试为前三名的学生信息,发现有并列第三的情况,如果我们只是top 3 发现并列第 ...
- 【原创】算法基础之Anaconda(1)简介、安装、使用
Anaconda 2 官方:https://www.anaconda.com/ 一 简介 The Most Popular Python Data Science Platform Anaconda® ...
- Android开发之字体设置
默认字体 Android SDK自带了四种字体:"normal"“monospace",“sans”, “serif”,如下: 字体 看这四兄弟长的还是蛮像,我是看不 ...
- Windows下多个Mysql实例配置主从(转)
https://www.cnblogs.com/jpfss/p/8143720.html 序: 网上有很多类似的文章,也是各种百度出来的,但是对于多数刚开始接触MYSQL主从的小白来说,网上文 ...
- 关于postman各功能的说明及用法以及批量执行
这玩意功能还不错,可以学学,在测试接口或者配合写代码测接口时是有帮助作用的.今天也去打听了一下,一下我就做了一下记录. 首先,主界面: 分开记录,写的详细一些. 左侧菜单栏: 主菜单(请求部分); 输 ...
- Codeforces 455A Boredom (线性DP)
<题目链接> 题目大意:给定一个序列,让你在其中挑选一些数,如果你选了x,那么你能够得到x分,但是该序列中所有等于x-1和x+1的元素将全部消失,问你最多能够得多少分. 解题分析:从小到大 ...
- Java内存溢出异常(上)
上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域 ...
- JMeter性能测试中控制业务比例
性能测试混合场景中,我们需要组合多个业务操作到场景中来.比如有一个论坛的业务分布如下:发布新帖与回复帖子的比例为2:3,那么我们在JMeter测试计划中如何控制其比例呢? 可以通过以下两种方式解决:多 ...
- UVA 536 Tree Recovery 建树+不建树
题意: 给出先序和中序,求后序. 思路: ①建树然后递归输出. //建树的 #include<iostream> #include<cstdio> #include<qu ...