JDBC
第一个JDBC 程序
创建测试数据库
CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `jdbcStudy`;
CREATE TABLE `users`(
`id` INT PRIMARY KEY,
`NAME` VARCHAR(40),
`PASSWORD` VARCHAR(40),
`email` VARCHAR(60),
birthday DATE
);
INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES(1,'zhangsan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'),
(3,'wangwu','123456','wangwu@sina.com','1979-12-04')
- 创建一个普通项目
- 导入数据库驱动
- 编写测试代码
package com.lx;
import java.sql.*;
public class demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver"); //固定写法, 加载驱动
//2.用户信息和url
String url="jdbc:mysql://localhost:3306/jdbcstudy?uneUnicode=true&charaterEncoding=utf8&&useSSL=true";
String username="root";
String password ="123456";
//3.连接成功 数据库对象 Connection 代表数据库
Connection connection= DriverManager.getConnection(url,username,password);
//4.执行SQL的对象 Statement 执行sql对象
Statement statement=connection.createStatement();
// 5.执行sql的对象 去执行sql 可能存在的结果 查看返回结果
String sql="SELECT * FROM users";
ResultSet resultSet=statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("name="+resultSet.getObject("NAME"));
System.out.println("pwd="+resultSet.getObject("PASSWORD"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birth="+resultSet.getObject("birthday"));
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}
步骤总结:
- 加载驱动
- 连接数据库 DriverManager
- 获得执行sql的对象 statement
- 获得返回的结果集
- 释放连接
DriverManger
// DriverManager,registerDriver(new com.mysql.jdbc.Driver);
Class.forName("com.mysql.jdbc.Driver"); //固定写法, 加载驱动
Connection connection= DriverManager.getConnection(url,username,password);
//connection 代表数据库
//数据库设置自动提交
// 事务提交
// 事务回滚
connection.rollback();
connection.commit();
connection.setAutoCommit();
URL
String url="jdbc:mysql://localhost:3306/jdbcstudy?uneUnicode=true&charaterEncoding=utf8&&useSSL=true";
//mysql --3306
// 协议://主机地址:端口号/数据库名?参数1&参数2&参数3
Statement 执行sql对象 PrparStatment 执行sql对象
String sql="SELECT * FROM users";
statement.executeQuery(); //查询操作返回 ResultSet
statement.execute(); //执行任何sql
statement.executeUpdate(); //更新 插入 删除 都是用这个 返回受影响的行数
ResultSet 查询的结果集:封装了所有的查询结果
获得指定的数据类型
resultSet.getObject(); //在不知道列类型的情况下使用
//如果知道列的类型就是用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDate();
resultSet.gettoBject();
statement 对象
jdbc 中的statemment对象用于向数据库发送sql语句,向完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
statement对象的executeUpdate方法,用于向数据库发送增删改查sql语句,executeUpdate执行完后,将会返回一个整数,(既增删改查语句导致数据库几行数据发送了变化)。
Statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象。
CRUD 操作-create
使用executeUpdate(String sql)方法完成数据添加操作,示例操作:
Statement st=conn.createStatement();
String sql ="insert into user(...) values(...)";
int num =st.executeUpdate(sql);
if(num>0){
System.out.println("插入成功!!");
}
CRUD 操作 -delete
使用executeUpdate(String sql)方法完成数据删除操作,实例操作:
Statement st=conn.createStatement();
String sql="delete from user where id=1";
int num =st.executeUpdate(sql);
if(num>0){
System.out.println("删除成功!!!");
}
CRUD操作 update
使用executeUpdate(String sql) 方法完成数据修改操作 实例操作:
Statement st =conn.createStatement();
String sql="update user set name='' where name=''";
int num=st.executeUpdate(sql)
if(num>0){
System.out.orintln("修改成功");
}
CRUD 操作 -read
使用 executeQuery(String sql) 方法完成数据查询操作,示例操作:
Statement st =conn.createStatement();
String sql="select * from user where id=1";
int num=st.executeUpdate(sql)
while(rs.next()){
//根据获取列的数据类型,分别调用rs相对应的方法映射道java对象中
}
SQL 注入
概念:
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
案例
package lx2;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class sql_zr {
public static void main(String[] args) {
// login("lisi","123456"); //正常登录
login("'or'1=1","'or'1=1");
}
public static void login(String useranme,String pwd){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//获取数据库连接
conn= JdbcUtils.getConnection();
// 获取slq的执行对象
st =conn.createStatement();
String sql=" select * from users where `NAME` ='"+useranme+"' AND `PASSWORD`='"+pwd+"'";
rs=st.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getString("NAME"));
System.out.println(rs.getString("PASSWORD"));
System.out.println("-----------------------------------------------");
}
} catch(SQLException e){
e.printStackTrace();
}
finally {
JdbcUtils.release(conn,st,rs);
}
}
}
PreparedStatement 对象
增加
package lx3;
import lx2.JdbcUtils;
import java.sql.*;
public class TestInsert {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps=null;
ResultSet rs = null;
try {
//获取数据库连接
conn= JdbcUtils.getConnection();
String sql=" INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)VALUES(?,?,?,?,?)";
ps =conn.prepareStatement(sql);
ps.setInt(1,6);
ps.setString(2,"llllll");
ps.setString(3,"123123");
ps.setString(4,"12313@qq.com");
ps.setDate(5,new Date(new java.util.Date().getTime()));
int i=ps.executeUpdate();
if (i>0){
System.out.println("ok");
}else {
System.out.println("no");
}
} catch(SQLException e){
e.printStackTrace();
}
finally {
JdbcUtils.release(conn,ps,rs);
}
}
}
删除
package lx3;
import lx2.JdbcUtils;
import java.sql.*;
public class TestDelete {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps=null;
ResultSet rs = null;
try {
//获取数据库连接
conn= JdbcUtils.getConnection();
String sql=" delete from users where id=?";
ps =conn.prepareStatement(sql);
ps.setInt(1,5);
int i=ps.executeUpdate();
if (i>0){
System.out.println("ok");
}else {
System.out.println("no");
}
} catch(SQLException e){
e.printStackTrace();
}
finally {
JdbcUtils.release(conn,ps,rs);
}
}
}
修改
package lx3;
import lx2.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestUpdate {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps=null;
ResultSet rs = null;
try {
//获取数据库连接
conn= JdbcUtils.getConnection();
String sql=" UPDATE `users` SET NAME='阿斯蒂芬1' WHERE id=?";
ps =conn.prepareStatement(sql);
ps.setInt(1,4);
int i=ps.executeUpdate();
if (i>0){
System.out.println("ok");
}else {
System.out.println("no");
}
} catch(SQLException e){
e.printStackTrace();
}
finally {
JdbcUtils.release(conn,ps,rs);
}
}
}
查询
package lx3;
import lx2.JdbcUtils;
import java.sql.*;
public class TestSelect {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取数据库连接
conn= JdbcUtils.getConnection();
// 获取slq的执行对象
String sql="select * from users where id=?";
ps =conn.prepareStatement(sql);
ps.setInt(1,3);
rs= ps.executeQuery();
if (rs.next()){
System.out.println(rs.getString("name"));
}
} catch(SQLException e){
e.printStackTrace();
}
finally {
JdbcUtils.release(conn,ps,rs);
}
}
}