上一篇分析了数据库接口类,基本都是固定的操作,所以把它封装成一个类。这一次就用上了数据库接口类了,整个程序中需要用到数据库来保存的信息是学生信息和管理员(用户)的信息,所以我们要创建这两个实体类,然后创建这两个类对应的数据库接口类。一个一个来吧!
在了解实体类的数据库接口类之前先看一下实体类中都有些什么?这里就给出管理员实体类的代码,可以看出有成员变量、设置器和访问器,设置器和访问器是为了方便设置和读取对象成员变量的值。学生信息实体类也是一样的,这里就不放了。添加设置器和访问器的快捷键是Alt+Shift+s,按完之后会弹出一个框,再按一下s就可以了。
package hr.obj;
public class admin_user {
private String account;
private String password;
private String okpwd;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setOkpwd(String okPwd) {
this.okpwd = okPwd;
}
public String getOkpwd() {
return okpwd;
}}
一、管理员数据库接口类
package hr.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import hr.obj.admin_user;
public class UserDao {
/**
* 判断用户名和密码的方法
*/
public static boolean userlogin(admin_user user) {
Connection conn = null;
try {
String username = user.getAccount();
String pwd = user.getPassword();
conn = DAO.getConnection();// 获得数据库连接
PreparedStatement ps = conn.prepareStatement("select password from admin_users where account=?");
ps.setString(1, username);
ResultSet rs = ps.executeQuery();// 执行SQL语句,获得查询结果集
if (rs.next() && rs.getRow() > 0) { // 通过用户名这一列,判断是否有用户名
String password = rs.getString("password");
if (password.equals(pwd)) {// 如果有用户名,判断密码是否一致
SaveUserTool.setUsername(username);// 记录当前登录的账号
SaveUserTool.setPassword(pwd);// 记录当前登录的密码
return true; // 密码正确返回true
} else {
JOptionPane.showMessageDialog(null, "密码不正确!");
return false; // 密码错误返回false
}
} else {
JOptionPane.showMessageDialog(null, "用户不存在!");
return false; // 用户不存在返回false
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "登录失败,数据库异常!\n" + e.getMessage());
return false; // 数据库异常返回false
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* 添加用户信息的方法
*/
public static void addUser(admin_user user) {
Connection conn = null;
try {
String username = user.getAccount();
String pwd = user.getPassword();
String okpwd = user.getOkpwd();
if (username == null || username.trim().equals("") || pwd == null || pwd.trim().equals("") || okpwd == null
|| okpwd.trim().equals("")) {
JOptionPane.showMessageDialog(null, "用户名或密码不能为空!");
return;
}
if (!pwd.trim().equals(okpwd.trim())) {
JOptionPane.showMessageDialog(null, "两次输入的密码不一致。");
return;
}
conn = DAO.getConnection();
PreparedStatement ps = conn.prepareStatement("insert into admin_users (account,password)values(?,?)");
ps.setString(1, username.trim());
ps.setString(2, pwd.trim());
int effect_count = ps.executeUpdate();
if (effect_count > 0) {
JOptionPane.showMessageDialog(null, "添加成功!");
} else {
JOptionPane.showMessageDialog(null, "添加失败!");
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "用户名已存在,请换一个名称!");
return;
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 修改用户的密码 oldpwd:原密码
*
* newpwd:新密码
*
* okpwd:确认密码
*/
public static void updateUser(String oldpwd, String newpwd, String okpwd) {
try {
if (!newpwd.trim().equals(okpwd.trim())) {
JOptionPane.showMessageDialog(null, "两次输入的密码不一致!");
return;
}
if (!oldpwd.trim().equals(SaveUserTool.getPassword())) {
JOptionPane.showMessageDialog(null, "原密码不正确!");
return;
}
Connection conn = DAO.getConnection();
PreparedStatement ps;
ps = conn.prepareStatement("update admin_users set password=? where account=?");
ps.setString(1, newpwd.trim());
ps.setString(2, SaveUserTool.getUsername());
int effect_count = ps.executeUpdate();
if (effect_count > 0) {
JOptionPane.showMessageDialog(null, "密码修改成功!");
} else {
JOptionPane.showMessageDialog(null, "密码修改失败!");
}
ps.close();
conn.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "数据库异常!" + e.getMessage());
return;
}
}}
这个类中有三个方法,分别用来校验登录的密码是否正确、添加新管理员、修改管理员的密码。其中校验登录和添加管理员的函数参数是一个管理员对象,这种做法就印证了java的面向对象的思想。具体怎么使用呢?下一篇会详细讲,这里就用添加管理员举一个小例子。
.
当用户输入新管理员信息的时候,先新建一个管理员实体类的对象,然后调用该对象的设置器为所有成员变量赋值,然后调用上面的方法addUser(admin_user user),把该对象传进去就行了,这就完成了添加用户的操作。
.
从上面的代码可以看到这句代码conn = DAO.getConnection(); 这一句就是调用了上一篇的数据库接口类中的连接数据库方法。需要连接数据库进行操作时,直接调用就行,这就是java编程的思想。
但是为什么修改管理员密码的时候就不用传对象作为参数呢?这里是有一个小技巧,留到下一篇分享哈!!
二、学生信息数据库类
因为学生信息也是一个实体类,也会涉及到增删改查等操作,所以用对象来操作也是必然的。因为代码量太大,这里就只列举添加学生信息的操作(增加一个新学生),其他的删除、修改’都是差不多的,只不过sql语句不一样而已。
public class StudentDAO {
/**
* 添加学生信息
*/
public static void insert_studentInfo(stu_info stu) {
if (SaveStudentTool.isFlag_insert()) {
SaveStudentTool.setFlag_insert(false);
}
// 信息为空校验
if (stu.getId() == null || stu.getId().trim().equals("")) {
JOptionPane.showMessageDialog(null, "学号必须填写!");
return;
}
if (stu.getName() == null || stu.getName().trim().equals("")) {
JOptionPane.showMessageDialog(null, "姓名必须填写!");
return;
}
if (stu.getSex() == null || stu.getSex().trim().equals("")) {
JOptionPane.showMessageDialog(null, "性别必须填写!");
return;
}
if (stu.getBirthday() == null || stu.getBirthday().trim().equals("")) {
JOptionPane.showMessageDialog(null, "出生年月日必须填写!");
return;
}
if (stu.getEmail() == null || stu.getEmail().trim().equals("")) {
JOptionPane.showMessageDialog(null, "邮件账号必须填写!");
return;
}
if (stu.getPhone() == null || stu.getPhone().trim().equals("")) {
JOptionPane.showMessageDialog(null, "电话号码必须填写!");
return;
}
if (stu.getAddress() == null || stu.getAddress().trim().equals("")) {
JOptionPane.showMessageDialog(null, "地址必须填写!");
return;
}
if (stu.getPosition() == null || stu.getPosition().trim().equals("")) {
JOptionPane.showMessageDialog(null, "职位必须填写!");
return;
}
Connection conn = null;// 声明数据库连接对象
// 声明PreparedStatement对象
PreparedStatement ps = null;
try {
conn = DAO.getConnection();// 获得数据库连接
// 创建PreparedStatement对象,并传递SQL语句
ps = conn.prepareStatement("insert into IOT_18_3 (id,name,sex,position,address,birthday,phone,email)values(?,?,?,?,?,?,?,?)");
ps.setString(1, stu.getId());// 为sql中的参数赋值
ps.setString(2, stu.getName());
ps.setString(3, stu.getSex());
ps.setString(4, stu.getPosition());
ps.setString(5, stu.getAddress());
ps.setString(6, stu.getBirthday());
ps.setString(7, stu.getPhone());
ps.setString(8, stu.getEmail());
int effect_count = ps.executeUpdate();// 获取sql执行结果
if (effect_count > 0) {// 如果影响行数大于0,代表执行成功
JOptionPane.showMessageDialog(null, "添加学生信息成功!");
SaveStudentTool.setFlag_insert(true);
} else {
JOptionPane.showMessageDialog(null, "添加学生信息失败!");
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "数据库异常,添加失败!");
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}}
跟管理员的例子一样,把新学生的信息赋值给一个新的学生信息对象后,把这个对象传给insert_studentInfo(stu_info stu),就完成了添加学生信息的操作。同样这里也有这一句conn = DAO.getConnection(); 跟上面的是一样的,如果脑子灵活的话,可以想到上面涉及到的两个类也是为了给其他类直接调用的,因为只需要传对象过去就行。至于给谁调用,看下一篇就知道了。