mysql学习(6):使用jdbc模拟用户登录LogIn

来源:互联网 发布:海淘用哪个软件 编辑:程序博客网 时间:2024/04/27 03:21

jdbc是连接java和mysql等数据库的重要环节,在了解了java操作数据库必要的几个类之后,我们写一个模拟用户登录的代码加强对于jdbc的学习

一,前期准备

首先mysql的库中要有user表,如:

username    passwordadmin       123456

二,eclipse中新建工程,导入mysql jar包

首先我们将“得到数据库连接”和“关闭资源”这些重复性的代码分离出来,封装进一个类中,并且该类读取配置文件

package com.jimmy.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.ResourceBundle;public class JDBCUtils {//数据库连接用到的字段我们从配置文件中读取private static String driverClass;private static String url;private static String username;private static String password;//下面的静态代码块就是读取配置文件中的数据static{ResourceBundle rb = ResourceBundle.getBundle("mysqlInfo");driverClass = rb.getString("driverClass");url = rb.getString("url");username = rb.getString("username");password = rb.getString("password");}//取得连接函数public static Connection getConnection() throws Exception {Class.forName(driverClass);Connection conn = DriverManager.getConnection(url,username, password);return conn;}//关闭资源函数public static void closeRes(ResultSet rst, Statement stmt, Connection conn){if (rst != null) {try {rst.close();} catch (Exception e) {e.printStackTrace();}rst = null;}if (stmt != null) {try {stmt.close();} catch (Exception e) {e.printStackTrace();}stmt = null;}if (conn != null) {try {conn.close();} catch (Exception e) {e.printStackTrace();}conn = null;}}}

工程的src路径下创建配置文件mysqlInfo.properties

 driverClass = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/emp username = root password = 123456

三,编写查找user的函数

package com.jimmy.jdbc;import java.sql.Connection;import java.sql.Statement;import java.sql.ResultSet;public class findUser {//编写getLogIn函数,传入用户名和密码public void getLogIn(String username, String password) throws Exception{Connection conn = JDBCUtils.getConnection(); //获得连接Statement stmt = conn.createStatement();     ResultSet rst = stmt.executeQuery("select * from stu "   //将形参与sql语句组合,比较麻烦,但是能看明白+ "where username='"+username+"' and password='"+password+"'");if (rst.next()) {  //如果查询到记录,输出successSystem.out.println("log in success");}else {    //否则为falseSystem.out.println("log in false");}JDBCUtils.closeRes(rst, stmt, conn);   //关闭资源}}

四,编写客户端程序,模拟登陆

package com.jimmy.jdbc;import java.util.Scanner;public class UserLogIn {public static void main(String[] args) throws Exception {Scanner input = new Scanner(System.in);System.out.println("username:");String username = input.nextLine();  //获取一行输入System.out.println("password:");String password = input.nextLine();  //获取一行输入findUser ff = new findUser();ff.getLogIn(username, password);}}

在控制台分别输入:admin,123456即可。


但是!

上面的代码有问题,在findUser类中可能会出现SQL代码注入的问题,所以我们抛弃了不安全的Statment类对象,转而使用更加安全且灵活的PreparedStatement类对象。

package com.jimmy.jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;public class findUser2 {//重写findUser函数public void getLogIn(String username, String password) throws Exception{Connection conn = JDBCUtils.getConnection(); //获取连接String sql = "select * from stu where stuId=? and name=?";  //用问号代表占位符,随后赋值,简洁方便 PreparedStatement pstmt = conn.prepareStatement(sql);  //prepareStatement()方法会提前编译sql语句,保证代码不被注入pstmt.setString(1, password); //为占位符赋值pstmt.setString(2, username);ResultSet rst = pstmt.executeQuery(); //这里只执行编译好的sql语句if (rst.next()) {System.out.println("log in success");}else {System.out.println("log in false");}JDBCUtils.closeRes(rst, pstmt, conn);}}

返回测试函数,调用该类的getLogIn方法即可避免sql代码注入问题。

0 0