反射的应用,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 ...
随机推荐
- undefined reference to `pthread_create'
问题描述: ubuntu 16.04 下 C语言开发环境, 已经添加了头文件#include <pthread.h> 以及在Makefile中添加了 -lpthread,但是编译时仍然 ...
- SpringBoot图片上传(三)——调用文件上传项目的方法(同时启动两个项目)
简单说明:图片上传有一个专门的工程A,提供了图片的上传和下载预览,工程B涉及到图片上传以及回显,都是调用的工程A的方法,言外之意就是要同时启动两个项目. 代码: //工程B的html代码 <di ...
- 【深度学习】吴恩达网易公开课练习(class2 week1)
权重初始化 参考资料: 知乎 CSDN 权重初始化不能全部为0,不能都是同一个值.原因是,如果所有的初始权重是相同的,那么根据前向和反向传播公式,之后每一个权重的迭代过程也是完全相同的.结果就是,无论 ...
- pl/sql学习(5): 触发器trigger/事务和锁
(一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...
- zoj4027 线性dp!好题
非常好的dp,可是我太菜做不出来.. /* 第i个左括号不可能越过第i+1个左括号 如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后 用dp[i][j]表示把第i个左括号转移到 ...
- python安装多版本
39.107.96.81 root 123123 pyenv#可以实现python多版本控制与切换 pyenv local 3.5.1 ipython#更方便的编写python,可以补全命令彩色显示等 ...
- .net core 2.x - 日志 - to elasticsearch - (2)
你可能会有疑惑,怎么又来一偏,,,其实我也好奇,因为我已经忘记哪个能跑起来了,,,记忆中,这个好像是没问题的. 1.使用到的资源 关于es(elasticseach)在.net中的访问,可以参考es的 ...
- C++运算符重载——类型转换
类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int.float.double.char等) 或者 另一个类 类型. 其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型 ...
- redis学习(八)——redis应用场景
毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...
- YII2 console中引用其他模块(子项目)的model时出现model找不到命名空间的问题解决
YII2 console中写定时任务, 想使用其他模块的model, 在 console的yii.php 入口文件中引入其他模块的配置文件, 否者会出现model等命名空间找不到的问题. 还有, 命名 ...