写了网站登录检查的代码,通过将用户输入的用户名和密码与数据库中存储的用户名和密码进行比较,如果一致则登录成功,不一致则登陆失败
现在再给出网站登录列表中的,修改密码,注册账号,注销账号功能
先给出userInfo用户信息表的数据
package mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class LoginUpdate {
public static void main(String[] args) throws Exception {
System.out.println("修改密码");
String update = update("654321", "root");
System.out.println(update);
System.out.println("注册账号");
String insert = insert("demo","222222");
System.out.println(insert);
System.out.println("注销账号");
String delete = delete("test");
System.out.println(delete);
}
//修改密码
public static String update(String password,String username) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/show1", "root", "123456");
String sql = "update userInfo set password=? where username=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,password);
ps.setString(2,username);
int i = ps.executeUpdate();
conn.close();
ps.close();
if(i!=1){
return "修改失败";
}
return "修改成功";
}
//注册账号
public static String insert(String username,String password) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/show1", "root", "123456");
String sql = "insert into userInfo values(?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
int i = ps.executeUpdate();
conn.close();
ps.close();
if(i!=1){
return "注册失败";
}
return "注册成功";
}
//注销账号
public static String delete(String username) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/show1", "root", "123456");
String sql = "delete from userInfo where username=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,username);
int i = ps.executeUpdate();
conn.close();
ps.close();
if(i!=1){
return "注销失败";
}
return "注销成功";
}
}
查询一下数据库里面的表,select * from userInfo;
密码确实被修改了,test用户被注销,新增了一个demo用户
jdbc工具类
现在来思考一个问题,上面代码里面有三个功能,修改密码,注册账号,注销账号。三个功能分别对应三个方法,但是方法内的语句有大量重复的地方,比如获取驱动和获取连接的代码,获取执行器,以及最后关闭的代码其实都是重复的。这不符合我们写代码的精简思想,所以能不能把这些重复的代码都提取出来,放进一个工具类里面。比如将建立连接的代码放入工具类里面,工具类提供给外界一个获取的方法,需要的时候直接调用方法即可。
这个工具类就是jdbc工具类,现在给出工具类的全部代码
package mysql;
import sun.security.util.Password;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtil {
private static String URL;
private static String DRIVER;
private static String USERNAME;
private static String PASSWORD;
private static Connection conn=null;
private static PreparedStatement ps=null;
private static ResultSet rs=null;
static{
try{
//获取配置文件里面的参数信息
Properties properties = new Properties();
//利用反射加载配置文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("mysql.properties");
//利用Properties对象加载输入流is
properties.load(is);
DRIVER=properties.getProperty("driver");
URL=properties.getProperty("url");
USERNAME=properties.getProperty("username");
PASSWORD=properties.getProperty("password");
//获取驱动
Class.forName(DRIVER);
//获取连接
conn=DriverManager.getConnection(URL,USERNAME,PASSWORD);
}catch(Exception e){
e.printStackTrace();
}
}
//获取连接
public static Connection getConn(){
return conn;
}
//获取执行器
public static PreparedStatement getPs(String sql){
try {
ps = conn.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return ps;
}
//获取查询语句的结果集
public static ResultSet getRs(){
try {
rs=ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
//获取增删改语句的结果集
public static int update(){
int i=0;
try {
i=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
//给执行器传参
public static void setPs(String...args){
try{
for (int i = 0; i < args.length; i++) {
ps.setString(i+1,args[i]);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭
public static void closeAll(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
注意代码中用到了mysql.properties配置文件,这个文件要自己去创建
里面的内容为
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://master:3306/show1
username=root
password=123456
这样做的好处是,同一份JDBCUtil代码可以被不同的人使用,但大家的数据库和ip地址等信息是不同的。因此将这些链接信息都放入配置文件中,这样哪怕在不同的主机上使用工具类代码,也不需要修改JDBCUtil类,只需要修改配置文件即可。
利用工具类,再来重新写一下之前的修改密码,注册账号,注销账号的方法
package mysql;
public class LoginUpdate1 {
public static void main(String[] args) {
System.out.println("修改密码");
String update = update("root", "123456");
System.out.println(update);
System.out.println("------------------");
System.out.println("注册账号");
String show = insert("show", "333333");
System.out.println(show);
System.out.println("------------------");
System.out.println("注销账号");
String demo = delete("demo");
System.out.println(demo);
JDBCUtil.closeAll();
}
public static String update(String username,String password){
JDBCUtil.getConn();
String sql = "update userInfo set password=? where username=?";
JDBCUtil.getPs(sql);
JDBCUtil.setPs(password,username);
int i = JDBCUtil.update();
if(i!=1){
return "修改失败";
}
return "修改成功";
}
public static String insert(String username,String password){
JDBCUtil.getConn();
String sql = "insert into userInfo values(?,?)";
JDBCUtil.getPs(sql);
JDBCUtil.setPs(username,password);
int i = JDBCUtil.update();
if(i!=1){
return "注册失败";
}
return "注册成功";
}
public static String delete(String username){
JDBCUtil.getConn();
String sql = "delete from userInfo where username=?";
JDBCUtil.getPs(sql);
JDBCUtil.setPs(username);
int i = JDBCUtil.update();
if(i!=1){
return "注销失败";
}
return "注册成功";
}
}