Eclipse中完成查询数据库SQLserver,必须得先完成eclipse和数据库的连接。
最近完成了职工信息管理系统的编程,本篇文章在Employee类的基础下总结的。
一. 需要查询数据库,我就先创建一个类(SQLServer类),类里面包括数据库的连接和查询方法的重写,存放结果集的结果池。如果你想在其他方法查询数据,就可以直接实例化SQLServer,利用构造函数完成数据库的连接。
package EmployeeInformationSystem;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SQLServer { //数据库连接方式是混合验证方式
public String sqlserverDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public String sqlserverString="jdbc:sqlserver://localhost;database=职工信息管理系统;integratedSecurity=true;";
Connection con = null; //连接数据库
Statement st = null; //创建对象,用来执行不带参数的SQL查询和更新
PreparedStatement pre = null;//创建对象,用来执行带参数的SQL语句
public ResultSet rs = null;//存放结果集
public SQLServer() { //创建对象的时候已经连接数据库
try{
Class.forName(sqlserverDriver);
this.con = DriverManager.getConnection(sqlserverString);
this.st = this.con.createStatement();
}
catch(Exception e) {
System.out.println(e.toString());
}
}
public ResultSet executeQuery(String strsql) {
try {
this.rs = st.executeQuery(strsql);
return rs;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
public boolean execute(String strsql) {
try {
if(this.st.executeUpdate(strsql) == 0)
return false;
else
return true;
}
catch(SQLException e) {
e.printStackTrace();
return false;
}
}
}
二. 用户登录功能:用户输入账号密码,界面获取用户名,通过用户名查询数据库的密码,比对验证。在编写代码的过程中我遇到了一个意想不到的错误,主要还是自己对比对过程没有理解透彻!一开始我采取的是第二种方法,发现即使我输入正确的用户名和密码还是不能通过验证,问题还是出在结果池的指针移动,加入我输入正确的用户名和密码,数据库返回结果集,if语句判断为假,跳到else,但是结果集(数据池)只有一条语句(元组),判断if的时候指针指向第一个元组,跳到else的时候指针移动到下面的空元组,永远无法通过验证,除非你的同一个用户名有两个密码(哈哈哈哈不太现实)。所以我修改了方法:首先判断有结果集,执行有结果的语句,其次判断空结果集。
SQLServer sqlserver = new SQLServer();//创建数据库对象
try
{
String sql = "select * from 管理员信息表 where 管理员ID= "+textfield1.getText(); //查询语句
sqlserver.rs = sqlserver.executeQuery(sql); //返回结果集
if(sqlserver.rs.next())
{
//检查密码是否匹配
if(textfield2.getText().equals(sqlserver.rs.getString("密码")))
//System.out.println("登陆成功!");
{
Alert alert = new Alert(Alert.AlertType.INFORMATION,"登陆成功!");
alert.setTitle("提示");
alert.show();
//登陆成功进入主页
gridpane.setVisible(false);
((VBox)functionList[1]).setVisible(true);
primaryStage.setWidth(645);
primaryStage.setHeight(480);
primaryStage.setTitle("主页");
}
else
{
Alert alert = new Alert(Alert.AlertType.INFORMATION,"密码错误!");
alert.setTitle("提示");
alert.show();
}
//System.out.println("密码错误!!!");
}
else
{
Alert alert = new Alert(Alert.AlertType.INFORMATION,"不存在此用户!");
alert.setTitle("提示");
alert.show();
}
} catch (SQLException ee)
{
// TODO Auto-generated catch block
ee.printStackTrace();
}
}
//此方法是错误的,数据库返回的是一个结果集合,所以rs不可能是null,是一个没有结果的集合;
//假设返回的结果集不为空,第一个if语句的判断过后,结果集的指针下移一位,就没有结果集,则无法进行下面的判断!!!
//修改方法是先判断有结果集
// if(!sqlserver.rs.next())
// {
// Alert alert = new Alert(Alert.AlertType.INFORMATION,"不存在此用户!");
// alert.setTitle("提示");
// alert.show();
// }
// else
// {
// //检查密码是否匹配
// while(sqlserver.rs.next())
// {
// if(textfield2.getText().equals(sqlserver.rs.getString("密码")))
// //System.out.println("登陆成功!");
// {
// Alert alert = new Alert(Alert.AlertType.INFORMATION,"登陆成功!");
// alert.setTitle("提示");
// alert.show();
// //登陆成功进入主页
// gridpane.setVisible(false);
// ((VBox)functionList[1]).setVisible(true);
// primaryStage.setWidth(645);
// primaryStage.setHeight(480);
// primaryStage.setTitle("主页");
// }
// else
// {
// Alert alert = new Alert(Alert.AlertType.INFORMATION,"密码错误!");
// alert.setTitle("提示");
// alert.show();
// }
// //System.out.println("密码错误!!!");
// }
// System.out.println("没有了");
// }
//
//
// } catch (SQLException ee)
// {
// // TODO Auto-generated catch block
// ee.printStackTrace();
//
// }
// }
三. 查询数据库之后,返回的结果集放在数据池,eclipse处理结果是一条一条的,数据池就是缓冲区。这里需要注意的是将数据库查询出来的结果转换成正确的数据类型,并赋值。(注意下面代码“年龄”字段的数据类型转换)
SQLServer sqlserver = new SQLServer();//创建数据库对象
String sql = "select* from 职员信息表"; //查询语句
sqlserver.rs = sqlserver.executeQuery(sql);//返回结果集
try
{
while(sqlserver.rs.next()) {
String id = sqlserver.rs.getString("职工号");
String name = sqlserver.rs.getString("姓名");
String gender = sqlserver.rs.getString("性别");
int age = Integer.parseInt(sqlserver.rs.getString("年龄")); //数据类型转换
String education = sqlserver.rs.getString("学历");
int salary = Integer.parseInt(sqlserver.rs.getString("工资")); //数据类型转换
String addr = sqlserver.rs.getString("地址");
String phone = sqlserver.rs.getString("电话");
int workage = Integer.parseInt(sqlserver.rs.getString("工龄")); //数据类型转换
String position = sqlserver.rs.getString("职位");
//对象数组中加入employee对象
emp.add(new Employee(id,name,gender,age,education,salary,addr,phone,workage,position));
}
data = FXCollections.observableArrayList(emp);//将对象数组加入数据模型中
table.setItems(data);//数据模型加入表格中
} catch (SQLException ee)
{
// TODO Auto-generated catch block
ee.printStackTrace();
}
四. 注册功能。通过eclipse可以插入数据库中不允许为空的空元组!!!一开始我以为出BUG,改了好久还是没有发现错误,因为我的SQLServer2017里面的表格里的字段设置非空了,照道理插入不进去的,但还是通过java语句插入了,真的是奇葩。插入空语句之后,还给前面查询功能增加了很大的麻烦,因为插入空元组,字符型字段就为空,无法通过数据类型转换成java中的数值型(为了方便,数据库里的”年龄“字段我设置为nvarchar)。
解决的方法有:
(1)在java中首先判断不为空的字段是否为空(null),错误;
(2)在java中首先判断不为空的字段是否为空字符,错误;
(3)在java中首先判断不为空的字段长度是否是0,正确!
if(textfield1.getText().length()==0) //判断文本框中的字段长度
{
Alert alert = new Alert(Alert.AlertType.INFORMATION,"请输入正确的信息!");
alert.setTitle("提示");
alert.show();
}
else
{
try{
String sql = "insert into 管理员信息表 values(?,?,?,?,?,?,?,?);";
PreparedStatement pre = sqlserver.con.prepareStatement(sql);
pre.setString(1, textfield1.getText());
pre.setString(2, textfield2.getText());
pre.setString(3, textfield3.getText());
pre.setString(4, textfield4.getText());
pre.setString(5, textfield5.getText());
pre.setString(6,textfield6.getText());
pre.setString(7, textfield7.getText());
pre.setString(8, textfield8.getText());
pre.executeUpdate();
Alert alert = new Alert(Alert.AlertType.INFORMATION,"注册成功!");
alert.setTitle("提示");
alert.show();
//System.out.println("数据库插入成功");
//注册成功后,文本框清空
textfield1.setText("");
textfield2.setText("");
textfield3.setText("");
textfield4.setText("");
textfield5.setText("");
textfield6.setText("");
textfield7.setText("");
textfield8.setText("");
}
catch(SQLServerException e2) //设置主键,插入相同的元组会报错!
{
Alert alert = new Alert(Alert.AlertType.INFORMATION,"管理员ID已存在!请输入其它ID号");
alert.setTitle("提示");
alert.show();
}
catch(Exception ee){
ee.printStackTrace();
Alert alert = new Alert(Alert.AlertType.INFORMATION,"注册失败!请输入正确的信息!");
alert.setTitle("提示");
alert.show();
//System.out.println("插入失败");
}
}}