JDBC
是什么???
java database connectivity (java连接数据库)
通过java程序来直接访问数据库服务器。
有什么用???
可以通过java程序直接发送SQL语句,与数据库进行交互。
怎么用???
步骤:
1.注册管理驱动
2.建立连接
3.发送请求
4.接受响应
5.断开连接,释放资源。
准备工作:
1.将Driver jar 包复制到 java程序下 lib文件夹中 ,
2.右击BuildPath --> add to … 导入jar包
案例1: 实现JDBC 基本连接 – 查询
import com.mysql.jdbc.Driver;
import java.sql.*;
/**
* 实现JDBC 连接
*/
public class jdbc {
// sql查询
public static void main(String[] args) throws SQLException { // 异常应该处理掉,而不应该抛掉
// 1.实现对驱动注册管理
DriverManager.registerDriver(new Driver());
//2.建立连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useSSL = true", //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
"root", // 数据库账号
"root" // 数据库密码
);
//3. 发送数据
String sql = "select * from student";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql); // rs 游标 箭头
//4.返回响应
while (rs.next()){ //循环遍历
int sid = rs.getInt("sid");
String sname = rs.getString("sname");
System.out.printf("sid = %d,sname = %s\n",sid,sname);
}
//5.释放资源
rs.close();
stmt.close();
conn.close();
}
}
/**
* 改进点:
* 1. 异常需要处理掉(不能随便抛出),可以添加自定义异常
* 2. 获取到的数据不直接输出,把结果封装为一个实体类
*
*/
案例2:实现登录、增加、查询
import com.mysql.jdbc.Driver;
import entity.Student;
import entity.Userinfo;
import javax.swing.plaf.synth.SynthDesktopIconUI;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 实现JDBC 连接
*
* 改进点:
* 1. 异常需要处理掉(不能随便抛出),可以添加自定义异常
* 2. 获取到的数据不直接输出,把结果封装为一个实体类
*/
public class jdbc2 {
//登录
//解决了异常的处理、传输的加密、新的注册管理, 建立了Userinfo实体类、空指针异常
// 但存在SQL注入的问题 (login2 中将会解决)
// 新建了Userinfo 实体类
public static Userinfo login(String username,String password){
Userinfo info = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//注册管理
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useSSL = true", //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
"root", // 数据库账号
"root" ); // 数据库密码
// 发送请求
stmt = conn.createStatement(); // 下面的SQL存储SQL注入的问题(需处理)
String sql = "select * from userinfo where username ="+ username+"and password ='"+password+"' ";
rs = stmt.executeQuery(sql);
// 返回响应
while(rs.next()){
info = new Userinfo();
info.setSid(rs.getInt("uid"));
info.setSname(username);
info.getPassword(password);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
try{
//5.释放资源
if (rs != null){
rs.close();
}
if (stmt != null){
stmt.close();
}
if (conn != null){
conn.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
return info;
}
// 查询所有
// 新建了student实体类
public static void queryAll(){
// 构造list集合存储数据
List<Student> stus = new ArrayList<>();
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
// 1.实现对驱动注册管理
DriverManager.registerDriver(new Driver());
//2.建立连接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useSSL = true", //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
"root", // 数据库账号
"root" // 数据库密码
);
//3. 发送数据
String sql = "select * from student";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql); // rs 游标 箭头
//4.返回响应
while (rs.next()){ //循环遍历
int sid = rs.getInt("sid");
String sname = rs.getString("sname");
Student stu = new Student(sid,sname);
stus.add(stu); // 将获取到的每条student数据存储到列表中
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
//5.释放资源
if (rs != null){
rs.close();
}
if (stmt != null){
stmt.close();
}
if (conn != null){
conn.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
}
// 添加
public static int insert(Student stu){
// 记录影响的行数
int rows = 0;
Connection conn = null;
Statement stmt = null;
try {
// 注册驱动(更好)
Class.forName("com.mysql.jdbc.Driver"); // 静态块中执行DriverManager.registerDriver(new Driver())
// 获取连接
conn = DriverManager.getConnection( //localhost:3306 则 IP(本地)和端口(3306)可以省略
"jdbc:mysql:///student?useSSL = true", //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
"root", // 数据库账号
"root"); // 数据库密码
// 发送SQL
stmt = conn.createStatement();
String sql = "insert into student values("+stu.getsid()+",+'"+ stu.getSname()+"')"; //静态SQL(会发生SQL注入)
rows = stmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try{
//5.释放资源
if (stmt != null){ // 防止stmt 为空,(空指针异常)
stmt.close();
}
if (conn != null){
conn.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
return rows;
}
//登录2
// 解决了SQL注入问题,采用PrepareStatement
public static Userinfo login2(String username,String password){
Userinfo info = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//注册管理
Class.forName("com.mysql.jdbc.Driver");
//建立连接
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/student?useSSL = true", //jdbc协议:子协议mysql://IP(本地) :端口(3306)/ 数据库?加密传输
"root", // 数据库账号
"root" ); // 数据库密码
// 发送请求
String sql = "select * from userinfo where username =? and password =?";
//创建ps对象并且对SQL执行预编译
ps = conn.prepareStatement(sql); // 下面的SQL存储SQL注入的问题(需处理)
// 赋值
ps.setString(1,username);
ps.setString(2,password);
// 发送SQL
rs = ps.executeQuery();
// 返回响应
while(rs.next()){
info = new Userinfo();
info.setSid(rs.getInt("uid"));
info.setSname(username);
info.getPassword(password);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
try{
//5.释放资源
if (rs != null){
rs.close();
}
if (ps != null){
ps.close();
}
if (conn != null){
conn.close();
}
}catch (SQLException e) {
e.printStackTrace();
}
}
return info;
}
public static void main(String[] args){
// 测试查询
Student stu = new Student(2,"zs");
// 测试添加
System.out.println(insert(stu));
// 测试登录
System.out.println(login("zs","123"));
if(login("ww","566") == null){
System.out.println("登录失败");
}else {
System.out.println("登录成功");
}
// 测试登录(防SQL注入)
if(login2("ww","566") == null){
System.out.println("登录失败");
}else {
System.out.println("登录成功");
}
}
}
Userinfo 实体类
package entity;
/**
* userinfo 实体类
*/
public class Userinfo {
private int sid;
private String username;
private String password;
public Userinfo(){
}
public Userinfo(int sid,String username,String password){
super();
this.sid = sid;
this.username = username;
this.password = password;
}
public int getSid(){
return sid;
}
public String getsname(){
return username;
}
public String getPassword(String password){
return this.password;
}
public void setSid(int sid){
this.sid = sid;
}
public void setSname(String username){
this.username = username;
}
public void setPassword(String password){
this.password = password;
}
}
Student 实体类
package entity;
// 实体类
/**
* student 表对应的类
*/
public class Student {
private int sid;
private String sname;
public Student(){
}
public Student(int sid,String sname){
super();
this.sid = sid;
this.sname = sname;
}
// get 、set
public int getsid(){
return sid;
}
public void setSid(int sid){
this.sid = sid;
}
public String getSname(){
return sname;
}
public void setSname(String sname){
this.sname = sname;
}
@Override
public String toString(){
return "Student [sid="+ sid +",sname="+ sname +"]";
}
}