JDBC使用方式
一、JDBC是什么
使用java语言操作关系型数据库的一套API
二、如何来使用JDBC
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
String url ="jdbc:mysql://127.0.0.1:3306/db1";//你的数据库
String username = "root";//数据库账户
String password = "123456"//数据库密码
Connection connection = DriverManager.getConnection(url,username,password);
3.定义sql
String sql = "UPDATE mytable set password =123456 WHERE id = 1";
4.获取执行对象
Statement stmt = connection.createStatement();
5.执行sql
int count = stmt.executeUpdate(sql);
6.处理结果
System.out.println(count);
//这里的结果是上一步executeUpdate的返回值,即执行成功的数目
7.释放资源
stmt.close();
connection.close();
三、JDBC的API有哪些?
1.DriverManager
DriverManager被用来注册驱动以及获取数据库连接。
2.Connection
(1)Connection被用来获取执行sql的对象,可以分为普通执行sql对象和预编译执行的sql对象。
①普通执行的sql对象
就如上文所说,这里直接获取sql对象就可以了,没有什么好补充的。
Statement stmt = connection.createStatement();
②什么是预编译的sql对象?
预编译SQL的执行SQL对象产生的目的是防止SQL注入。那么什么是SQL注入呢?这里举个例子:
首先定义如下的SQL语句:
select * from mytable where username = ' "+username+" ' and password = ' "+pwd+" '
那么在正常情况下只有用户名与密码都正确的情况下才能获取到用户信息,但是真的是这样吗?我们这里提供一个账户密码输入范例:
username:root
password:' or '1' = '1
我们会神奇的发现同样可以登录成功,这是为什么呢?我们把这个username和password带入进去组装成完整的SQL语句:
select * from mytable where username = ' root ' and password = ' ' or '1' = '1 '
原因显而易见了,前面对username和password的判断都被否定了,但是最后有一个 or ‘1’ = ‘1’,而我们知道这是恒成立的,这样就可以登录成功了,这是很危险的,所以我们要用预编译的SQL对象,实际使用方法也很简单,我们将在下文详细介绍。
③执行存储过程的对象,这里我们不多做介绍
CallableStatement prepareCall(sql)
(2)管理事务
事务是一个整体,在事务过程中如果出现错误,整个事务的状态会回滚到开启事务之前,繁殖则全部执行完成。
①开启事务
setAutoCommit(boolean autoCommit)//true为自动提交事务;false为手动提交事务,即为开启事务
②提交事务
commit()
③回滚事务
rollback()
3.Statement
(1)executeUpdate(sql)
返回执行完DML语句,受影响的行数
(2)executeQuery (sql)
用来查询sql数据,但是执行DDL语句不一定有返回结果
4.ResultSet(结果集对象)
(1)结果集对象封装了DQL查询语句的结果
ResultSet rs = stmt.executeQuery(sql1);//执行DQL语句,返回ResultSet对象
(2)获取查询结果
boolean next()
①将光标从当前位置向下移动一行
②判断当前行为是否有效
true//有效行
false//无效行
参数获取:
getxxx(参数)
参数
int:列的编号
String:列的名称
举个例子:
while (rs.next()){
String username = rs.getString(2);
int password = rs.getInt(3);
System.out.println(username);
System.out.println(password);
}//获取rs中存的数据的username以及password属性,分别在第二列和第三列
(3)查询account账户表数据,封装到Account对象中,并存储到ArrayList集合中
①定义实体类Account放在pojo文件夹中
②查询数据,封装到Account对象中
Account account = new Account();
③将Account对象存入ArrayList集合中
List<Account> list = new ArrayList<>();
5.PreparedStatement
PreparedStatement用来预编译SQL语句并执行,预防SQL注入问题
(1)操作如下:
①定义sql
String sql = "select * from mytable where name = ? and pwd = ?";
②获取对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
③设置参数
preparedStatement.setString(1,username);//设置第一个?的参数username
preparedStatement.setInt(2,pwd);//设置第二个?的参数password
④执行sql
preparedStatement.executeQuery();
(2)原理
① 获取对象时,将sql语句发给sql服务器进行检查,编译
②执行是不需要进行这些步骤
③如果sql模板一样,只需要进行一次检查、编译
(3)预编译开启
预编译功能需要手动开启,开启方式如下:
①首先在url中打开预编译
String url ="jdbc:mysql://127.0.0.1:3306/db1?useServerPrepStmts=true";
②配置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
四、数据库连接池
1.概念
- 是个容器,负责分配、管理数据库连接
- 允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
2.好处
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
3.标准接口
- DataSource
4.Druid连接池
Druid是阿里巴巴功能强大,性能优秀的连接池,使用方法如下。
(1)导入jar包
(2)定义配置文件
在项目中创建druid.properties
druid.properties文件的配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db1?useServerPrepStmts=true
username=root
password=123456
初始化连接数量
initialSize=5
最大连接数
maxActive=10
最大超时时间
maxWait=3000
(3)加载配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("jdbc/src/druid.properties"));
其中如果不清楚文件的相对路径,可以使用以下代码查看当前文件所在位置:
System.out.println(System.getProperty("user.dir"));
(4)获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
(5)获取数据库连接
Connection connection = dataSource.getConnection();