目录
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,如果出现下面类似输出,则说明连接成功
四、获得语句执行平台
通过数据库连接对象,获取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;
}
}