1、JDBC的简介
1.1 jdbc:Java DataBase Connectivity,java数据库的连接
1.2 比如有一台电脑,想在电脑上安装显卡,需要显卡的驱动,由显卡生产厂商提供
1.3 要想使用java对数据库进行操作,需要使用由数据库提供的数据库驱动
1.4 一个程序,使用java操作数据库,掌握java代码,除了掌握java代码之外,需要掌握数据库驱动的代码,
很多的数据库,比如mysql、oracle,对于程序员来讲,需要掌握每种数据库的代码,对于程序员压力很大
1.5 sun公司针对这种情况,开发出一套标准接口,各个数据库只需要实现这个接口就可以了,程序员只需要掌握这套
接口就可以了,这套标准的接口就是jdbc
1.6 如果想要使用jdbc对数据库进行操作,首先安装数据库的驱动,不同的数据库提供驱动使用jar的形式提供的,
需要把jar包放到项目里面,相当于安装了数据库的驱动。
1.7 导入jar到项目中(使用到开发工具 myeclipse10.x版本)
首先创建一个文件夹 lib,把jar包复制到lib里面,选中jar包右键点击build path -- add to build path,
jar包前面的图标变成了“奶瓶”图标,表示导入jar成功
2、JDBC的入门案例
2.1 使用jdbc对数据库进行操作步骤是固定的
2.1.1 使用到类和接口
DriverManager
Connection
Statement
ResultSet
2.2 jdbc的操作步骤
第一步,加载数据库的驱动
DriverManager里面registerDriver(Driver driver)
第二步,创建与数据库的连接
DriverManager里面getConnection(String url, String user, String password)
第三步,编写sql语句
第四步,执行sql语句
Statement里面executeQuery(String sql)
第五步,释放资源(关闭连接)
2.3 使用jdbc实现查询的操作
2.3.1 代码
public static void main(String[] args) throws Exception {
//加载驱动
DriverManager.registerDriver(new Driver());
//创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root");
//编写sql
String sql = "select * from user";
//执行sql
//得到statement
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//遍历结果集得到每条记录
while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
int chinese = rs.getInt("chinese");
int english = rs.getInt("english");
System.out.println(id+" ::"+username+" :: "+chinese+" :: "+english);
}
//释放资源
rs.close();
stmt.close();
conn.close();
}
3、jdbc的DriverManager对象
3.1 在java.sql包里面
3.2 加载数据库的驱动
registerDriver(Driver driver) :参数是数据库的驱动,这个驱动是由数据库提供的
(1)这个方法在实际开发中,一般不使用,因为这个方法会加载驱动两次
(2)一般在开发中使用反射的方式加载数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
3.3 得到数据库的连接
getConnection(String url, String user, String password),返回Connection
(1)有三个参数
第一个参数:表示要连接的数据库
写法:jdbc:mysql://数据库的ip:数据库的端口号/连接的数据库的名称
jdbc:mysql://localhost:3306/testdb2
简写的方式:jdbc:mysql:///testdb2(使用范围:连接的数据库是本机,端口是3306)
第二个参数:表示连接数据库的用户名
第三个参数:表示连接数据库用户密码
4、jdbc的Connection对象
4.1 代表数据库的连接,是接口,在java.sql包里面
4.2 创建statement对象
Statement createStatement()
4.3 创建预编译对象 PreparedStatement
PreparedStatement prepareStatement(String sql)
5、jdbc的Statement对象
5.1 执行sql的对象,接口,在java.sql包里面
5.2 执行查询操作方法
ResultSet executeQuery(String sql) ,返回查询的结果集
5.3 执行增加 修改 删除的方法
int executeUpdate(String sql) ,返回成功的记录数
5.4 执行sql语句的方法
boolean execute(String sql) ,返回是布尔类型,如果执行的是查询的操作返回true,否则返回的false
5.5 执行批处理的方法
addBatch(String sql):把多个sql语句放到批处理里面
int[] executeBatch():执行批处理里面的所有的sql
6、jdbc的ResultSet对象
6.1 代表查询之后返回的结果,接口,在java.sql包里面
类似于使用select语句查询出来的表格
6.2 遍历结果集
next()
6.3 得到数据的具体值
getXXX
(1)比如数据是string类型,使用getString("字段的名称")
比如数据是int类型,使用getInt("字段的名称")
比如不知道数据的类型,使用getObject("字段的名称")
6.4 结果集的遍历方式
在最开始的时候在第一行之前,当执行了next方法之后,一行一行的向下进行遍历
,在默认的情况下,只能向下,不能向上,在遍历出来的结果也是不能修改的
7、jdbc的释放资源
7.1 关闭的原则:谁最先打开,谁最后关闭
7.2 关闭资源的规范的写法
finally {
//释放资源
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
8、使用jdbc进行crud操作
(1)实现对数据库表记录进行查询的操作
* executeQuery(sql)
(2)实现对数据库表记录进行增加的操作
* executeUpdate(sql)
(3)实现对数据库表记录进行修改的操作
* executeUpdate(sql)
(4)实现对数据库表记录进行删除的操作
* executeUpdate(sql)
9、jdbc工具类的封装
9.1 当在很多的类里面有相同的代码,可以把相同的代码提取到一个工具类里面,
在类里面直接调用工具类里面的方法实现
9.2 在jdbc实现crud操作的代码里面,首先得到数据库连接,和释放资源的代码是重复的,所以进行封装
9.3 可以把数据库的一些信息,写到配置文件里面,在工具类读取配置文件得到内容
一般使用properties格式文件作为存储数据库信息的文件
有两种方式读取配置文件
第一种,使用properties类
(1)代码
//创建properties对象
Properties p = new Properties();
//文件的输入流
InputStream in = new FileInputStream("src/db.properties");
//把文件的输入流放到对象里面
p.load(in);
String drivername = p.getProperty("drivername");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
第二种,使用ResourceBundle类
* 使用范围:首先读取的文件的格式需要时properties,文件需要放到src下面
(1)代码
String drivername = ResourceBundle.getBundle("db").getString("drivername");
String url = ResourceBundle.getBundle("db").getString("url");
String username = ResourceBundle.getBundle("db").getString("username");
String password = ResourceBundle.getBundle("db").getString("password");
9.4 代码
public static String drivername;
public static String url;
public static String username;
public static String password;
//在类加载时候,执行读取文件的操作
static {
drivername = ResourceBundle.getBundle("db").getString("drivername");
url = ResourceBundle.getBundle("db").getString("url");
username = ResourceBundle.getBundle("db").getString("username");
password = ResourceBundle.getBundle("db").getString("password");
}
10、使用jdbc的工具类实现crud操作
11、sql的注入和防止
11.1 模拟登录的效果
(1)登录的实现的步骤
首先,输入用户名和密码
第二,拿到输入的用户名和密码,到数据库里面进行查询,如果用户名和密码都正确,才表示登录成功;
但是如果用户名和密码,有一个是错误的,表示登录失败。
11.2 演示sql的注入
(1)在登录时候,用户名里面输入 bbb' or '1=1,因为在表里面有一个用户是bbb,可以登录成功
因为输入的内容,被作为sql语句的一个条件,而不是作为整个用户名。
select * from user where username='bbb' or '1=1' and password='rrr'
11.3 防止sql的注入
(1)使用PreparedStatement预编译对象防止sql注入
(2)创建PreparedStatement对象 prepareStatement(String sql)
(3)PreparedStatement接口的父接口Statement
(4)什么是预编译
(5)步骤:
第一步,加载驱动,创建数据库的连接
第二步,编写sql
第三步,需要对sql进行预编译
第四步,向sql里面设置参数
第五步,执行sql
第六步,释放资源
(6)代码
//使用工具类得到数据库的连接
conn = MyJdbcUtils.getConnection();
//编写sql
String sql = "select * from user where username=? and password=?";
//对sql进行预编译
psmt = conn.prepareStatement(sql);
//设置参数
psmt.setString(1, username);
psmt.setString(2, password);
//执行sql
rs = psmt.executeQuery();
if(rs.next()) {
System.out.println("login success");
} else {
System.out.println("fail");
}
12、使用PreparedStatement预编译对象实现crud的操作
注意地方:
第一,编写sql时候,参数使用?表示(占位符)
第二,预编译sql,设置参数的值,执行sql
12.1 使用PreparedStatement预编译对象实现查询的操作
(1)预编译对象executeQuery()执行查询语句
12.2 使用PreparedStatement预编译对象实现增加的操作
(1)预编译对象executeUpdate()执行增加的语句
12.3 使用PreparedStatement预编译对象实现修改的操作
(1)预编译对象executeUpdate()执行修改的语句
12.4 使用PreparedStatement预编译对象实现删除的操作
(1)预编译对象executeUpdate()执行删除的语句