JDBC学习总结

JDBC概念

JDBC——数据库连接,是用于执行SQL语句的API函数,由一组用java编写的类和接口组成。

开发步骤

一、导入驱动jar包

驱动包资源 提取码: d7uc
下载jar包,在project下创建文件夹,将jar包解压后复制进来,右击选择Build Path-Add to Path,将jar包添加进Reference Library中,此时就可以使用了。

二、注册驱动

DriverManager类(java.sql)——管理一组 JDBC 驱动程序的基本服务。

static void registerDriver(Driver driver) //向 DriverManager 注册给定驱动程序。

DriverManager.registerDriver(new Driver());

查看源码会发现调用此方法会出现二次注册的情况,浪费资源,不推荐使用此方法。
最好使用反射技术,将驱动类添加到内容当中

Class.forName("com.mysql.jdbc.Driver");

三、获得连接

使用DriverManager中的静态方法

static Connection getConnection(url, user, password)

返回值是Connection(SQL包下)接口的实现类。
url:数据库地址 格式:jdbc:mysql://连接主机IP:端口号//数据库名称
user:用户名
password:密码

String url="jdbc:mysql://localhost:3306/try1";
String user="root";
String password="0831";
Connection con = DriverManager.getConnection(url, user, password);

执行程序,输出con,如果出现下面类似输出,则说明连接成功
输出con显示的结果

四、获得语句执行平台

通过数据库连接对象,获取SQL执行对象。
Connection对象调用Statement(sql包)类中的createStatement()方法。

Statement stat = con.createStatement();

输出stat查看操作结果:
在这里插入图片描述

五、执行SQL语句

通过执行者对象(Statement)调用方法执行SQL语句,获取结果

增、删、改

调用方法:

int excuteUptate (String sql)//注:int表示操作成功的行数,以下同

操作示例:

String SQL1="INSERT INTO database1 (zname,zage,zsex) VALUES (17,23,'女')";//增加一行
String SQL2="DELETE FROM DATABASE1 WHERE ZNAME=17";//删除一行
String SQL3="UPDATE DATABASE1 SET ZAGE=17,ZSEX='男' WHERE ZNAME=5";//更新一行
int row = stat.executeUpdate(SQL1)+stat.executeUpdate(SQL2)+stat.executeUpdate(SQL3);
System.out.println(row);//row=3,共完成三行操作
查询

调用方法:

ResultSet  excuteQuery (String sql)//注:返回Result接口的实现类对象,在mysql驱动中

操作示例:

String sql="SELECT * FROM DATABASE1";
ResultSet rs = stat.executeQuery(sql);
while(rs.next())//输出,rs.next用来判断下一行是否存在
{
	System.out.println(rs.getInt("zname")+"   "+rs.getInt("zage")+"  "+rs.getString("zsex"));
}

六、释放资源

调用close方法

rs.close();
con.close();
pst.close();
stat.close();

SQL注入攻击

注入攻击

编写代码时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据。

String sql="SELECT * FROM DATABASE2 WHERE USERNAME='A' AND PASSWD='12336' OR '1=1'";

这样一段代码可以通过编译,1=1使得无论何时条件都为1,因此不管账号密码是否正确都可以获取全部信息。

注入攻击预防

使用Statement的子接口Preparedstatement(SQL预编译存储,多次高效执行SQL,还可以防止注入攻击)
SQL语句中的参数全部采用问号占位符。
用pst的方法赋值。

String sql="SELECT * FROM DATABASE2 WHERE USERNAME=? AND PASSWD=?";
PreparedStatement pst = con.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
pst.setObject(1, "asd");

JDBC工具包

因为每次连接数据库的过程都是一样的,所以可以把他们封装进包里,然后就可以直接调用了。

封装方法:

JDBCutils:


import java.sql.Connection;
import java.sql.DriverManager;

/*
 * 实现JDBC工具类
 * 定义方法,直接返回数据库的连接对象
 */
public class JDBCutils {
	private JDBCutils(){}
	private static Connection con;
	
	static {
		try{
			Class.forName("com.mysql.jdbc.Driver");
			String url="jdbc:mysql://localhost:3306/try1";
			String user="root",passwd="0831";
			con = DriverManager.getConnection(url, user, passwd);
		}catch(Exception ex){
			throw new RuntimeException(ex+"数据库连接失败");
		}
		
	}
	/*
	 * 定义静态方法,返回数据库的连接对象
	 */
	public static Connection getConnection(){
		return con;
	}
}

调用方法:


import JDBCutil.JDBCutils;//导包

Connection con=JDBCutils.getConnection();

JDBUtil工具类

每次在代码里写入数据库地址、用户名、密码有些麻烦,所以就采用一种新的写法,利用properties文件来进行读取操作,将需要的信息存放在文件中,直接从文件中写入。

在src文件夹下创建文件database.properties,将需要的信息写入。
在这里插入图片描述

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

/*
 * 加载配置文件
 * IO读取文件,键值对存储到集合
 * 从集合中以键值对的方式获取数据库的连接信息,完成数据库的连接
 */
 
public class PropertiesDemo {
	public static void main(String[] args)throws Exception {
		/*FileInputStream fis = new FileInputStream("src/database.properties");
		System.out.println(fis);*/
		//使用类的加载器
		InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");//在bin目录下获取流
		System.out.println(in);
		Properties pro = new Properties();
		pro.load(in);
		System.out.println(pro);
		String driverClass = pro.getProperty("driverClass");
		String url = pro.getProperty("url");
		String username = pro.getProperty("username");
		String password = pro.getProperty("password");
		Class.forName(driverClass);
		Connection con = DriverManager.getConnection(url, username, password);
		System.out.println(con);
	}
}

写成工具类:

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import javax.management.RuntimeErrorException;

/*
 * 采用读取配置文件的方法定义JDBC工具类
 * 读取配置文件,获取连接,执行一次static{}就可以了!
 */
public class JDBCutilsConfig {
	private static Connection con;
	private static String driverClass;
	private static String url;
	private static String username;
	private static String password;
	
	static{
		
		try {
			readConfig();
			Class.forName(driverClass);
			con = DriverManager.getConnection(url, username, password);
		} catch (Exception ex) {
			// TODO Auto-generated catch block
			throw new RuntimeException("数据库连接失败");
		} 
		
	}
	private static void readConfig()throws Exception
	{
		InputStream in = JDBCutilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
		Properties pro = new Properties();
		pro.load(in);
		driverClass = pro.getProperty("driverClass");
		url = pro.getProperty("url");
		username = pro.getProperty("username");
		password = pro.getProperty("password");
	}
	
	public static Connection getConnection(){
		return con;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值