数据库整合开发
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下载的驱动包是一个压缩包,将包内的“mysqlconnector-java-5.1.42-bin.jar”复制到 “WebRoot\lib”文件夹下,如图6.4所示。
6.2.1 创建数据库连接
图6.3 下载MySQL驱动包
图6.4 加载MySQL驱动包
6.2.1 创建数据库连接
2.数据库管理工具
8
Statement st = conn.createStatement();
9
ResultSet rs = st.executeQuery(sql);
10
if(rs.next()){
11
UserDO user = new UserDO();
12
//将查询结果封装到user对象中,此处先不处理
13
return user;
PreparedStatement ResultSet executeQuery()
6.2.2 SQL的执行
(2)java.sql.PreparedStatement接口
在Statement中可以看到,动态SQL的生成是通过字 符串拼接而成的,但是字符串拼接会带来很多的安全 隐患,其中最为常见的安全漏洞就是SQL注入。
下面以登录功能为例,在cn.edu.zzti.dao包下的 UserDAO接口中定义登录判断方法,代码如下:
14
}
15
return null;
16
}
在代码的第6行,我们将拼接后的SQL语句打印到控制台进行观察 。在第12行处,需要将获得的数据库查询结果进行封装,这里暂 不实现这个功能。下面先来创建一个
cn.edu.zzti.dao.impl.mysql. jdbc.test.UserDAOImplTest类,对方法findUser进行测试,具 体代码如下。
6.2 JDBC概述
图6.1 应用程序直接访问数据库
图6.2 应用程序访问JDBC
6.2 JDBC概述
JDBC主要包含两部分:面向Java程序员的 JDBC API和面向数据库厂商的JDBC Drive API。
1.面向 Java 程序员的 JDBC API
它主要由一系列的接口定义所构成。 java.sql.DriveManager:该接口定义了用来处理
在开发中,我们一般会创建一个专用于创建数据库 连接和释放数据库连接的工具类。建立与数据库的 连接需要完成如下两个步骤。
(1)加载驱动类到内存
Class.forName("com.mysql.jdbc.Driver");
(2)创建与数据源的连接
Connection con=DriverManager.getConnection( String url, String username, String password);
Statement st = conn.createStatement(); 所获得的Statement对象st,可以用来执行SQL语句,Statement执行
SQL语句的主要方法有两个: int executeUpdate(String sql); ResultSet executeQuery(String sql);
11
e.printStackTrace();
12
fail("出现异常,执行失败");
13
}
14
}
15 }
Assert.assertNotNull(Object o)是Junit的断言,该断言方法判 断对象o是否为空,为空则当前测试方法通过,否则测试方法失败 。执行结果显示,使用不存在的用户名和密码,调用登录方法执行 结果为登录正常。在输出的SQL结果显示,最终执行的SQL如下:
2.面向数据库厂商的JDBC Drive API
6.2 JDBC概述
6.2.1 创建数据库连接 6.2.2 SQL的执行 6.2.3 SQL执行结果的处理
6.2.1 创建数据库连接
在Java程序中要操作数据库,一般应该通过 如下几步。
1.下载数据库开发所需要的驱动包
用户可以从对应的数据库厂商的官网进行下载,例 如,下载MySQL驱动包,如图6.3所示,选择 “JDBC DriverforMySQL”进行下载。
第6章 数据库整合开发
本章内容
MySQL简介 JDBC概述 数据库连接池 DBUtils框架简介 简易购物商城
6.1 MySQL简介
MySQL是一个关系型数据库,它由瑞典 MySQL AB公司开发,目前属于Oracle旗 下的产品。MySQL是最流行的关系型数据 库管理系统之一,在Web应用方面, MySQL是最好的关系数据库管理系统( Relational DataBase Management System,RDBMS)应用软件。
public UserDO findUser(String username, String password) throws SQLException;
具体代码如下:
6.2.2 SQL的执行
1 public UserDO findUser(String username, String password) throws SQLException {
与之前的SQL对比可以发现,原来的形式参数部分被占位符“?”代替 ,那么就需要将形式参数与具体的“?”绑定。绑定操作可通过调用 setXXX 方法来完成,其中,XXX 是与该参数相对应的类型。例如,如 果参数的数据类型是long,则使用的方法就是 setLong。setXXX 方法 的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数 的值。例如,上述SQL将第一个参数设为形式参数username,第二个 参数设为形式参数password,代码如下所示:
6.2.2 SQL的执行
PreparedStatement对象的创建方式如下:
PreparedStatement ps = conn.prepareStatement(String sql);
而SQL也需要进行相应的改写:
String sql="select * from user where username = ? and password=?";
装载驱动的程序,并且为创建新的数据库连接提供 支持。 java.sql.Connection:该接口定义了实现对某一 种指定数据库连接的功能。
6.2 JDBC概述
java.sql.Statement:该接口定义了在一个给定 的连接中作为 SQL 语句执行声明的容器以实现对 数据库的操作。它主要包含有如下两种子类型。
6.2 JDBC概述
Java 数据库连接技术(Java DataBase Connectivity,JDBC)是 Java 访问数据 库资源的标准,JDBC 标准定义了一组 Java API,允许用户写出SQL语句,然后 交给数据库。
6.2 JDBC概述
如图6.1所示,如果没有 JDBC 或者 ODBC ,开发人员必须使用不同的一组 API 来访 问不同的数据库;而有了JDBC 或者 ODBC ,则只需要使用一组 API,再加上数据库厂 商提供的数据库驱动程序就可以访问不同的 数据库了,如图6.2所示。所以,利用 JDBC,我们就可以把同一个企业级 Java 应用移植到另一个数据库应用上。
java.sql.PreparedStatement:该接口定义了用于执 行带或不带 IN 参数的预编译 SQL 语句。
java.sql.CallableStatement:该接口定义了用于执 行数据库的存储过程的调用。
java.sql.ResultSet:该接口定义了执行数据库的 操作后返回的结果集。
ps.setString(1,username);
ps.setString(2,password);
6.2.3 SQL执行结果处理
无论是Statement,还是PreparedStatement,在执 行SQL的时候,主要应用的执行方法是executeQuery 和executeUpdate,Statement在执行execute*方 法时,需要以SQL为字符串参数进行传递,而 PreparedStatement则不需要参数。调用规则总结如 表6.2所示。
源自文库
6.2.2 SQL的执行
在实际开发中,当需要访问数据库时,只需 要调用以下方法:
Connection conn = DBUtil.getConnection();
就可以获得一个java.sql.Connection类型 的数据库连接对象,通过这个连接对象,用 户可以操作数据库,发送目标SQL给数据库 ,并接收响应结果。
6.2.2 SQL的执行
为了避免SQL注入的问题,JDBC提供了一种SQL预编 译的机制,即PreparedStatement。首先用户提交的 SQL中可以不指定具体的参数,对于可变值部分让用户 使用“?”(即占位符)来代替。然后再对SQL中的占 位符单独设置值,将两者提交给数据库引擎进行编译, 此时数据库引擎仅仅编译带有占位符“?”的SQL语句 ,等到编译完成后,在执行SQL时,将参数带入编译结 果,此时,参数就只会作为参数整体进行数据比较,而 不会作为SQL语法的一部分。
5
public void testFinUser(){
6
String username="test' or 1=1 #";
7
String password="";
8
try {
9
Assert.assertNull(userDAO.findUser(username, password));
10
} catch (SQLException e) {
6.2.2 SQL的执行
1 public class UserDAOImplTest {
2
private UserDAO userDAO = (UserDAO)
3
DAOFactory.getDAO("cn.edu.zzti.dao.impl.mysql.jdbc.UserDAOImpl");
4
@Test
6.2.3 SQL执行结果处理
表6.2 SQL执行结果
类名 Statement
方法定义
说明
ResultSet executeQuery(String sql) 执行select等
Statement
int executeUpdate(String sql)
执 行 insert 、 update 、 delete等
6.2.2 SQL的执行
select * from user where username='test' or 1=1 #' and password=‘’ 在这个SQL中,“#”代表MySQL中的注释。该语句的 本意是从数据库中获取全部的数据,因为“or 1=1” 使得这个条件恒为真。 select * from user where username='test' or 1=1
2
String sql = "select * from user where username = '"+
3
username+
4
"' and password='"+
5
password+"'";
6
System.out.println("登录sql是:" + sql);
7
Connection conn = DBUtil.getConnection();
6.2.2 SQL的执行
其中,executeUpdate(String sql)方法可用来执行数 据库的更新操作。该方法的返回值类型为int,代表影响 的记录条数,即插入了几条数据,修改了几条数据,删 除了几条数据等。而executeQuery(String sql)方法 可用来执行数据库的查询操作。该方法的返回值类型是 java.sql.ResultSet,该类型能够存储数据库返回的所 有记录,并支持按条读取结果数据。
6.2.2 SQL的执行
在已建立数据库连接的基础上,向数据库发送要执行的SQL 语 句 的 接 口 是 Statement 。 Statement 用 于 执 行 静 态 的 SQL语句。
(1)java.sql.Statement java.sql.Statement 类 型 的 对 象 , 是 通 过 java.sql.Connection对象获得的,其代码如下:
6.2.1 创建数据库连接
图6.3 下载MySQL驱动包
图6.4 加载MySQL驱动包
6.2.1 创建数据库连接
2.数据库管理工具
8
Statement st = conn.createStatement();
9
ResultSet rs = st.executeQuery(sql);
10
if(rs.next()){
11
UserDO user = new UserDO();
12
//将查询结果封装到user对象中,此处先不处理
13
return user;
PreparedStatement ResultSet executeQuery()
6.2.2 SQL的执行
(2)java.sql.PreparedStatement接口
在Statement中可以看到,动态SQL的生成是通过字 符串拼接而成的,但是字符串拼接会带来很多的安全 隐患,其中最为常见的安全漏洞就是SQL注入。
下面以登录功能为例,在cn.edu.zzti.dao包下的 UserDAO接口中定义登录判断方法,代码如下:
14
}
15
return null;
16
}
在代码的第6行,我们将拼接后的SQL语句打印到控制台进行观察 。在第12行处,需要将获得的数据库查询结果进行封装,这里暂 不实现这个功能。下面先来创建一个
cn.edu.zzti.dao.impl.mysql. jdbc.test.UserDAOImplTest类,对方法findUser进行测试,具 体代码如下。
6.2 JDBC概述
图6.1 应用程序直接访问数据库
图6.2 应用程序访问JDBC
6.2 JDBC概述
JDBC主要包含两部分:面向Java程序员的 JDBC API和面向数据库厂商的JDBC Drive API。
1.面向 Java 程序员的 JDBC API
它主要由一系列的接口定义所构成。 java.sql.DriveManager:该接口定义了用来处理
在开发中,我们一般会创建一个专用于创建数据库 连接和释放数据库连接的工具类。建立与数据库的 连接需要完成如下两个步骤。
(1)加载驱动类到内存
Class.forName("com.mysql.jdbc.Driver");
(2)创建与数据源的连接
Connection con=DriverManager.getConnection( String url, String username, String password);
Statement st = conn.createStatement(); 所获得的Statement对象st,可以用来执行SQL语句,Statement执行
SQL语句的主要方法有两个: int executeUpdate(String sql); ResultSet executeQuery(String sql);
11
e.printStackTrace();
12
fail("出现异常,执行失败");
13
}
14
}
15 }
Assert.assertNotNull(Object o)是Junit的断言,该断言方法判 断对象o是否为空,为空则当前测试方法通过,否则测试方法失败 。执行结果显示,使用不存在的用户名和密码,调用登录方法执行 结果为登录正常。在输出的SQL结果显示,最终执行的SQL如下:
2.面向数据库厂商的JDBC Drive API
6.2 JDBC概述
6.2.1 创建数据库连接 6.2.2 SQL的执行 6.2.3 SQL执行结果的处理
6.2.1 创建数据库连接
在Java程序中要操作数据库,一般应该通过 如下几步。
1.下载数据库开发所需要的驱动包
用户可以从对应的数据库厂商的官网进行下载,例 如,下载MySQL驱动包,如图6.3所示,选择 “JDBC DriverforMySQL”进行下载。
第6章 数据库整合开发
本章内容
MySQL简介 JDBC概述 数据库连接池 DBUtils框架简介 简易购物商城
6.1 MySQL简介
MySQL是一个关系型数据库,它由瑞典 MySQL AB公司开发,目前属于Oracle旗 下的产品。MySQL是最流行的关系型数据 库管理系统之一,在Web应用方面, MySQL是最好的关系数据库管理系统( Relational DataBase Management System,RDBMS)应用软件。
public UserDO findUser(String username, String password) throws SQLException;
具体代码如下:
6.2.2 SQL的执行
1 public UserDO findUser(String username, String password) throws SQLException {
与之前的SQL对比可以发现,原来的形式参数部分被占位符“?”代替 ,那么就需要将形式参数与具体的“?”绑定。绑定操作可通过调用 setXXX 方法来完成,其中,XXX 是与该参数相对应的类型。例如,如 果参数的数据类型是long,则使用的方法就是 setLong。setXXX 方法 的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数 的值。例如,上述SQL将第一个参数设为形式参数username,第二个 参数设为形式参数password,代码如下所示:
6.2.2 SQL的执行
PreparedStatement对象的创建方式如下:
PreparedStatement ps = conn.prepareStatement(String sql);
而SQL也需要进行相应的改写:
String sql="select * from user where username = ? and password=?";
装载驱动的程序,并且为创建新的数据库连接提供 支持。 java.sql.Connection:该接口定义了实现对某一 种指定数据库连接的功能。
6.2 JDBC概述
java.sql.Statement:该接口定义了在一个给定 的连接中作为 SQL 语句执行声明的容器以实现对 数据库的操作。它主要包含有如下两种子类型。
6.2 JDBC概述
Java 数据库连接技术(Java DataBase Connectivity,JDBC)是 Java 访问数据 库资源的标准,JDBC 标准定义了一组 Java API,允许用户写出SQL语句,然后 交给数据库。
6.2 JDBC概述
如图6.1所示,如果没有 JDBC 或者 ODBC ,开发人员必须使用不同的一组 API 来访 问不同的数据库;而有了JDBC 或者 ODBC ,则只需要使用一组 API,再加上数据库厂 商提供的数据库驱动程序就可以访问不同的 数据库了,如图6.2所示。所以,利用 JDBC,我们就可以把同一个企业级 Java 应用移植到另一个数据库应用上。
java.sql.PreparedStatement:该接口定义了用于执 行带或不带 IN 参数的预编译 SQL 语句。
java.sql.CallableStatement:该接口定义了用于执 行数据库的存储过程的调用。
java.sql.ResultSet:该接口定义了执行数据库的 操作后返回的结果集。
ps.setString(1,username);
ps.setString(2,password);
6.2.3 SQL执行结果处理
无论是Statement,还是PreparedStatement,在执 行SQL的时候,主要应用的执行方法是executeQuery 和executeUpdate,Statement在执行execute*方 法时,需要以SQL为字符串参数进行传递,而 PreparedStatement则不需要参数。调用规则总结如 表6.2所示。
源自文库
6.2.2 SQL的执行
在实际开发中,当需要访问数据库时,只需 要调用以下方法:
Connection conn = DBUtil.getConnection();
就可以获得一个java.sql.Connection类型 的数据库连接对象,通过这个连接对象,用 户可以操作数据库,发送目标SQL给数据库 ,并接收响应结果。
6.2.2 SQL的执行
为了避免SQL注入的问题,JDBC提供了一种SQL预编 译的机制,即PreparedStatement。首先用户提交的 SQL中可以不指定具体的参数,对于可变值部分让用户 使用“?”(即占位符)来代替。然后再对SQL中的占 位符单独设置值,将两者提交给数据库引擎进行编译, 此时数据库引擎仅仅编译带有占位符“?”的SQL语句 ,等到编译完成后,在执行SQL时,将参数带入编译结 果,此时,参数就只会作为参数整体进行数据比较,而 不会作为SQL语法的一部分。
5
public void testFinUser(){
6
String username="test' or 1=1 #";
7
String password="";
8
try {
9
Assert.assertNull(userDAO.findUser(username, password));
10
} catch (SQLException e) {
6.2.2 SQL的执行
1 public class UserDAOImplTest {
2
private UserDAO userDAO = (UserDAO)
3
DAOFactory.getDAO("cn.edu.zzti.dao.impl.mysql.jdbc.UserDAOImpl");
4
@Test
6.2.3 SQL执行结果处理
表6.2 SQL执行结果
类名 Statement
方法定义
说明
ResultSet executeQuery(String sql) 执行select等
Statement
int executeUpdate(String sql)
执 行 insert 、 update 、 delete等
6.2.2 SQL的执行
select * from user where username='test' or 1=1 #' and password=‘’ 在这个SQL中,“#”代表MySQL中的注释。该语句的 本意是从数据库中获取全部的数据,因为“or 1=1” 使得这个条件恒为真。 select * from user where username='test' or 1=1
2
String sql = "select * from user where username = '"+
3
username+
4
"' and password='"+
5
password+"'";
6
System.out.println("登录sql是:" + sql);
7
Connection conn = DBUtil.getConnection();
6.2.2 SQL的执行
其中,executeUpdate(String sql)方法可用来执行数 据库的更新操作。该方法的返回值类型为int,代表影响 的记录条数,即插入了几条数据,修改了几条数据,删 除了几条数据等。而executeQuery(String sql)方法 可用来执行数据库的查询操作。该方法的返回值类型是 java.sql.ResultSet,该类型能够存储数据库返回的所 有记录,并支持按条读取结果数据。
6.2.2 SQL的执行
在已建立数据库连接的基础上,向数据库发送要执行的SQL 语 句 的 接 口 是 Statement 。 Statement 用 于 执 行 静 态 的 SQL语句。
(1)java.sql.Statement java.sql.Statement 类 型 的 对 象 , 是 通 过 java.sql.Connection对象获得的,其代码如下: