40#JDBC&JDBCUtils

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开发步骤

  1. 注册驱动.
  2. 获得连接.
  3. 获得语句执行平台
  4. 执行sql语句
  5. 处理结果
  6. 释放资源.
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){}
		}
	}
}

 

猜你喜欢

转载自blog.csdn.net/weixin_43660263/article/details/86619949