JDBC
1.Java Database Connectivity:Java访问数据库的解决方案
2.JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
3.JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而在不同数据库之间轻易的进行切换
JDBC相关类&接口
JDBC工作原理
mysql实现
oracle实现
使用DriverManager加载驱动类
通过Class.forName( )方法(反射)完成驱动类的注册
//加载驱动 com.mysql.cj.jdbc.Driver.class
Class.forName("com.mysql.cj.jdbc.Driver");
Connection接口
根据URL连接参数找到与之匹配的Driver对象,调用其方法获取连接
// 获取连接
String url = "jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
Statement接口
Statement用于执行SQL语句
注:不同的SQL语句,要调用不同的方法来执行。
// 创建SQL语句
String sql = "insert into student(sname,birthday,ssex,classid) values('小红','2002-1-1','女',1)";
//创建SQL执行对象
Statement state = conn.createStatement();
//执行SQL语句(用于执行DML)
int ret = state.executeUpdate(sql);
//执行SQL语句(用于执行DQL)
ResultSet rs = statm.executeQuery(sql);
ResultSet接口
执行查询SQL语句后返回的结果集,由ResultSet接口接收。
常用处理方式:遍历/判断是否有结果
查询结果存放在ResultSet对象的一系列行中:
1.ResultSet对象的最初位置在行首
2.ResultSet.next()方法用来在行间移动
3.ResultSet.getXXX()方法用来取得字段的内容
String sql = "select * from student";
ResultSet rs = statm.executeQuery(sql);
while (rs.next()) {
int sid =rs.getInt("sid");
String sname = rs.getString("sname");
Date bir = rs.getDate("birthday");
String ssex = rs.getString("ssex");
int classid =rs.getInt("classid");
System.out.println(sid+sname+bir+ssex+classid);
}
关闭并释放资源
数据库操作执行完毕以后要释放相关资源(先开后关)
1.Connection
2.Statement
3.ResultSet
//释放资源
rs.close();
statm.close();
conn.close();
login(案例)
public class Test05_login {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Scanner input = new Scanner(System.in);
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT", "root", "123456");
System.out.println("请输入账号");
String username = input.nextLine();
System.out.println("请输入密码");
String userpwd = input.nextLine();
// ' or 1=1 -- sql注入
// 3.0 创建SQL语句
String sql = "select * from login where lusername = ? and luserpwd = ?";
//3.1 创建执行对象
//prepareStatement 将SQL语句传入 -- 预处理sql
PreparedStatement prestatm = conn.prepareStatement(sql);
//给SQL语句传值
prestatm.setObject(1, username);
prestatm.setObject(2, userpwd);
//3.2 执行并获取结果集
ResultSet rs = prestatm.executeQuery();
//判断结果集
if (rs.next()) {
System.out.println("登陆成功");
}else {
System.out.println("登陆失败,账号密码有误");
}
// 释放资源
rs.close();
prestatm.close();
conn.close();
input.close();
}
}
注册(案例)
public class Test07_zhuCe {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Scanner input = new Scanner(System.in);
//1.加载驱动 com.mysql.cj.jdbc.Driver.class
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取连接
String url = "jdbc:mysql://localhost:3306/myschoolxxx?serverTimezone=GMT";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);
// 添加数据
System.out.println("请输入账号:");
String username = input.nextLine();
System.out.println("请输入密码:");
String userpwd = input.nextLine();
System.out.println("请输入姓名:");
String uname = input.nextLine();
System.out.println("请输入性别:");
String sex = input.nextLine();
System.out.println("请输入地址:");
String address = input.nextLine();
// 3.0 创建SQL语句
String sql = "insert into login (lusername,luserpwd,luname,lusex,laddress) values (?,?,?,?,?)";
// 3.1 创建对象
PreparedStatement prestatm = conn.prepareStatement(sql);
prestatm.setObject(1,username);
prestatm.setObject(2,userpwd);
prestatm.setObject(3,uname);
prestatm.setObject(4,sex);
prestatm.setObject(5,address);
//3.2 执行SQL语句
int rs = prestatm.executeUpdate();
//业务逻辑
if (rs > 0) {
System.out.println("注册成功");
}else {
System.out.println("注册失败");
}
//释放资源
prestatm.close();
conn.close();
input.close();
}
}