JDBC的概述
- JDBC(Java Data Base Connectivity ,Java数据库连接)是一种执行SQL语句的Java API, 可以为多种关系型数据库提供统一的访问方式,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范。
- JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
- JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定的通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
- mysql供应商提供的驱动为 mysql-connector-java-5.1.39-bin-jar;
JDBC的原理
- JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
JDBC开发步骤
- 注册驱动.
- 获得连接.
- 获得语句执行平台
- 执行sql语句
- 处理结果
- 释放资源.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动 DriverManager.registerDriver(new Driver());这个方法注册了两次驱动,没必要
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
String url = "jdbc:mysql://localhost:3366/mybase";
String user = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, user, password);
//3.获取语句执行平台
Statement sta = con.createStatement();
//4.执行SQL语句
String sql = "INSERT INTO zhangwu(id,zname,zmoney) VALUES (8,'xxxx',500000);";
int row = sta.executeUpdate(sql);
//5.处理结果集
System.out.println(row);
//6.释放资源
sta.close();
con.close();
}
}
- SQL执行语句
executeUpdate();//操作:增删改
executeQuery();//查询,查询使用preparedstatement对象调用结果集方法得到数据(高效安全)
boolean next;//判断是否有结果集
getXxx();//得到数据
getString();
getObject();
SQL注入攻击
select * from userinformation where user='xxx' and password='zzz' or '1=1';
"select * from users where username='"+username+"' and password='"+pass+"'"
- 解决方式:PreparedStatement子接口实现sql预编译存储,多次高效的执行sql
PreparedStatement preparedStatement(String sql);
实例:PreparedStatement pst = con.prepareStatement(sql);
其中的sql语句中的参数使用?替代;
"select * from users where username=? and password=?"
其中调用sql中的setObject方法;设置?占位
实例:pst.setObject(1,user);pst.setObject(2,pass);
- 实例
//4.执行SQL语句
String sql = "update zhangwu set zname=?, zmoney=? where id = ?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setObject(1, "兰博基尼LP700");
pst.setObject(2, 7890000);
pst.setObject(3, 7);
pst.executeUpdate();
JDBCUtils
package JDBCUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3366/mybase";
String username = "root";
String password = "123";
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex+"数据库连接失败");
}
}
public static Connection getConnection(){
return con;
}
public static void close(Connection con, Statement stat , ResultSet rst){
if(rst!=null){
try{
rst.close();
}catch(SQLException sql){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException sql){}
}
if(con!=null){
try{
con.close();
}catch(SQLException sql){}
}
}
public static void close(Connection con, Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException sql){}
}
if(con!=null){
try{
con.close();
}catch(SQLException sql){}
}
}
}
案例:数据保存至集合
- sort类
package JDBCUtils;
public class Sort {
private int id;
private String zname;
private double zmoney;
public Sort() {
super();
// TODO Auto-generated constructor stub
}
public Sort(int id, String zname, double zmoney) {
super();
this.id = id;
this.zname = zname;
this.zmoney = zmoney;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getZname() {
return zname;
}
public void setZname(String zname) {
this.zname = zname;
}
public double getZmoney() {
return zmoney;
}
public void setZmoney(double zmoney) {
this.zmoney = zmoney;
}
@Override
public String toString() {
return "Sort [id=" + id + ", name=" + zname + ", money=" + zmoney + "]";
}
}
- 测试类
package JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListAndJDBC {
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
Connection con = JDBCUtils.getConnection();
String sql = "select * from zhangwu";
PreparedStatement prs = con.prepareStatement(sql);
ResultSet rs = prs.executeQuery();
Sort s = null;
List<Sort> list = new ArrayList<>();
while(rs.next()){
s = new Sort(rs.getInt("id"),rs.getString("zname"),rs.getDouble("zmoney"));
list.add(s);
}
JDBCUtils.close(con, prs, rs);
Iterator<Sort> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
System.out.println("--end--");
}
}
Properties 配置文件
- src/.properties/ key=value;
- 读取配置文件:
- 加载配置文件,推荐使用类加载器
- IO读取文件,将键值对存储在集合中
- 从集合中以键值对的方式获取数据库的连接信息,完成数据库的连接
InputStream in = Pro.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
System.out.println(pro);
in.close();
JDBCUtils之Properties版
package JDBCUtils;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con;
private static String driveClass;
private static String url;
private static String username;
private static String password;
static{
try{
readProperties();
Class.forName(driveClass);
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex+"数据库连接失败");
}
}
public static Connection getConnection(){
return con;
}
private static void readProperties() throws Exception{
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
driveClass = pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
}
public static void close(Connection con, Statement stat , ResultSet rst){
if(rst!=null){
try{
rst.close();
}catch(SQLException sql){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException sql){}
}
if(con!=null){
try{
con.close();
}catch(SQLException sql){}
}
}
public static void close(Connection con, Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException sql){}
}
if(con!=null){
try{
con.close();
}catch(SQLException sql){}
}
}
}