<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SQL on 庞玉栋个人博客</title><link>https://pangyd.com/tags/sql/</link><description>Recent content in SQL on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 21 Sep 2026 22:20:12 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/sql/index.xml" rel="self" type="application/rss+xml"/><item><title>纯 LLM 做 NL2SQL 总不准？金融场景为什么必须做本体工程</title><link>https://pangyd.com/post/radar-1023/</link><pubDate>Mon, 21 Sep 2026 22:20:12 +0800</pubDate><guid>https://pangyd.com/post/radar-1023/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://www.infoq.cn/article/TcTrU2Ap9VsxxHVestfw?utm_source=rss&amp;amp;utm_medium=article">纯 LLM 做 NL2SQL 总不准？金融场景为什么必须做本体工程&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：张阳&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：InfoQ 中国（架构）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>摘要&lt;/p>
&lt;p>在金融问数场景下，纯 LLM 方案受限于概率生成机制，难以保证查询口径的准确性。本文从一个生产环境的一线踩坑案例切入，拆解纯 LLM 方案在金融场景面临的四大工程挑战，并论证引入本体作为&amp;quot;语义导航系统&amp;quot;的必要性。&lt;/p>
&lt;p>一、背景：数据分析工具的四阶段演进&lt;/p>
&lt;p>要理解本体的价值，需先回顾数据分析工具的演进。这条路径本质上是从&amp;quot;人适应工具&amp;quot;到&amp;quot;工具适应人&amp;quot;的演进，共经历四个阶段。每一次跃迁都源于同一驱动力：业务人员对&amp;quot;更快、更准、更简单&amp;quot;获取数据洞察的渴望。&lt;/p>
&lt;p>① 固定报表时代——&amp;ldquo;准但慢&amp;rdquo;。 业务提需求，IT 写 SQL，T+1 出报表。优点是口径统一、结果准确；缺点是周期长、响应慢。业务想换一个维度看数据，就得重新提需求，等上几周是常态。&lt;/p>
&lt;p>② 自助 BI 时代——&amp;ldquo;活但难&amp;rdquo;。 数据仓库和星型模型的引入，让业务可通过拖拽字段生成图表，灵活性大幅提升。但门槛依然存在——业务需要理解&amp;quot;事实表&amp;quot;&amp;ldquo;维度表&amp;rdquo;，更要命的是语义歧义。比如业务口中的&amp;quot;保费&amp;quot;，到底是&amp;quot;标准保费&amp;quot;&amp;ldquo;实收保费&amp;quot;还是&amp;quot;预估保费&amp;rdquo;？字段命名不统一，结果就是&amp;quot;垃圾进，垃圾出&amp;quot;。&lt;/p>
&lt;p>③ AI 问数（NL2SQL）时代——&amp;ldquo;快但飘&amp;rdquo;。 大模型让非技术人员能用自然语言直接查数据，看似彻底解决了门槛问题，但新的危机随之而来：准确性失控。这是当前主流，正面临严峻挑战。&lt;/p>
&lt;p>④ 本体驱动的认知智能——&amp;ldquo;准且懂&amp;rdquo;。 它的核心能力是&amp;quot;推理&amp;quot;。如果说前三个阶段都在&amp;quot;找数据&amp;quot;，那么第四阶段的核心跃迁，是从&amp;quot;找数据&amp;quot;走向&amp;quot;懂数据&amp;quot;——系统不再只是被动响应查询，而是能理解数据背后的业务逻辑，进行主动的推理和关联。&lt;/p>
&lt;p>二、一线踩坑：纯 LLM 方案为何在金融场景&amp;quot;翻车&amp;quot;&lt;/p>
&lt;p>大模型的本质是基于概率预测下一个 token，它并不真正理解&amp;quot;保单状态为&amp;rsquo;有效&amp;rsquo;&amp;ldquo;在数据库里对应的是 status_code = 1 还是 status_flag = &amp;lsquo;Y&amp;rsquo;。如果没有明确指引，它就会&amp;quot;猜&amp;rdquo;——而金融数据对准确性有极高要求，容不得猜测。&lt;/p>
&lt;p>&amp;ndash; 业务问：这个月有多少张有效保单？&amp;ndash; 模型可能生成（语义错误）：SELECT COUNT(&lt;em>) FROM table WHERE status = &amp;lsquo;有效&amp;rsquo;;&amp;ndash; 而真实仓库中&amp;quot;有效&amp;quot;可能对应：SELECT COUNT(&lt;/em>) FROM table WHERE status_code = 1; &amp;ndash; 或 status_flag = &amp;lsquo;Y&amp;rsquo;&lt;/p></description></item><item><title>Agoda 用 DragonflyDB 替换 SQL Server：真正难的不是性能，而是平稳切换</title><link>https://pangyd.com/post/radar-542/</link><pubDate>Fri, 18 Sep 2026 19:20:00 +0800</pubDate><guid>https://pangyd.com/post/radar-542/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://www.infoq.cn/article/2kGlAwpJrK9I5kdDHLGz?utm_source=rss&amp;amp;utm_medium=article">Agoda 用 DragonflyDB 替换 SQL Server：真正难的不是性能，而是平稳切换&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：作者：Leela Kumili&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：InfoQ 中国（架构）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Agoda 将其一级酒店价格缓存从采用 72 个分片的 Microsoft SQL Server 部署迁移至 DragonflyDB。DragonflyDB 是一种内存数据存储系统，此次迁移旨在应对不断增长的读写量，并简化扩容。该缓存存储约 1.5 TB 的易变价格数据，每秒处理约 30 万次读取和 150 万次写入。迁移后，Agoda 报告称，P99 读取延迟改善了约八倍；DragonflyDB 在每秒处理约 30 万个请求时，P99 延迟约为 8 毫秒。&lt;/p>
&lt;p>Agoda 此前的架构需要由应用程序在 72 个 SQL Server 分片之间进行路由。扩容需要按预先规定的硬件增量进行，并手动重新映射分片和迁移数据。团队在 2024 年初将硬件容量翻倍后，不到一年又接近容量上限。不断增长的工作负载还需要一个单独的清理进程来删除过期的供应商数据。&lt;/p>
&lt;p>Agoda 首席工程师 Clarkson Chang 指出了这一问题：&lt;/p>
&lt;p>很明显，继续为 SQL Server 增加资源并不是一种可行或具有成本效益的长期策略。&lt;/p>
&lt;p>团队根据实际工作负载评估了 DragonflyDB，而非仅依赖公开的基准测试。其无共享、多线程架构、Redis 兼容性、基于集群的扩容方式和内置的键过期功能，与大量使用 MGET 和 SET 的价格缓存工作负载相吻合。Agoda 首先使用 memtier_benchmark 复现接近生产环境的 1:6 读写比例，以及平均涉及 10 个键的 MGET 操作。&lt;/p></description></item><item><title>DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning</title><link>https://pangyd.com/post/radar-199/</link><pubDate>Wed, 16 Sep 2026 13:16:37 +0800</pubDate><guid>https://pangyd.com/post/radar-199/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://arxiv.org/abs/2609.18135v1">DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：Shijie Chen, Yu Gan, Yeounoh Chung, Jiani Zhang, Quannan Li, Sravan Babu Bodapati, Cody J. Greer, Yu Su, Fatma Ozcan&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：arXiv cs.DB（数据库）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Computer Science &amp;gt; Computation and Language&lt;/p>
&lt;p>arXiv:2609.18135v1 (cs)&lt;/p>
&lt;p>[Submitted on 16 Sep 2026]&lt;/p>
&lt;p>Title:DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning&lt;/p>
&lt;p>Authors:Shijie Chen, Yu Gan, Yeounoh Chung, Jiani Zhang, Quannan Li, Sravan Babu Bodapati, Cody J. Greer, Yu Su, Fatma Ozcan&lt;/p>
&lt;p>View a PDF of the paper titled DualSQL: Text-to-SQL with Multi-Agent Reinforcement Learning, by Shijie Chen and 8 other authors&lt;/p></description></item><item><title>ProcArena: A Multi-Scenario Benchmark for LLMs on Direct and Interactive PL/SQL Development from Natural Language</title><link>https://pangyd.com/post/radar-244/</link><pubDate>Sun, 06 Sep 2026 18:47:47 +0800</pubDate><guid>https://pangyd.com/post/radar-244/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>原文&lt;/strong>：&lt;a href="https://arxiv.org/abs/2609.06527v1">ProcArena: A Multi-Scenario Benchmark for LLMs on Direct and Interactive PL/SQL Development from Natural Language&lt;/a>&lt;/p>
&lt;p>&lt;strong>作者&lt;/strong>：Hang Zhang, Chaokun Wang, Yuzhi Pan, Ziyao Zhong, Shuo Cao, Yue Xue, Zeyu Huang, Xingwei Zhou, Fang Niu, Bofan Xie, Guanchen Ge, Leqi Zheng, Ziyang Liu, Xiannian Cao, Pengcheng Ge&lt;/p>
&lt;p>&lt;strong>来源&lt;/strong>：arXiv cs.DB（数据库）&lt;/p>
&lt;/blockquote>
&lt;h2 id="正文">正文&lt;/h2>
&lt;p>Computer Science &amp;gt; Computation and Language&lt;/p>
&lt;p>arXiv:2609.06527v1 (cs)&lt;/p>
&lt;p>[Submitted on 6 Sep 2026]&lt;/p>
&lt;p>Title:ProcArena: A Multi-Scenario Benchmark for LLMs on Direct and Interactive PL/SQL Development from Natural Language&lt;/p></description></item><item><title>Python中操作mysql的pymysql模块详解</title><link>https://pangyd.com/post/197-pythonmysqlpymysql/</link><pubDate>Mon, 06 Aug 2018 18:06:31 +0800</pubDate><guid>https://pangyd.com/post/197-pythonmysqlpymysql/</guid><description>&lt;div>&lt;div>&lt;div class="article">&lt;div data-note-content="" class="show-content">&lt;div class="show-content-free">&lt;p>&lt;a href="https://link.jianshu.com?t=https://github.com/PyMySQL/PyMySQL" target="_blank" rel="nofollow">PyMySQL&lt;/a>是一个Python编写的MySQL驱动程序，让我们可以用Python语言操作MySQL数据库。&lt;/p>
&lt;p>首先，使用pip安装PyMySQL。&lt;/p>
&lt;pre class="hljs undefined">&lt;code>pip install PyMySQL
&lt;/code>&lt;/pre>
&lt;h2>使用PyMySQL&lt;/h2>
&lt;h3>简单使用&lt;/h3>
&lt;p>如果有JDBC等其他语言的数据库学习经验的话，使用PyMySQL非常简单。下面是一个完整的MySQL增删查（没有改）的例子。&lt;/p>
&lt;pre class="hljs python">&lt;code class="python">&lt;span class="hljs-keyword">import&lt;/span> pymysql
&lt;span class="hljs-keyword">import&lt;/span> datetime
&lt;p>host = &lt;span class="hljs-string">&amp;lsquo;localhost&amp;rsquo;&lt;/span>
username = &lt;span class="hljs-string">&amp;lsquo;root&amp;rsquo;&lt;/span>
password = &lt;span class="hljs-string">&amp;lsquo;12345678&amp;rsquo;&lt;/span>
db_name = &lt;span class="hljs-string">&amp;lsquo;test&amp;rsquo;&lt;/span>&lt;/p>
&lt;p>create_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
CREATE TABLE fuck(
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE ,
nickname VARCHAR(255) NOT NULL ,
birthday DATE
)
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>insert_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
INSERT INTO fuck(username,nickname,birthday)
VALUES(&amp;rsquo;{username}&amp;rsquo;,&amp;rsquo;{nickname}&amp;rsquo;,&amp;rsquo;{birthday}&amp;rsquo;)
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>query_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
SELECT id,username,nickname,birthday
FROM fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>delete_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
DELETE FROM fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p>
&lt;p>drop_table_sql = &lt;span class="hljs-string">&amp;quot;&amp;quot;&amp;quot;&lt;br>
DROP TABLE fuck
&amp;ldquo;&amp;rdquo;&amp;quot;&lt;/span>&lt;/p></description></item><item><title>HistrinBean.java 类，用亍实现对历史流水相关信息进行数据库操作的功 能，包括增加流水信息、提供多种方式的查询等</title><link>https://pangyd.com/post/42-histrinbean-java/</link><pubDate>Tue, 08 Aug 2017 19:11:26 +0800</pubDate><guid>https://pangyd.com/post/42-histrinbean-java/</guid><description>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.jnzyjsxy.common;

import java.sql.ResultSet;

import javax.swing.JOptionPane;

public class HistrinBean {
	//定义字符串用于存储sql字符串
		String sql;
		//结果集类
		ResultSet rs=null;
		//声明字符串变量 存储从操作界面传过来的人员信息
		String field1;
		String field2;
		String field3;
		String field4;
		String field5;
		String field6;
		String field7;
		public void add(String f1,String f2,String f3,String f4,String f5,
				String f6,String f7){
			//创建数据库对象 执行数据库里面的方法 链接数据库 执行sql语句
			Database DB=new Database();
			//将从添加界面传过来的值 付给成员变量
			this.field1=f1;
			this.field2=f2;
			this.field3=f3;
			this.field4=f4;
			this.field5=f5;
			this.field6=f6;
			this.field7=f7;
			//判断穿过来的值是否为空 如果为空就显示提示语句
			if (field2==null || field2.equals("")) {
				JOptionPane.showMessageDialog(null, "请输入FromAcc", "错误", JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field3==null||field3.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入OldInfo","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field4==null||field4.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入NewInfo","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field5==null||field5.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入ChgTime","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field6==null||field6.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入RegDate","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field7==null||field7.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入PersonID","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			//构建插入字符串
			//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
			//传递过来的数据是字符型， 
			//为了插入int数据，进行类型转换-Integer.parseInt(field1)
			else {
				sql="insert into Histrjn( b,PersonID) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"','"+field4+"',"+Integer.parseInt(field5)+",'"+field6+"',"+Integer.parseInt(field7)+")";
				System.out.println(sql);	
				//打开数据库连接
				try {
					DB.openConn();
					//执行sql语句
					DB.executeUpdate(sql);
					//提示信息
					JOptionPane.showMessageDialog(null, "你成功添加一条新的纪录");
				} catch (Exception e) {
					// TODO: handle exception
					//出现异常 ，给出提示
					System.out.println(e);
					JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
				}
					//关闭语句对象和链接对象
					finally{
						DB.closeStmt();
						DB.closeConn();
					}
				}
		}
			/*
			 * 根据JourNo
			 * ，返回人员信息各列值组成的字符数组
			 */
			public String[] search(String f1) {
				Database DB=new Database();
				this.field1=f1;
				//创建字符串数组 用于记录查询的数据
				String[] s =new String[6];
				sql="select * from Histrjn where JourNo="+field1;
				try{
					DB.openConn();//连接数据库
					//执行查询，查询结果付给rs，rs为结果集
					rs=DB.executeQuery(sql);
					//如果rs.next为true
					if (rs.next()) {
						//获取指定的值
						//说明：PersonID'DeptId salary均不是String类型
						//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
						//方便统一待会返回值
						s[0]=rs.getString("JourNo");
						s[1]=rs.getString("FromAcc");
						s[2]=rs.getString("OldInfo");
						s[3]=rs.getString("NewInfo");
						s[4]=rs.getString("ChgTime");
						s[5]=rs.getString("RegDate");
						s[6]=rs.getString("PersonID");
					}else {
						s=null;
					}
				}catch(Exception e){
					
				}finally {
						DB.closeStmt();
						DB.closeConn();
					}
				return s;
				}
			/*
			 * 根据PersonID
			 * ，返回人员信息各列值组成的字符数组
			 */
			public String[] searchPI(String f7) {
				Database DB=new Database();
				this.field1=f7;
				//创建字符串数组 用于记录查询的数据
				String[] s =new String[6];
				sql="select * from Histrjn where PersonID="+field7;
				try{
					DB.openConn();//连接数据库
					//执行查询，查询结果付给rs，rs为结果集
					rs=DB.executeQuery(sql);
					//如果rs.next为true
					if (rs.next()) {
						//获取指定的值
						//说明：PersonID'DeptId salary均不是String类型
						//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
						//方便统一待会返回值
						s[0]=rs.getString("JourNo");
						s[1]=rs.getString("FromAcc");
						s[2]=rs.getString("OldInfo");
						s[3]=rs.getString("NewInfo");
						s[4]=rs.getString("ChgTime");
						s[5]=rs.getString("RegDate");
						s[6]=rs.getString("PersonID");
					}else {
						s=null;
					}
				}catch(Exception e){
					
				}finally {
						DB.closeStmt();
						DB.closeConn();
					}
				return s;
				}
			}
		

&lt;/pre></description></item><item><title>人事管理系统——Histrjn表增删改查操作类</title><link>https://pangyd.com/post/39-histrjn/</link><pubDate>Mon, 07 Aug 2017 13:37:08 +0800</pubDate><guid>https://pangyd.com/post/39-histrjn/</guid><description>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.jnzyjsxy.common;

import java.sql.ResultSet;

import javax.swing.JOptionPane;

public class HistrinBean {
	//定义字符串用于存储sql字符串
		String sql;
		//结果集类
		ResultSet rs=null;
		//声明字符串变量 存储从操作界面传过来的人员信息
		String field1;
		String field2;
		String field3;
		String field4;
		String field5;
		String field6;
		String field7;
		public void add(String f1,String f2,String f3,String f4,String f5,
				String f6,String f7){
			//创建数据库对象 执行数据库里面的方法 链接数据库 执行sql语句
			Database DB=new Database();
			//将从添加界面传过来的值 付给成员变量
			this.field1=f1;
			this.field2=f2;
			this.field3=f3;
			this.field4=f4;
			this.field5=f5;
			this.field6=f6;
			this.field7=f7;
			//判断穿过来的值是否为空 如果为空就显示提示语句
			if (field2==null || field2.equals("")) {
				JOptionPane.showMessageDialog(null, "请输入FromAcc", "错误", JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field3==null||field3.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入OldInfo","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field4==null||field4.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入NewInfo","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field5==null||field5.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入ChgTime","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field6==null||field6.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入RegDate","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			else if (field7==null||field7.equals("")) {
				JOptionPane.showMessageDialog(null,"请输入PersonID","错误",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			//构建插入字符串
			//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
			//传递过来的数据是字符型， 
			//为了插入int数据，进行类型转换-Integer.parseInt(field1)
			else {
				sql="insert into Histrjn( b,PersonID) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"','"+field4+"',"+Integer.parseInt(field5)+",'"+field6+"',"+Integer.parseInt(field7)+")";
				System.out.println(sql);	
				//打开数据库连接
				try {
					DB.openConn();
					//执行sql语句
					DB.executeUpdate(sql);
					//提示信息
					JOptionPane.showMessageDialog(null, "你成功添加一条新的纪录");
				} catch (Exception e) {
					// TODO: handle exception
					//出现异常 ，给出提示
					System.out.println(e);
					JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
				}
					//关闭语句对象和链接对象
					finally{
						DB.closeStmt();
						DB.closeConn();
					}
				}
		}
			/*
			 * 根据JourNo
			 * ，返回人员信息各列值组成的字符数组
			 */
			public String[] search(String f1) {
				Database DB=new Database();
				this.field1=f1;
				//创建字符串数组 用于记录查询的数据
				String[] s =new String[6];
				sql="select * from Histrjn where JourNo="+field1;
				try{
					DB.openConn();//连接数据库
					//执行查询，查询结果付给rs，rs为结果集
					rs=DB.executeQuery(sql);
					//如果rs.next为true
					if (rs.next()) {
						//获取指定的值
						//说明：PersonID'DeptId salary均不是String类型
						//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
						//方便统一待会返回值
						s[0]=rs.getString("JourNo");
						s[1]=rs.getString("FromAcc");
						s[2]=rs.getString("OldInfo");
						s[3]=rs.getString("NewInfo");
						s[4]=rs.getString("ChgTime");
						s[5]=rs.getString("RegDate");
						s[6]=rs.getString("PersonID");
					}else {
						s=null;
					}
				}catch(Exception e){
					
				}finally {
						DB.closeStmt();
						DB.closeConn();
					}
				return s;
				}
			/*
			 * 根据PersonID
			 * ，返回人员信息各列值组成的字符数组
			 */
			public String[] searchPI(String f7) {
				Database DB=new Database();
				this.field1=f7;
				//创建字符串数组 用于记录查询的数据
				String[] s =new String[6];
				sql="select * from Histrjn where PersonID="+field7;
				try{
					DB.openConn();//连接数据库
					//执行查询，查询结果付给rs，rs为结果集
					rs=DB.executeQuery(sql);
					//如果rs.next为true
					if (rs.next()) {
						//获取指定的值
						//说明：PersonID'DeptId salary均不是String类型
						//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
						//方便统一待会返回值
						s[0]=rs.getString("JourNo");
						s[1]=rs.getString("FromAcc");
						s[2]=rs.getString("OldInfo");
						s[3]=rs.getString("NewInfo");
						s[4]=rs.getString("ChgTime");
						s[5]=rs.getString("RegDate");
						s[6]=rs.getString("PersonID");
					}else {
						s=null;
					}
				}catch(Exception e){
					
				}finally {
						DB.closeStmt();
						DB.closeConn();
					}
				return s;
				}
			}
		

&lt;/pre></description></item><item><title>人事管理系统——Dept表增删改查操作类</title><link>https://pangyd.com/post/38-dept/</link><pubDate>Mon, 07 Aug 2017 13:36:21 +0800</pubDate><guid>https://pangyd.com/post/38-dept/</guid><description>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.jnzyjsxy.common;

import java.sql.ResultSet;

import javax.swing.JOptionPane;

public class DeptBean {
	//定义字符串用于存储sql字符串
	String sql;
	//结果集类
	ResultSet rs=null;
	//声明字符串变量 存储从操作界面传过来的人员信息
	String field1;
	String field2;
	String field3;
	//添加信息
	public void add(String f1,String f2,String f3) {
		//创建数据库对象 执行数据库里面的方法 链接数据库 执行sql语句
		Database DB=new Database();
		//将从添加界面传过来的值 付给成员变量
		this.field1=f1;
		this.field2=f2;
		this.field3=f3;
		if (field2==null || field2.equals("")) {
			JOptionPane.showMessageDialog(null, "请输入人员所在一级部门", "错误", JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field3==null||field3.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入人员所在二级部门","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		//构建插入字符串
				//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
				//传递过来的数据是字符型， 
				//为了插入int数据，进行类型转换-Integer.parseInt(field1) 
				//在此PersonID，DeptID均为int类型，Sqlary为float类型，与书上不同 
				else {
					sql="insert into Dept(DeptID,B_Dept,S_Dept) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"')";
					System.out.println(sql);	
					//打开数据库连接
					try {
						DB.openConn();
						//执行sql语句
						DB.executeUpdate(sql);
						//提示信息
						JOptionPane.showMessageDialog(null, "你成功添加一条新的纪录");
					} catch (Exception e) {
						// TODO: handle exception
						//出现异常 ，给出提示
						System.out.println(e);
						JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
					}
						//关闭语句对象和链接对象
						finally{
							DB.closeStmt();
							DB.closeConn();
					}
			}
	}
	/*
	 * 修改设备信息
	 */
	public void modify(String f1,String f2,String f3){
		Database DB=new Database();
		this.field1=f1;
		this.field2=f2;
		this.field3=f3;
		if (field2==null || field2.equals("")) {
			JOptionPane.showMessageDialog(null, "请输入人员所在一级部门", "错误", JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field3==null||field3.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入人员所在二级部门","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		//构建插入字符串
		//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
		//传递过来的数据是字符型， 
		//为了插入int数据，进行类型转换-Integer.parseInt(field1) 
		//在此PersonID，DeptID均为int类型，Sqlary为float类型，与书上不同 
		else {
			sql="insert into Dept(DeptID,B_Dept,S_Dept) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"')";
			System.out.println(sql);	
			//打开数据库连接
			try {
				DB.openConn();
				//执行sql语句
				DB.executeUpdate(sql);
				//提示信息
				JOptionPane.showMessageDialog(null, "你成功修改一条新的纪录");
			} catch (Exception e) {
				// TODO: handle exception
				//出现异常 ，给出提示
				System.out.println(e);
				JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
			}
				//关闭语句对象和链接对象
				finally{
					DB.closeStmt();
					DB.closeConn();
			}
		}
	}
	/*
	 * 删除信息 根据传过来的PersonId 删除信息
	 */
	public void delete(String f1) {
		//创建数据库对象
		Database DB=new Database();
		this.field1=f1;//获取传递过来的参数
		//构建删除人员的字符串
		sql="delete from Dept where DeptID="+Integer.parseInt(field1);
		try {
			DB.openConn();
			DB.executeUpdate(sql);
			System.out.println(sql);
			JOptionPane.showMessageDialog(null, "成功删除一条新的纪录");	
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			JOptionPane.showMessageDialog(null, "删除失败", "错误", JOptionPane.ERROR_MESSAGE);
			
	}
		finally{
			DB.closeStmt();
			DB.closeConn();
		}
	}
	/*
	 * 从Dept表查询所有人员信息，DeptID列显示部门名称 
	 */
	public String[][] searchAll() {
		Database DB=new Database();
		//定义二维数组
		String[][] sn=null;
		int row=0;//行数
		int i=0;//循环变量
		//查询sql字符串
		sql="select * from Dept order by DeptID";
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
				if (rs.last()) {
					row=rs.getRow();//获取结果集rs中记录数，即行数
				}
				//如果row==0说明rs没有记录 既没有查到符号条件的记录
				if (row==0) {
					//初始化二维数组1行6列 每个元素为空白字符
					sn=new String[1][2];
					sn[0][0]="";
					sn[0][1]="";
					sn[0][2]="";
				}
				//否则rs不等于0
				else {
					//根据行数row 初始化二维数组sn
					sn=new String[row][2];
					//让rs指到第一条数据
					rs.first();
					//将指针移动到上一行 由于上一条语句记录指针到第一条数据
					//执行完这条语句后 记录指针移动的rs的头部分
					//执行该条语句的作用是保障所有的记录都能满足rs.next()条件
					rs.previous();
					while (rs.next()) {
						sn[i][0]=rs.getString("DeptID");
						sn[i][1]=rs.getString("B_Dept");
						sn[i][2]=rs.getString("S_Dept");
						i++;			
					} 
				}
		}catch (Exception e) {
			// TODO: handle exception
		}finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return sn;	
	}
	/*
	 * 获得新的Dept值
	 */
	public int getId() {
		Database DB=new Database();
		int ID=1;
		//查询sql，从Person表获取PersonID列的最大值
		sql="select max(DeptID) from Dept";
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
			if (rs.next()) {
				ID=rs.getInt(1)+1;
			}else {
				ID=1;
			}
		} catch (Exception e) {
			// TODO: handle exception
			
		}
		finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return ID;
	}
	/*
	 * 根据DeptID查询人员信息，返回人员信息各列值组成的字符数组
	 */
	public String[] search(String f1) {
		Database DB=new Database();
		this.field1=f1;
		//创建字符串数组 用于记录查询的数据
		String[] s =new String[10];
		sql="select * from Dept where DeptID="+field1;
		try{
			DB.openConn();//连接数据库
			//执行查询，查询结果付给rs，rs为结果集
			rs=DB.executeQuery(sql);
			//如果rs.next为true
			if (rs.next()) {
				//获取指定的值
				//说明：PersonID'DeptId salary均不是String类型
				//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
				//方便统一待会返回值
				s[0]=rs.getString("DeptID");
				s[1]=rs.getString("B_Dept");
				s[2]=rs.getString("S_Dept");
			}else {
				s=null;
				}
			}catch(Exception e){
				
			}finally {
					DB.closeStmt();
					DB.closeConn();
				}
			return s;
	}
	
	/*
	 * 根据传递过来的ID 返回一级部门—耳机部门
	 */
	public String getDepstr(String string) {
		// TODO Auto-generated method stub
		Database DB=new Database();
		this.field1=string;
		//创建字符串数组 用于记录查询的数据
		String s = null;
		sql="select * from Dept where DeptID="+field1;
		System.out.println(sql);
		try{
			DB.openConn();//连接数据库
			//执行查询，查询结果付给rs，rs为结果集
			rs=DB.executeQuery(sql);
			//如果rs.next为true
			if (rs.next()) {
				//获取指定的值
				//说明：PersonID'DeptId salary均不是String类型
				//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
				//方便统一待会返回值
				s=rs.getString("B_Dept")+"-"+rs.getString("S_Dept"); 	
			}else {
				s=null;
				}
			}catch(Exception e){
				
			}finally {
					DB.closeStmt();
					DB.closeConn();
				}
			return s;
	}
	
}
&lt;/pre></description></item><item><title>人事管理系统——Person表增删改查操作类</title><link>https://pangyd.com/post/36-person/</link><pubDate>Sun, 06 Aug 2017 19:27:53 +0800</pubDate><guid>https://pangyd.com/post/36-person/</guid><description>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.jnzyjsxy.common;

import java.sql.ResultSet;

import javax.sound.midi.VoiceStatus;
import javax.swing.JOptionPane;

import org.omg.CORBA.PUBLIC_MEMBER;
/*
 * 有关人员信息数据库操作的类
 */
public class PersonBean {
	//定义字符串用于存储sql字符串
	String sql;
	//结果集类
	ResultSet rs=null;
	//声明字符串变量 存储从操作界面传过来的人员信息
	String field1;
	String field2;
	String field3;
	String field4;
	String field5;
	String field6;
	String field7;
	String field8;
	String field9;
	String field10;
	
	String colname;//列名
	String colvalue1;//列值1
	String colvalue2;//列值2
	
	/*
	 * 添加信息
	 */
	public void add(String f1,String f2,String f3,String f4,String f5,
			String f6,String f7,String f8,String f9,String f10) {
		//创建数据库对象 执行数据库里面的方法 链接数据库 执行sql语句
		Database DB=new Database();
		//将从添加界面传过来的值 付给成员变量
		this.field1=f1;
		this.field2=f2;
		this.field3=f3;
		this.field4=f4;
		this.field5=f5;
		this.field6=f6;
		this.field7=f7;
		this.field8=f8;
		this.field9=f9;
		this.field10=f10;
		//判断穿过来的值是否为空 如果为空就显示提示语句
		if (field2==null || field2.equals("")) {
			JOptionPane.showMessageDialog(null, "请输入人员姓名", "错误", JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field3==null||field3.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入性别","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field4==null||field4.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入出生年月","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field5==null||field5.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入民族","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field6==null||field6.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入地址","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field7==null||field7.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入部门","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field8==null||field8.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入薪酬","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		//构建插入字符串
		//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
		//传递过来的数据是字符型， 
		//为了插入int数据，进行类型转换-Integer.parseInt(field1) 
		//在此PersonID，DeptID均为int类型，Sqlary为float类型，与书上不同 
		else {
			sql="insert into Person(PersonID,Name,Sex,Birth,Nat,Address,DeptID,Salary,Assess,Other) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"','"+field4+"','"+field5+"','"+field6+"',"+Integer.parseInt(field7)+","+Float.parseFloat(field8)+",'"+field9+"','"+field10+"')";
			System.out.println(sql);	
			//打开数据库连接
			try {
				DB.openConn();
				//执行sql语句
				DB.executeUpdate(sql);
				//提示信息
				JOptionPane.showMessageDialog(null, "你成功添加一条新的纪录");
			} catch (Exception e) {
				// TODO: handle exception
				//出现异常 ，给出提示
				System.out.println(e);
				JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
			}
				//关闭语句对象和链接对象
				finally{
					DB.closeStmt();
					DB.closeConn();
				}
			}
		}
		/*
		 * 修改设备信息
		 */
	public void modify(String f1,String f2,String f3,String f4,String f5,
			String f6,String f7,String f8,String f9,String f10) {
		Database DB=new Database();
		this.field1=f1;
		this.field2=f2;
		this.field3=f3;
		this.field4=f4;
		this.field5=f5;
		this.field6=f6;
		this.field7=f7;
		this.field8=f8;
		this.field9=f9;
		this.field10=f10;
		if (field2==null || field2.equals("")) {
			JOptionPane.showMessageDialog(null, "请输入人员姓名", "错误", JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field3==null||field3.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入性别","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field4==null||field4.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入出生年月","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field5==null||field5.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入民族","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field6==null||field6.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入地址","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field7==null||field7.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入部门","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		else if (field8==null||field8.equals("")) {
			JOptionPane.showMessageDialog(null,"请输入薪酬","错误",
					JOptionPane.ERROR_MESSAGE);
			return;
		}
		//构建插入字符串
		//构建sql字符串时，注意字符型，两侧用单引号做定界符，int,float不用定界符
		//传递过来的数据是字符型， 
		//为了插入int数据，进行类型转换-Integer.parseInt(field1) 
		//在此PersonID，DeptID均为int类型，Sqlary为float类型，与书上不同 
		else {
			sql="updata into Person(PersonID,Name,Sex,Birth,Nat,Address,DeptID,Salary,Assess,Other) values("+Integer.parseInt(field1)+ ",'"+field2+"','"+field3+"','"+field4+"','"+field5+"','"+field6+"',"+Integer.parseInt(field7)+","+Float.parseFloat(field8)+",'"+field9+"','"+field10+"')";
			System.out.println(sql);	
			//打开数据库连接
			try {
				DB.openConn();
				//执行sql语句
				DB.executeUpdate(sql);
				//提示信息
				JOptionPane.showMessageDialog(null, "你成功修改一条新的纪录！");
			} catch (Exception e) {
				// TODO: handle exception
				//出现异常 ，给出提示
				System.out.println(e);
				JOptionPane.showMessageDialog(null, "保存失败 ","错误！", JOptionPane.ERROR_MESSAGE);
			}
			finally{
				DB.closeStmt();
				DB.closeConn();
			}
	}

}
	/*
	 * 删除信息 根据传过来的PersonId 删除信息
	 */
	public void delete(String f1) {
		//创建数据库对象
		Database DB=new Database();
		this.field1=f1;//获取传递过来的参数
		//构建删除人员的字符串
		sql="delete from Person where PersonID="+Integer.parseInt(field1);
		try {
			DB.openConn();
			DB.executeUpdate(sql);
			System.out.println(sql);
			JOptionPane.showMessageDialog(null, "成功删除一条新的纪录");	
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			JOptionPane.showMessageDialog(null, "删除失败", "错误", JOptionPane.ERROR_MESSAGE);
			
	}
		finally{
			DB.closeStmt();
			DB.closeConn();
		}
}
	/*
	 * 根据PersonID查询人员信息，返回人员信息各列值组成的字符数组
	 */
	public String[] search(String f1) {
		Database DB=new Database();
		this.field1=f1;
		//创建字符串数组 用于记录查询的数据
		String[] s =new String[10];
		sql="select * from Person where PersonID="+field1;
		try{
			DB.openConn();//连接数据库
			//执行查询，查询结果付给rs，rs为结果集
			rs=DB.executeQuery(sql);
			//如果rs.next为true
			if (rs.next()) {
				//获取指定的值
				//说明：PersonID'DeptId salary均不是String类型
				//但在此简化处理，把取出值看作字符串，赋值给字符数组元素
				//方便统一待会返回值
				s[0]=rs.getString("PersonID");
				s[1]=rs.getString("Name");
				s[2]=rs.getString("Sex");
				s[3]=rs.getString("Birth");
				s[4]=rs.getString("Nat");
				s[5]=rs.getString("Address");
				s[6]=rs.getString("DeptID");
				s[7]=rs.getString("Salary");
				s[8]=rs.getString("Assess");
				s[9]=rs.getString("Other");
			}else {
				s=null;
			}
		}catch(Exception e){
			
		}finally {
				DB.closeStmt();
				DB.closeConn();
			}
		return s;
		}
		/*
		 * 人员信息综合查询
		 * 从PersonID和Dept表查询所有Where DeptID=Person.DeptID部门编号相等的记录
		 */
	public String[][] searchAllForNode() {
		//初始化数据库
		Database DB=new Database();
		//创建二维数组 存储查找到的符号条件记录的咯列值
		//由于符合条件的记录可能有多行，所以需要二维数组
		String[][] sn =null;
		int row=0;//存储行数
		int i=0;//循环变量
		//构建联合查询语句 查询条件where DeptID=Person.DeptID
		//从Person，Dept表查询Where Dept.DeptID=Person.DeptID 条件的指定字段
		sql="select PersonID,Name,Sex,Dept.DeptID as DeptID,B_Dept,S_Dept, Salary,Assess from Dept,Person where Dept.DeptID=Person.DeptID order by PersonID"; 
		try {
			DB.openConn();
			// TODO: handle exception
			//执行查询
			rs=DB.executeQuery(sql);
			//rs.last()--将记录指针移动到最后记录上，该方法类型为boolean
			//如果指针位于有效位,则返回true;如果结果集中不存在任何行,则返回false
			//即如果rs中有记录
			if (rs.last()) {
				row=rs.getRow();//获取结果集rs中记录数，即行数
			}
			//如果row==0说明rs没有记录 既没有查到符号条件的记录
			if (row==0) {
				//初始化二维数组1行6列 每个元素为空白字符
				sn=new String[1][6];
				sn[0][0]="";
				sn[0][1]="";
				sn[0][2]="";
				sn[0][3]="";
				sn[0][4]="";
				sn[0][5]="";
			}
			//否则rs不等于0
			else {
				//根据行数row 初始化二维数组sn
				sn=new String[row][6];
				//让rs指到第一条数据
				rs.first();
				//将指针移动到上一行 由于上一条语句记录指针到第一条数据
				//执行完这条语句后 记录指针移动的rs的头部分
				//执行该条语句的作用是保障所有的记录都能满足rs.next()条件
				rs.previous();
				//结果集下移一条数据 返回true 执行循环
				//如果没有执行re.previons()语句 在执行rs.next（），第一天记录就略过了。
				while (rs.next()) {
					sn[i][0]=rs.getString("PersonID");
					sn[i][1]=rs.getString("Name");
					sn[i][2]=rs.getString("Sex");
					//一级部门-二级部门，存储到sn[i][3]元素中
					sn[i][3]=rs.getString("B_Dept")+"-"+rs.getString("s_Dept");
					sn[i][4]=rs.getString("Salary");
					sn[i][5]=rs.getString("Assess");
					i++;
				}
				
			}
		}catch (Exception e) {

		}finally{
			DB.closeStmt();
			DB.closeConn();
		}
		return sn;
	}
	/*
	 * 修改Person表中 指定用户的部门信息，即修改Person表中的DeptID字段值
	 */
	public void updateDept(String f1,String f8) {
		Database DB=new Database();
		this.field1=f1;//PersonID
		this.field8=f8;//salary 薪资字段
		sql="update Person set Salary =" +Float.parseFloat(field8)+" where PersonID ="+Integer.parseInt(field1);
		try {
			DB.openConn();
			DB.executeUpdate(sql);
			JOptionPane.showMessageDialog(null, "劳资更改成功");
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			JOptionPane.showMessageDialog(null, "更新失败", "失败",JOptionPane.ERROR_MESSAGE);
		}
	}
	/*
	 * 修改Person表中指定考核信息 即修改Person表中Assess字段值
	 */
	public void updateAssess(String f1,String f9) {
	Database DB=new Database();
	this.field1=f1;
	this.field9=f9;//考核字段
	sql="update Person set Assess = '"+field9 +"' where PersonID ="+Integer.parseInt(field1);
	try{
		DB.openConn();
		DB.executeUpdate(sql);
		JOptionPane.showMessageDialog(null, "人员考核成功");
	}catch(Exception e){
		System.out.println(e);
		JOptionPane.showMessageDialog(null, "更新失败", "失败",
				JOptionPane.ERROR_MESSAGE);
	}
	}

		

	/*
	 * 从Person表查询所有的人员信息 DeptID列显示部门名称
	 */
	public String[][] searchAll() {
		Database DB=new Database();
		//定义二维数组
		String[][] sn=null;
		int row=0;//行数
		int i=0;//循环变量
		//查询sql字符串
		sql="select * from Person order by PersonID";
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
				if (rs.last()) {
					row=rs.getRow();//获取结果集rs中记录数，即行数
				}
				//如果row==0说明rs没有记录 既没有查到符号条件的记录
				if (row==0) {
					//初始化二维数组1行6列 每个元素为空白字符
					sn=new String[1][6];
					sn[0][0]="";
					sn[0][1]="";
					sn[0][2]="";
					sn[0][3]="";
					sn[0][4]="";
					sn[0][5]="";
				}
				//否则rs不等于0
				else {
					//根据行数row 初始化二维数组sn
					sn=new String[row][6];
					//让rs指到第一条数据
					rs.first();
					//将指针移动到上一行 由于上一条语句记录指针到第一条数据
					//执行完这条语句后 记录指针移动的rs的头部分
					//执行该条语句的作用是保障所有的记录都能满足rs.next()条件
					rs.previous();
					while (rs.next()) {
						sn[i][0]=rs.getString("PersonID");
						sn[i][1]=rs.getString("Name");
						sn[i][2]=rs.getString("Birth");
						sn[i][3]=rs.getString("Nat");
						sn[i][4]=rs.getString("Address");
						//创建部门操作类DeptBean的对象
						DeptBean dBean=new DeptBean();
						sn[i][5]=dBean.getDepstr(rs.getString("DeptID"));
						i++;			
					} 
				}
		}catch (Exception e) {
			// TODO: handle exception
		}finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return sn;	
	}
	/*
	 * 获得新的Person值
	 */
	public int getId() {
		Database DB=new Database();
		int ID=1;
		//查询sql，从Person表获取PersonID列的最大值
		sql="select max(PersonID) from Person";
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
			if (rs.next()) {
				ID=rs.getInt(1)+1;
			}else {
				ID=1;
			}
		} catch (Exception e) {
			// TODO: handle exception
			
		}
		finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return ID;
	}
	/*
	 * 获得DeptID
	 */
	public String getDeptId(String f1) {
		Database DB=new Database();
		//根据传递过来的PersonID 即根据员工编号，查DeptID
		sql="select DeptID from Person where PersonID = "+f1;
		String deptid=null;
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
			if (rs.next()) {
				deptid=rs.getString("DeptID");
			}else {
				deptid="";
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return deptid;
	} 
	/*
	 * 根据PersonID查找员工姓名
	 */
	public String getName(String f1) {
		Database DB=new Database();
		sql="select Name from Person where PersonID ="+f1;
		String name=null;
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
			if (rs.next()) {
				name =rs.getString("Name");
			}
			else {
				name="";
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return name;
	}
	/*
	 * 从perSon表中查找所有PersonID Name字段 存储在s数组中 返回
	 */
	public String[] getAllId() {
		String[] s=null;
		int row=0;
		int i=0;
		Database DB=new Database();
		sql="select PersonID,Name from Person order by PersonID";
		try {
			DB.openConn();
			rs=DB.executeQuery(sql);
			if (rs.last()) {
				row=rs.getRow();
			}
			if (row==0) {
				s=null;
			}else {
				s=new String[row];
				rs.first();
				rs.previous();
				while (rs.next()) {
				s[i]=rs.getString(1)+"-"+rs.getShort(2);
				i++;
					
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}finally {
			DB.closeStmt();
			DB.closeConn();
		}
		return s;
	}
	}
&lt;/pre></description></item><item><title>JDBC数据库连接代码</title><link>https://pangyd.com/post/32-jdbc/</link><pubDate>Sat, 05 Aug 2017 17:02:45 +0800</pubDate><guid>https://pangyd.com/post/32-jdbc/</guid><description>&lt;p>&lt;/p>&lt;pre lay-lang="Java" class="layui-code" skin="notepad">package com.jnzyjsxy.common;
&lt;p>import java.sql.DriverManager;&lt;/p>
&lt;p>import java.sql.ResultSet;&lt;/p>
&lt;p>import com.mysql.jdbc.Connection;&lt;/p>
&lt;p>import com.mysql.jdbc.Statement;&lt;/p>
&lt;p>/*&lt;/p>
&lt;ul>
&lt;li>数据库连接类&lt;/li>
&lt;/ul>
&lt;p>*/&lt;/p>
&lt;p>public class Database {&lt;/p>
&lt;p>//创建成员变量用于存储数据库连接的字符串或结果&lt;/p>
&lt;p>//statement接口 用于执行静态sql语句 并返回它所生成的结果&lt;/p>
&lt;p>private Statement stmt=null;&lt;/p>
&lt;p>//结果集类&lt;/p>
&lt;p>ResultSet rs=null;&lt;/p>
&lt;p>//链接类&lt;/p>
&lt;p>private Connection conn=null;&lt;/p>
&lt;p>String sql;//存储sql语句&lt;/p>
&lt;p>//mysql数据连接字符串&lt;/p>
&lt;p>//&amp;ldquo;jdbc:mysql://localhost:3306/db_hrms&amp;rdquo;&lt;/p>
&lt;p>//数据库名称db_hrms&lt;/p>
&lt;p>//在数据库名称后，增加&amp;quot;?characterEncoding=GBK&amp;quot;，避免插入记录为乱码&lt;/p>
&lt;p>String strurl=&amp;ldquo;jdbc:mysql://localhost:3306/db_hrms?characterEncoding=GBK&amp;rdquo;;//主机地址&lt;/p>
&lt;p>String username=&amp;ldquo;root&amp;rdquo;;//用户名&lt;/p>
&lt;p>String password=&amp;ldquo;123456&amp;rdquo;;//密码&lt;/p>
&lt;p>//构造方法&lt;/p>
&lt;p>public Database(){&lt;/p>
&lt;p>}&lt;/p>
&lt;p>/*&lt;/p>
&lt;ul>
&lt;li>打开数据库连接&lt;/li>
&lt;/ul>
&lt;p>*/&lt;/p>
&lt;p>public void openConn() {&lt;/p>
&lt;p>try {&lt;/p>
&lt;p>Class.forName(&amp;ldquo;com.mysql.jdbc.Driver&amp;rdquo;);&lt;/p>
&lt;p>//DriverManager.getConnection启动器管理类的连接方法&lt;/p>
&lt;p>//创建数据库连接对象三个参数 初始化conn&lt;/p>
&lt;p>conn=(Connection) DriverManager.getConnection(strurl, username, password);&lt;/p>
&lt;p>System.out.println(&amp;ldquo;数据库连接成功&amp;rdquo;);&lt;/p>
&lt;p>} catch (Exception e) {&lt;/p>
&lt;p>// TODO: handle exception&lt;/p></description></item><item><title>关于Class.forName(“com.mysql.jdbc.Driver”)</title><link>https://pangyd.com/post/30-class-forname-com-mysql-jdbc-driver/</link><pubDate>Thu, 03 Aug 2017 17:14:46 +0800</pubDate><guid>https://pangyd.com/post/30-class-forname-com-mysql-jdbc-driver/</guid><description>&lt;p>传统的使用jdbc来访问数据库的流程为：&lt;br> Class.forName(“com.mysql.jdbc.Driver”);&lt;br> String url = “jdbc:mysql://localhost:3306/test?user=root&amp;amp;password=123456″;&lt;br> Connection con = DriverManager.getConnection(url);&lt;br> Statement statement = con.createStatement();&lt;/p>&lt;p>最开始使用的时候，不明白为什么首先要加载一个驱动类，之后就可以取得了Connection了，很好奇DriverManager是怎么获得那个驱动类的信息，后来看了下com.mysql.jdbc.Driver这个类的源代码，豁然开朗了。原来在com.mysql.jdbc.Driver类中有这么一段静态初始化代码：&lt;br> static {&lt;br> try {&lt;br> java.sql.DriverManager.registerDriver(new Driver());&lt;br> } catch (SQLException E) {&lt;br> throw new RuntimeException(“Can’t register driver!”);&lt;br> }&lt;br> }&lt;br> 也就是，在Class.forName加载完驱动类，开始执行静态初始化代码时，会自动新建一个Driver的对象，并调用DriverManager.registerDriver把自己注册到DriverManager中去。&lt;br>&lt;br>&lt;strong>ps1:&lt;/strong> Class.forName(String) 与ClassLoader.loadClass(String)的区别&lt;br> Class.forName(String): 加载类，并且执行类初始化；可以通过Class.forName(String, boolean, ClassLoader)第二个参数来仅仅加载类不执行初始化；&lt;br> ClassLoader.loadClass(String): 仅仅加载类，不执行类初始化；&lt;/p>&lt;p>&lt;strong>ps2:&lt;/strong> 有时会看到这种用法：&lt;br> Class.forName(“com.mysql.jdbc.Driver”).newInstance();&lt;br> 这是没有必要的，正如前述，静态初始化已经new了一个Driver的对象，注册到DriverManager中去，在此再建立一个Driver对象则是完全没有必要的，浪费空间。&lt;/p>&lt;p>&lt;strong>ps3:&lt;/strong> 结合ps1，Class.forName(“com.mysql.jdbc.Driver”);相当于：&lt;br> ClassLoader loader = Thread.currentThread().getContextClassLoader();&lt;br> Class cls = loader.loadClass(“com.mysql.jdbc.Driver”);&lt;br> cls.newInstance();&lt;br> 这种方法的问题同ps2, 浪费了一个Driver对象；&lt;/p>&lt;p>&lt;strong>ps4:&lt;/strong> 在java 6中，引入了service provider的概念，即可以在配置文件中配置service（可能是一个interface或者abstract class）的provider（即service的实现类）。配置路径是：/META-INF/services/下面。详细信息见：https://docs.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#Service%20Provider&lt;br> 而java.sql.DriverManager也添加了对此的支持，因此，在JDK6中，DriverManager的查找Driver的范围为：&lt;br> 1）system property “jdbc.drivers” 中配置的Driver值；&lt;br> 2）用户调用Class.forName()注册的Driver&lt;br> 3）service provider配置文件java.sql.Driver中配置的Driver值。&lt;br> 因此，在jdk6中，其实是可以不用调用Class.forName来加载mysql驱动的，因为mysql的驱动程序jar包中已经包含了java.sql.Driver配置文件，并在文件中添加了com.mysql.jdbc.Driver.但在JDK6之前版本，还是要调用这个方法。&lt;/p></description></item></channel></rss>