Java语句对SQLserver数据库的操作

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("插入失败");
				   }
			      
		}}
  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值