jdbc执行过程 jar包下载
工具和准备:
MYSQL 8.0jar包:
链接:https://pan.baidu.com/s/1O3xuB0o1DxmprLPLEQpZxQ
提取码:grni
使用eclipse开发首先把jar包导入内库中
首先将jar包复制到项目src下,右击src点击build path然后会在Refrenced中看到jar包
本篇博客主要讲述jdbc的操作过程,每一步需要干什么,最后用代码实现一个有数据库的简易注册登录功能。
下面的代码能够对jdbc的执行过程有初步的了解。
大体分为以下几步:
首先进行注册驱动
可以使用 Driver driver=new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver); 来进行注册驱动
也可以使用java反射技术采用别人的接口来进行注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
接下来进行获取数据库连接
需要url,数据库用户名以及密码
通过DriverManager.getConnection(url, user, password)赋给Connection对象
注意:
mysql8.0的url以及mysql接口名称与mysql5.0发生了变化
mysql5.0:
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/suzy";(suzy为我的数据库名称)
mysql8.0:
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai";
接下来获取数据库操作对象
通过createstatement方法赋给Statement对象
接下来执行sql语句
自己构建sql语句通过executeQuery方法进行执行
接下来处理查询结果集
当rs.next为true的时候不断打印
最后将资源关闭
rs.close(); st.close(); conn.close();
了解jdbc执行过程代码如下:
package jdbcdemo; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcTest01 { public static void main(String[] args) { // TODO Auto-generated method stub Statement st=null; Connection conn=null; ResultSet rs=null; try { //1.注册驱动 /* Driver driver=new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver);*/ Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取数据库连接 String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); //3.获取数据库操作对象 st=conn.createStatement(); //4.执行sql语句 String sql="select e.ename,e.sal from emp e"; rs=st.executeQuery(sql); //5.处理查询结果集 while(rs.next()) { String ename=rs.getString("ename"); double sal=rs.getDouble("sal"); System.out.println(ename+"||"+sal); } } catch (Exception e) { e.printStackTrace(); }finally { if(rs!=null) { try { rs.close(); }catch(Exception e) { e.printStackTrace(); } } if(st!=null) { try { st.close(); }catch(Exception e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); }catch(Exception e) { e.printStackTrace(); } } } } }
使用jdbc实现一个简易的注册代码如下:
public class JdbcTest02 { public static void main(String[] args) throws SQLException { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); System.out.println("欢迎来控制台进行注册"); System.out.println("请输入您要注册的用户名"); String name=in.nextLine(); System.out.println("请输入您的密码"); String pwd=in.nextLine(); Connection conn=null; Statement st=null; int count=0; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); st=conn.createStatement(); String sql="insert into t_user(username,password) values('"+name+"','"+pwd+"')"; count=st.executeUpdate(sql); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(st!=null) { st.close(); } if(conn!=null) { conn.close(); } } if(count==1) { System.out.println("注册成功!!!"); } else { System.out.println("注册失败!!!"); } } }
注册界面效果图:
数据库相应的添加了刚才注册的信息
使用jdbc实现一个简易的登录代码如下:
public class JdbcTest03 { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Scanner in =new Scanner(System.in); System.out.println("欢迎来控制台进行登录"); System.out.println("请输入您的用户名"); String name=in.nextLine(); System.out.println("请输入您的密码"); String pwd=in.nextLine(); Statement st=null; Connection conn=null; ResultSet rs=null; PreparedStatement ps=null; boolean flag=false; try { Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取数据库连接 String url="jdbc:mysql://localhost:3306/suzy?useSSL=false&serverTimezone=Asia/Shanghai"; String user="root"; String password="10086"; conn=DriverManager.getConnection(url, user, password); //3.获取数据库操作对象 //st=conn.createStatement(); //4.执行sql语句 //String sql="select username from t_user where username='"+name+"' and password='"+pwd+"'"; //定义sql语句框架 String sql="select username from t_user where username= ? and password = ?"; //sql语句进行预编译 ps=conn.prepareStatement(sql); //对sql语句进行赋值 ps.setString(1, name); ps.setString(2, pwd); rs=ps.executeQuery(); //rs=st.executeQuery(sql); if(rs.next()) { flag=true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(rs!=null) { rs.close(); } if(ps!=null)//st!=null { //st.close(); ps.close(); } if(conn!=null) { conn.close(); } } if(flag) { System.out.println("登陆成功!!!"); } else { System.out.println("您输入的用户名或密码错误"); } } }
登录界面效果如下:
可是发现用户名ss数据库并没有却能登陆成功,debug后发现这样的密码导致sql语句变为select username from t_user where (username='ss' and password ='asdf') or 'kk'='kk',后面的'kk'='kk'是恒成立的,前面是or语句所以百分百执行
怎样解决这个bug呢:
采用预编译对象prepareStatement,定义sql框架使用?占位符,预编译之后进行Sql赋值
上述代码是解决bug之后的(有注释的是有bug时候的代码)
接下来运行发现得到正确的运行结果