目录
JDBC (Java DataBase Connectivity)是Java数据库连接技术的简称,提供连接各种常用数据库的能力。
作用:Java访问数据库的标准规范。提供给程序员调用的接口与类,集成在java.sql和javax.sql包中。
DriverManager(驱动管理者)
作用:管理各种不同的JDBC驱动,并获取数据库连接。
JDBC驱动
作用: JDBC是接口,而JDBC驱动才是接口的实现。每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
一、JDBC 核心API简介
JDBC API的主要功能:与数据库建立连接、执行SQL 语句、处理结果和释放资源
API名称 | API作用 |
DriverManager |
注册驱动,获取Connection连接对象。 |
Connection |
负责连接数据库并担任传送数据的任务,最为重要的就是用来产生Statement对象。 |
Statement |
负责向数据库发送SQL语句,这样数据库就会执行发送过来的SQL语句。 |
ResultSet |
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格。 |
二、JDBC连接数据库
1、先建一个数据库,并存入数据
CREATE DATABASE /*!32312 IF NOT EXISTS*/`myschool` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `myschool`;
/*Table structure for table `grade` */
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade` (
`gradeid` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '年级编号',
`gradename` varchar(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='年级表';
/*Data for the table `grade` */
insert into `grade`(`gradeid`,`gradename`) values
(1,'第一阶段'),
(2,'第二阶段'),
(3,'第三阶段'),
(4,'第四阶段'),
(5,'第五阶段');
2、操作一下步骤
首先要导入驱动jia包。
JDBC连接数据库核心步骤:
1、加载驱动 DriverManager
2、链接数据库 Connection,并定义SQL语句
3、发送SQL语句,并执行 Statement
4、返回结果 ResultSet
5、释放资源 close()
JDBC编程模板
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(“JDBC驱动类”); //1.加载驱动
con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
stmt = con.createStatement();//3.创建Statement对象,
String sql = "SQL语句" //执行SQL语句
rs = stmt.executeQuery(“SELECT a, b, c FROM table1;”);//4.返回ResultSet并查询结果
while (rs.next()) {
//每次读取一行,并打印读取结果
}
}catch(Exception e){
e.printStackTrace();
}finally{
//5.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
1、加载驱动
DriverManager用于加载驱动,并创建与数据库的链接,这个API的常用方法:
1、DriverManager.registerDriver(new Driver())
2、DriverManager.getConnection(url, user, password)
注意:在实际开发中并不推荐采用registerDriver方法注册驱动。
1、查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
2、程序依赖mysql的api,脱离mysql的jar包,程序将无法编译,将来程序切换底层数据库将会非常麻烦。
建议使用固定方式加载驱动:
语法:
Class.forName("com.mysql.jdbc.Driver");
提示:MSQL5之后的驱动包,可以省略注册驱动的步骤
2、获取Connection对象
语法:
DriverManager.getConnection(String url,String username,String password)
其中username和password是登录数据库的用户名和密码。
url用来找到要连接数据库的“网址”。
例如:mysql的url:jdbc:mysql://localhost:3306/myschool
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
第一部分是jdbc,这是固定的;
第二部分是数据库厂商名称;
第三部分是数据库服务器的IP地址(localhost)、端口号(3306),以及数据库名称(myschool)组成
提示:如果连接的是本机mysql服务器,且默认端口号是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置useSSL=false参数,禁用安全连接方式,解决警告提示
Connection接口的常用方法
方法名 | 方法作用 |
createStatement() |
创建向数据库发送sql的statement对象。 |
prepareStatement(sql) |
创建向数据库发送预编译sql的PrepareSatement对象 |
prepareCall(sql) |
创建执行存储过程的callableStatement对象。 |
setAutoCommit(boolean autoCommit) |
设置事务是否自动提交。 |
commit() |
在此连接上提交事务。 |
rollback() |
在此连接上回滚事务。 |
close() |
关闭数据库连接。 |
JDBC事务管理Connection接口定义了3个相对应的方法
开启事务:setAutoCommit(boolean autoCommit)设置事务是否自动提交,true为自动提交事务,false为手动提交事务
提交事务:commit()
回滚事务:rollback()
Connection获取执行SQL对象:
1、普通执行SQL对象
Statement createStatement()
2、预编译SQL的执行SQL对象,防止SQL注入
PreparedStatement prepareStatement(sql)
3、执行存储过程的对象
CallableStatement prepareCall(sql)
手动提交事务代码如下
try{
//开启事务
connection.setAutoCommit(false);
//执行sql
int count = statement.executeUpdate(sql);
//处理结果
sout(count);
//提交事务
connection.commit();
}catch(Exception e){
//回滚事务
connection.rollback();
e.printStackTrace();
}
3、创建Statement对象,执行SQL语句
Statement对象是通过Connection对象的方法创建的。
语法:
Statement stmt = con.createStatement();//创建Statement对象
Statement对象用来向数据库发送要执行的SQL语句。
String sql = “select username from users”;//发送给服务器的SQL语句
ResultSet rs = stmt.executeQuery(sql);//执行SQL语句,并返回结果集
Statement接口的常用方法
方法名 | 方法作用 |
ResultSet executeQuery(String sql) |
用于向数据发送查询语句(select)。执行DQL语句,返回值:ResultSet结果集对象 |
int executeUpdate(String sql) |
用于向数据库发送insert、update或delete语句。执行DML,DDL语句 返回值:DML返回的为影响的行数,DDL语句执行成功其返回值可能为0 |
boolean execute(String sql) |
用于向数据库发送任意sql语句。 |
void addBatch(String sql) |
把多条sql语句放到一个批处理中。 |
int[] executeBatch() |
向数据库发送一批sql语句执行。 |
void close() |
释放资源。 |
4、返回Resultset对象,查询结果
语法:
String sql = “select username from users”;
ResultSet rs = stmt.executeQuery(sql);//执行SQL语句,并返回结果集
//读取结果
while(rs.next()){
String userName=rs.getString(“username”);
System.out.println(userName);
}
ResultSet接口的常用方法
方法名 | 方法的作用 |
Object getObject(int index) |
根据列的索引获取任意的数据类型 |
Object getObject(string columnName) |
根据列的名称获取任意的数据类型 |
String getString(int index) |
根据列的索引获取字符串 |
String getString(String columnName) |
根据列的名称获取字符串 |
int getInt(int index) |
根据列的索引获取整数 |
int getInt(String columnName) |
根据列的名称获取整数 |
boolean next() |
将游标从当前位置向下移动一行 判断当前行是否为有效行 true:有效;false:无效 |
close() |
释放资源。 |
5、释放资源
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
finally {
try {
//释放资源
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
JDBC连接数据库并对表内容进行查询
/**
* @authorDesc
* @author
* @date
* @version 1.0.0
* @description 使用JDBC查询grade表的信息
*/
public class JDBCGrade {
private static final String URL = "jdbc:mysql://127.0.0.1:3306/myschool";
//数据库用户名
private static final String USER = "root";
//数据库用户名密码
private static final String PASSWORD = "root";
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据库
connection = (Connection) DriverManager.getConnection(URL,USER,PASSWORD);
String sql = "SELECT * FROM GRADE";
//发送SQL语句并执行
statement = connection.createStatement();
//返回结果
resultSet = statement.executeQuery(sql);
Grade grade = null;
//创建集合
List<Grade> gradeList = new ArrayList<>();
while (resultSet.next()){
//创建对象
grade = new Grade();
//获取数据库信息
int gradeId = resultSet.getInt("gradeid");
String gradeName = resultSet.getString("gradename");
//把数据库信息赋值给对象
grade.setGradeId(gradeId);
grade.setGradeName(gradeName);
//把对象添加到集合中
gradeList.add(grade);
}
System.out.println("年级编号\t年级名称");
System.out.println("----------------------------------");
gradeList.forEach(grade1 -> {
System.out.println(grade1.getGradeId() + "\t\t" + grade1.getGradeName());
});
System.out.println("----------------------------------");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//释放资源
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
在连接数据库时可能会出现的异常:
1、Table ‘myschool.user’ doesn’t exist 表不存在
2、Column ‘COUNT(1)’ not found. 找不到字段
3、No suitable driver found for 没有导入jar包
6、SQL注入
注入原理:利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防止SQL注入的方法:
1、过滤用户输入的数据中是否包含非法字符;
2、分步校验!先使用用户名来查询用户,如果查找到了,再比较密码;
3、使用PreparedStatement接口。
使用JDBC的五个步骤。
1、加载驱动 DriverManager
2、链接数据库 Connection
3、预执行 3.5问号传参
4、执行,返回结果 ResultSet
5、释放资源 close()
快速记法:贾琏欲执事
7、PreparedStatement接口
PreparedStatement接口是Statement的子接口,你可以使用该接口来替换Statement接口。
PreparedStatement接口 (预编译的 SQL 语句)优点:
提高了代码的可读性和可维护性;提高了SQL语句执行的性能;提高了安全性
PreparedStatement的使用
使用Connection对象的prepareStatement(String sql):即创建它时就让它与一条SQL语句绑定;
编写SQL语句时,如果存在参数,使用“?”作为数据占位符;
调用PreparedStatement的setXXX()系列方法为占位符设置值,索引从1开始;
调用executeUpdate()或executeQuery()方法,但要注意,调用没有参数的方法;
PreparedStatement编程模板
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName(“JDBC驱动类”); //1.加载驱动
con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
String sql = "SELECT username,userpass,nickname FROM users where username=? and userpass=?";
stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象,执行SQL语句
smt.setString(1, “zhangsan”); //4.给参数赋值
smt.setString(2, "0");
rs = stmt.executeQuery();//5.返回ResultSet并查询结果
……
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
使用JDBC完成数据添加的操作模板
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName(“JDBC驱动类”); //1.加载驱动
con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
String sql = " INSERT INTO student(字段列表) VALUES(值列表) ";
stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象
smt.setString(1, “zhangsan”); //4.给参数赋值
smt.setInt(2, 0);
int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
……
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
使用JDBC完成数据修改的操作模板
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName(“JDBC驱动类”); //1.加载驱动
con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
String sql = " UPDATE student SET loginpwd=? WHERE studentno=? AND loginpwd=? ";
stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象
smt.setString(1, “zhangsan”); //4.给参数赋值
smt.setInt(2, 0);
int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
……
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
使用JDBC完成数据删除的操作模板
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
Class.forName(“JDBC驱动类”); //1.加载驱动
con=DriverManager.getConnection(URL,数据库用户名,密码);//2.获取Connection 连接对象
String sql = " DELETE FROM student WHERE studentno=? ";
stmt = con.prepareStatement(sql); //3.创建PrepareStatement对象
smt.setString(1, “zhangsan”); //4.给参数赋值
smt.setInt(2, 0);
int row = stmt. executeUpdate();//5.执行SQL语句,返回受影响的行数
……
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
try {if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
8、配置MYSQL执行日志
在MySQL文件夹下的my.ini中添加:
log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
MYSQL预编译功能的开启:
代码:
useServerPrepStmts=true
放在获取连接的位置
String url= "jdbc:mysql://127.0.0.1:3306/myschool?&useServerPrepStmts=true";
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97196.html