-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
170 lines (153 loc) · 20.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<!DOCTYPE html><html lang="zh-CN"><head><meta name="generator" content="Hexo 3.9.0"><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><meta name="description" content="欢迎来到晋的博客,本博客用来收录平时学习笔记,欢迎访问"><title>JDBC工具类-利用java反射机制 | ZJ_BLOG</title><link rel="stylesheet" type="text/css" href="/css/style.css?v=0.0.1"><link rel="stylesheet" type="text/css" href="//cdn.bootcss.com/normalize/7.0.0/normalize.min.css"><link rel="stylesheet" type="text/css" href="//cdn.bootcss.com/pure/1.0.0/pure-min.css"><link rel="stylesheet" type="text/css" href="//cdn.bootcss.com/pure/1.0.0/grids-responsive-min.css"><link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css"><script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script><link rel="Shortcut Icon" type="image/x-icon" href="/favicon.ico"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="apple-touch-icon-precomposed" href="/apple-touch-icon.png"><script type="text/javascript" src="http://p18j2ow6f.bkt.clouddn.com/static/css/instantclick.min.js"></script><script>InstantClick.init();
InstantClick.on('change', function (isInitialLoad) {
if (isInitialLoad === false) {
if (typeof MathJax !== 'undefined') // support MathJax
MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
if (typeof prettyPrint !== 'undefined') // support google code prettify
prettyPrint();
if (typeof _hmt !== 'undefined') // support 百度统计
_hmt.push(['_trackPageview', location.pathname + location.search]);
if (typeof ga !== 'undefined') // support google analytics
ga('send', 'pageview', location.pathname + location.search);
}
});
</script><link rel="alternate" type="application/atom+xml" href="/atom.xml"></head><body><div class="body_container"><div id="header"><div class="site-name"><h1 class="hidden">JDBC工具类-利用java反射机制</h1><a id="logo" href="/.">ZJ_BLOG</a><p class="description">Silence的博客</p></div><div id="nav-menu"><a class="current" href="/."><i class="fa fa-home"> 首页</i></a><a href="/archives/"><i class="fa fa-archive"> 归档</i></a></div></div><div class="pure-g" id="layout"><div class="pure-u-1 pure-u-md-3-4"><div class="content_container"><div class="post"><h1 class="post-title">JDBC工具类-利用java反射机制</h1><div class="post-meta">Feb 8, 2017<span> | </span><span class="category"><a href="/categories/JDBC/">JDBC</a></span></div><div class="post-content"><ol>
<li>利用java反射机制,动态进行数据库操作</li>
<li>可以对不同的表(对应相应的实体类)进行数据库操作而不需要修改操作代码</li>
<li>查询得到的数据通过反射机制已经动态赋值到实体对象中</li>
</ol>
<hr>
<p><img src="http://www.zj2626.github.io/wp-content/uploads/2017/02/jdbc.png" alt></p>
<a id="more"></a>
<hr>
<pre><code>package com.jdbc;
import org.junit.Test;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.*;
/**
* Created by zj2626 on 17-1-19.
*/
public class utilsTest {
@Test
public void test() {<img src="http://www.zj2626.github.io/wp-content/uploads/2017/02/jdbc-300x115.png" alt="" width="300" height="115" class="alignnone size-medium wp-image-233" />
/**
* 带占位符和别名的sql语句 查询
* 别名是为了匹配数据库中字段名与实体类中属性的差异(如数据库表中列f_id对应类中id属性)
*/
String sql = "SELECT f_id id, f_name name, f_age age FROM student WHERE f_id = ?";
List<Student> list = query(Student.class, sql, 122);
System.out.println(list != null ? "查询到的数据有" + list.size() + "条" : "没查到!!!");
}
//<T> List<T>中第一个T是泛型的声明,使T有意义,表示这是一个泛型方法
// (即告诉人们T代表任意类型,每次只能表示一个类型)
private <T> List<T> query(Class<T> clazz, String sql, Object... args) {//使用可变参数表示查询条件
List<T> list = new ArrayList<T>(); //用来存放查询到的结果
Connection connection = null;
PreparedStatement state = null;
ResultSet resultSet = null;
try {
Properties properties = new Properties();
//读取文件中的数据库配置信息赋值给各个变量
properties.load(this.getClass().getClassLoader().getResourceAsStream("com/jdbc/jdbc.properties"));
String dirverClass = properties.getProperty("driver");
String url = properties.getProperty("jdbc_url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
Class.forName(dirverClass);
connection = DriverManager.getConnection(url, user, password);
state = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
state.setObject(i + 1, args[i]); //遍历设置占位符的值
}
/*
查询过程:
1.先利用sql语句进行查询
2.利用反射新建类的实体
3.获得sql语句中的别名,(tongg ResultSet的元数据对象--ReslutSetMetaData,其可以从结果集中获得所有信息,包括列名,别名等)
4.确定别名对应的属性并赋值给属性
*/
resultSet = state.executeQuery();//查询并返回结果集
ResultSetMetaData metaData = resultSet.getMetaData();//得到结果集的元数据对象
while (resultSet.next()) {
//利用反射新建类的实体
T entity = null;
int len = metaData.getColumnCount();
for (int i = 0; i < len; i++) {
String columnName = metaData.getColumnName(i + 1);//遍历查看列名(这里并没用到)
String columnLabel = metaData.getColumnLabel(i + 1);//遍历获取列的别名
System.out.println(columnName + "--" + columnLabel);
Object columnValue = resultSet.getObject(columnLabel);//获取指定别名的列所对应的值
entity = clazz.newInstance();//newInstance()调用newInstance()必须有无参构造方法
//获取类的指定属性(一切皆对象,属性也是对象,都是Field类的实例)
// Field field = clazz.getDeclaredField(columnLabel);//注:getField只能获得public字段
// field.setAccessible(true);//设置为可访问(属性为private 不能直接赋值)
// field.set(entity, columnValue);//为指定的属性赋值
//赋值方法2: 以上三行的赋值功能可以用apache提供的一个工具类实现
BeanUtils.setProperty(entity, columnLabel, columnValue);//该方法是通过实体中的属性的setter方法实现的
}
list.add(entity);
}
} catch (SQLException | IOException | ReflectiveOperationException e) {
e.printStackTrace();
} finally {
close(connection, state, resultSet);
}
return list;
}
private void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
</code></pre><h2 id="注-如果是插入一条或者多条数据可以用下面的过程获取到插入后自动生成的主键"><a href="#注-如果是插入一条或者多条数据可以用下面的过程获取到插入后自动生成的主键" class="headerlink" title="注:如果是插入一条或者多条数据可以用下面的过程获取到插入后自动生成的主键()"></a>注:如果是插入一条或者多条数据可以用下面的过程获取到插入后自动生成的主键()</h2><pre><code>//上面是获取connection创建PreparedStatement对象
state.executeUpdate();
//获取生成的新所有主键
//返回的resultSet中只有一列--> 列名:GENERATED_KEY
resultSet = state.getGeneratedKeys();
while (resultSet.next()) {
System.out.println(resultSet.getObject(1));
}
</code></pre></div><script type="text/javascript" src="/js/share.js?v=0.0.1" async></script><a class="article-share-link" data-url="http://zj2626.github.io/2017/02/08/2017_jdbc_reflect/" data-id="ckm3iqt4u003dfcujw1z5hzp6" data-qrcode="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMYAAADGCAAAAACs8KCBAAACPElEQVR42u3a0W7CMAxGYd7/pbtbJKA9vx3Q6pxcoa5b/XWSSWw/HngdL+v5+qfPz1fO/+br9cc3lgwZMm7LOE7XOYOEdf4U/jouYpAhQ8YGjE8P5kmwk3w/3UlikyFDhgzCOMAi4cqQIUPGKsZ5EOl5U4YMGTI4o3bITBNu//qCs7gMGTJuyOAp8vefv9LfkCFDxq0YR7g62zvesIyjkiFDxmhGWvTnx12+yeMt0ot4ZMiQMZqRDkbwUt3alsOyQTEZMmTcisG3ff33tGrr+eanMmTI2IDRKYTV2plpwr14iTJkyBjN4M0APjBBUm3tBdWOuzJkyJjB4Leel/U5rNYcvfgPyJAhYzSDP4BsAflmrg+IvzdkyJBxQ0ZQ0mqk4zQRx0dlGTJkbMDoF7lqLcl0WxkPhMmQIWMco9NETNuTJL0GO1kZMmSMZhSHG8JUm97Di3FvfkuGDBnbMGojXDwpd5JvkHBlyJAxgsHTHwfwK51hCxkyZOzD6A9Y1GYeOm1RNDkiQ4aMcQyyBUxnN9IQ0+GzN3fKkCFjAwY/dqZbPXKIJU+8eH0yZMjYhtFKeWAHyv9O3HaVIUPGUEa/GcCTdRooSeLLehoyZMj4x4xag5PUuDrtTBI6aYjKkCFjEoOX2zoF/bVtzlZjQIYMGbdlBKfesJ3JQ+9sHGXIkCEjLavV7kkbpQsSrgwZMkYzaqmzFiKiypAhYwMGHwtLG5Y8cadlOBkyZOzDSEccakfZ2kBG7WtAhgwZgxh/aZy8Klu8brIAAAAASUVORK5CYII=">分享</a><div class="tags"><a href="/tags/工具类/">工具类</a><a href="/tags/CRUD/">CRUD</a></div><div class="post-nav"><a class="pre" href="/2017/02/09/2017_Linux/">Linux命令</a><a class="next" href="/2017/02/07/2017_jdbc_curd/">重新学习JDBC之获取连接</a></div><div id="container"></div><link rel="stylesheet" href="/css/default.css?v=0.0.1"><script src="/js/gitment.browser.js?v=0.0.1"></script><script>var gitment = new Gitment({
owner: 'zj2626',
repo: 'zj2626.github.io',
oauth: {
client_id: '22769c7edffa5f05d10d',
client_secret: '7bac8fc03397cb64c178fbdfe3a01d2abb459704',
},
})
gitment.render('container')
</script></div></div></div><div class="pure-u-1 pure-u-md-1-4"><div id="sidebar"><div class="widget"><div class="search-form"><input id="local-search-input" placeholder="Search" type="text" name="q" results="0"><div id="local-search-result"></div></div></div><div class="widget"><div class="widget-title"><i class="fa fa-folder-o"> 分类</i></div><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/BUG解决/">BUG解决</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/DOM操作/">DOM操作</a><span class="category-list-count">6</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/DOM操作/XML/">XML</a><span class="category-list-count">6</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Git/">Git</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/JDBC/">JDBC</a><span class="category-list-count">8</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/">Linux</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/java虚拟机/">java虚拟机</a><span class="category-list-count">9</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/java语言基础/">java语言基础</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/python/">python</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/多线程/">多线程</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/数据库/">数据库</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/数据库连接池/">数据库连接池</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/数据结构和算法/">数据结构和算法</a><span class="category-list-count">16</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/机器学习/">机器学习</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/框架相关/">框架相关</a><span class="category-list-count">6</span><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/框架相关/前端技术/">前端技术</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/框架相关/权限管理/">权限管理</a><span class="category-list-count">1</span></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/正则/">正则</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/爬虫/">爬虫</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/程序安装与配置/">程序安装与配置</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/计算机网络/">计算机网络</a><span class="category-list-count">1</span></li></ul></div><div class="widget"><div class="widget-title"><i class="fa fa-star-o"> 标签</i></div><div class="tagcloud"><a href="/tags/C3P0/" style="font-size: 15px;">C3P0</a> <a href="/tags/深入了解java虚拟机/" style="font-size: 15px;">深入了解java虚拟机</a> <a href="/tags/Hexo优化/" style="font-size: 15px;">Hexo优化</a> <a href="/tags/HTML/" style="font-size: 15px;">HTML</a> <a href="/tags/iframe/" style="font-size: 15px;">iframe</a> <a href="/tags/Maven/" style="font-size: 15px;">Maven</a> <a href="/tags/C语言/" style="font-size: 15px;">C语言</a> <a href="/tags/jenkins/" style="font-size: 15px;">jenkins</a> <a href="/tags/Git/" style="font-size: 15px;">Git</a> <a href="/tags/maven/" style="font-size: 15px;">maven</a> <a href="/tags/junit/" style="font-size: 15px;">junit</a> <a href="/tags/定义/" style="font-size: 15px;">定义</a> <a href="/tags/python/" style="font-size: 15px;">python</a> <a href="/tags/转码/" style="font-size: 15px;">转码</a> <a href="/tags/正则表达式/" style="font-size: 15px;">正则表达式</a> <a href="/tags/Dom4j/" style="font-size: 15px;">Dom4j</a> <a href="/tags/爬虫/" style="font-size: 15px;">爬虫</a> <a href="/tags/常用命令/" style="font-size: 15px;">常用命令</a> <a href="/tags/shell/" style="font-size: 15px;">shell</a> <a href="/tags/XPath/" style="font-size: 15px;">XPath</a> <a href="/tags/Mongodb/" style="font-size: 15px;">Mongodb</a> <a href="/tags/java/" style="font-size: 15px;">java</a> <a href="/tags/mysql/" style="font-size: 15px;">mysql</a> <a href="/tags/存储过程/" style="font-size: 15px;">存储过程</a> <a href="/tags/DBCP/" style="font-size: 15px;">DBCP</a> <a href="/tags/DRUID/" style="font-size: 15px;">DRUID</a> <a href="/tags/工具类/" style="font-size: 15px;">工具类</a> <a href="/tags/Vue/" style="font-size: 15px;">Vue</a> <a href="/tags/jaxp/" style="font-size: 15px;">jaxp</a> <a href="/tags/CRUD/" style="font-size: 15px;">CRUD</a> <a href="/tags/JDBC/" style="font-size: 15px;">JDBC</a> <a href="/tags/Blob/" style="font-size: 15px;">Blob</a> <a href="/tags/sax/" style="font-size: 15px;">sax</a> <a href="/tags/事务/" style="font-size: 15px;">事务</a> <a href="/tags/机器学习/" style="font-size: 15px;">机器学习</a> <a href="/tags/注解/" style="font-size: 15px;">注解</a> <a href="/tags/元数据/" style="font-size: 15px;">元数据</a> <a href="/tags/Hibernate/" style="font-size: 15px;">Hibernate</a> <a href="/tags/Mybatis/" style="font-size: 15px;">Mybatis</a> <a href="/tags/ThreadLocal/" style="font-size: 15px;">ThreadLocal</a> <a href="/tags/逻辑回归/" style="font-size: 15px;">逻辑回归</a> <a href="/tags/Shiro/" style="font-size: 15px;">Shiro</a></div></div><div class="widget"><div class="widget-title"><i class="fa fa-file-o"> 最近文章</i></div><ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/2018031301/">使用多种算法对泰坦尼克号乘客获救原因进行分析</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/2018031202/">关于使用sklearn进行数据预处理-归一化/标准化/正则化(转)</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/2018031201/">scikit-learn数据预处理fit_transform()与transform()的区别(转)</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/2018030701/">构建逻辑回归模型实例</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171225_regular/">正则表达式</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171222_crawler4/">Python 爬虫实战(4)</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171219_python_error/">TypeError, a bytes-like object is required, not 'str'</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171219_crawler3/">Python 爬虫实战(3)</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171219_crawler2/">Python 爬虫实战(2)</a></li><li class="post-list-item"><a class="post-list-link" href="/2020/01/15/20171214_crawler/">Python 爬虫实战(1)</a></li></ul></div><div class="widget"><div class="widget-title"><i class="fa fa-external-link"> 友情链接</i></div><ul></ul><a href="https://github.com/zj2626/" title="github" target="_blank">github</a></div></div></div><div class="pure-u-1 pure-u-md-3-4"><div id="footer">Copyright © 2021 <a href="/." rel="nofollow">ZJ_BLOG.</a> Powered by<a rel="nofollow" target="_blank" href="https://hexo.io"> Hexo.</a><a rel="nofollow" target="_blank" href="https://github.com/tufu9441/maupassant-hexo"> Theme</a> by<a rel="nofollow" target="_blank" href="https://github.com/pagecho"> Cho.</a></div></div></div><a class="show" id="rocket" href="#top"></a><script type="text/javascript" src="/js/totop.js?v=0.0.1" async></script><script type="text/javascript" src="//cdn.bootcss.com/fancybox/3.2.5/jquery.fancybox.min.js" async></script><script type="text/javascript" src="/js/fancybox.js?v=0.0.1" async></script><link rel="stylesheet" type="text/css" href="//cdn.bootcss.com/fancybox/3.2.5/jquery.fancybox.min.css"><script type="text/javascript" src="/js/search.js?v=0.0.1"></script><script>var search_path = 'search.xml';
if (search_path.length == 0) {
search_path = 'search.xml';
}
var path = '/' + search_path;
searchFunc(path, 'local-search-input', 'local-search-result');
</script><script>var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = '//hm.baidu.com/hm.js?' + 'c9a692191e9aca9e30daa3f6326cc789';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><script type="text/javascript" src="/js/codeblock-resizer.js?v=0.0.1"></script><script type="text/javascript" src="/js/smartresize.js?v=0.0.1"></script></div></body></html>