jdbc 详解各个对象及简单登录练习
1、详解各个对象:
1、DriverManager :驱动管理器
-
功能:
1.注册驱动(static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager)
代码:
Class.forName("com.mysql.cj.jdbc.Driver");
关联性:
在com.mysql.jdbc.Driver类中存在静态代码块:
static{ try{ java.sql.DriverManager.registerDriver(new Driver()); }catch(SQLException E){ throw new RuntimeException("Can't register driver!") } }
2.获取数据库连接
-
方法:static Connection getConnection(String url,String user,String password)
-
参数:
1、url:指定链接的路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
例如:jdbc:mysql://localhost:3306/db3
细节:若依旧是本地ip以及默认端口号,则可以简写为:jdbc:mysql:///db3
2、user:用户名
3、password:密码
-
2、Connection:数据库连接对象
-
功能
1、获取执行sql的对象
- Statement createStatement()
- PreparedStatement prepareStatement(String sql)
2、管理事务:
- 开启事务:void setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
- 提交事务:commit()
- 回滚事务:roolback()
3、Statement:执行sql的对象
1、执行sql:
(1) boolean excute(String sql);(了解)可以执行任意sql
(2) int excuteUpdate(String sql);执行DML(insert\update\delete)语句、ddl(create\alter\drop)语句
返回值为影响行数
(3)ResultSet excuteQuery(String sql) :执行DQL(select)语句
4、ResultSet:结果集对象,封装查询结果
-
boolean next():游标向下移动一行
-
getXxxx(参数):获取数据
Xxxx:代表数据类型 如 :int getInt() , String getString()
参数:1、int :代表编号,从1开始
2、String:代表列名称
-
使用步骤:
1、游标向下移动一行
2、判断是否有数据
3、获取数据
ResultSet rs = tmt.executeUpdate(sql); while(rs.next()){//循环 判断游标是否有下一行 //获取数据 int id = rs.getInt(1); String name = rs.getString("sname"); System.out.println(id + name); }
5、PreparedStatement(3子类,更加强大): 执行sql的对象
1、sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
1、输出用户随便,输入密码:‘a’ or ‘a’ = ‘a’;
2、sql:select * from user where username = ‘dsfs’ and password = ‘a’ or ‘a’ = ‘a’
2、解决sql注入问题:使用PreparedStatement对象来解决
3、预编译SQL:参数使用?作为占位符
4、步骤:
1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象Connection
4、定义sql语句
(注意:SQL参数使用?作为占位符。如:select * from user where username = ? and password = ? ;)
5、获取执行sql语句的对象PreparedStatement Connection.prepareStatement(String sql)
6、给? 赋值:
1、方法:setXxxx(参数1,参数2)
参数1:?的位置编号 从1开始
参数2:?的值
7、执行sql语句,接受返回值,不需要传递sql
8、处理结果
9、资源释放
5、后期都会使用PreparedStatement来完成增删改查的所有操作,更加高效,防止SQL注入
抽取JDBC工具类:JDBCUtils
-
目的:简化书写
-
分析:
-
注册驱动
-
抽取一个方法获取链接
- 需求:不传参,保证工具类的通用性
- 解决:配置文件
- jdbc.properties
- url=
- user =
- password =
-
抽取一个方法释放资源
-
/*
* JDBC工具类
* */
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/*
* 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
* */
static{
// 获取资源文件,获取值
try {
//1、创建Properties集合类
Properties pro = new Properties();
// 获取src路径下的文件方式--->ClassLoader类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String path = resource.getPath();
//2、加载文件
//pro.load(new FileReader("src/jdbc.properties"));
pro.load(new FileReader(path));
//3、获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4、注册驱动
Class.forName(driver);
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement stmt, Connection conn, ResultSet rs){
if (rs != null ){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null ){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null ){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
练习
-
需求 :
-
通过键盘录入用户名和密码
-
判断用户是否登陆成功
select * from user where username = "(参数)" and password = "(参数)"; ###若有查询结果则返回成功,否则返回失败
-
-
步骤:
-
创建数据表user
create table user( id int primary key auto_increment, username varchar(32), password varchar(32) ); insert into user values(null,'zhangsan','123'); insert into user values(null,'lisi','345');
-
完整代码
package cn.itest.jdbc; /* * 需求 : - 通过键盘录入用户名和密码 - 判断用户是否登陆成功 * */ import cn.itest.util.JDBCUtils; import java.sql.*; import java.util.Scanner; public class jdbcdemo3 { public static void main(String[] args) { // 1、键盘录入,输入用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.nextLine(); System.out.println("请输入密码:"); String password = sc.nextLine(); // 2、调用方法 boolean flag = new jdbcdemo3().login(username, password); // 3、判断结果输出结果 if (flag){ System.out.println("登录成功!"); }else{ System.out.println("用户名或密码错误"); } } // 登陆方法 public boolean login(String username,String password){ if(username == null || password == null){ return false; } // 连接数据库判断是否登录成功 Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //1、获取连接 conn = JDBCUtils.getConnection(); // 2、定义sql String sql = "select * from user where username = ? and password = ? "; // 3、获取执行sql的对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1,username); pstmt.setString(2,password); // 4、 执行查询 rs = pstmt.executeQuery(); // 5、判断 return rs.next(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(pstmt,conn,rs); } return false; } }
-
黑马