一、JDBC概念:
1.JDBC就是使用java语言操作关系型数据库的一套API
2.全称:(Java DataBase Connectivity)Java数据库连接
二、JDBC本质:
1.官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
2.各个数据库厂商去实现这套接口,提供数据库驱动jar包
3.我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
三、JDBC好处:
1.各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
2.可随时替换底层数据,访问数据库的Java代码基本不变
四、连接数据库的步骤:
1.注册驱动
2.获取连接
3.定义SQL语句
4.获取执行SQL对象
5.执行SQL
6.处理返回结果
7.释放资源
1.注册驱动:
Class.forName("Com.mysql.jdbc.Driver");
Class.forName("Com.mysql.jdbc.Driver");
2.获取连接:
1.Connection conn = DriverManager.getConnection(rul,user,password);
2.参数:
①url:连接路径
语法:jdbc:mysql://ip(域名):端口号/数据库名称
细节: 如果连接的是本机MySQL服务器,并且MySQL服务器默认端口是3306,则url可以简写:jdbc:mysql:///数据库名称 配置useSSL=false参数,禁用安全连接方式,解决警告提示
②user:用户名
③password:密码
String rul = "jdbc:mysql://127.0.0.1:3306/d_heima";
Connection con = DriverManager.getConnection(rul,"root","123456");
3.定义SQL语句:
1.String sql="UPDATE...";
String sql = "SELECT * FROM t_student";
4.获取执行SQL对象:
1.Statement st = conn.createStatement();
2.普通执行SQL对象
Statement createStatement()
3.预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
Statement st = con.createStatement();
5.执行SQL:
1.st.executeUpdate(sql);
2.执行SQL语句:
①int executeUpdate(sql):执行DML、DDL语句
②返回值:
(1)DML语句影响的行数
(2)DLL语句执行后,执行成功也可能返回0
③ResultSet executeQuery(sql):执行DQL语句
④返回值:
(1)ResultSet结果集对象
3.ResultSet(结果集对象)作用:
①封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
②获取查询结果:
boolean next():
(1)将光标从当前位置向前移动一行
(2)判断当前行是否为有效行
返回值:
true:有效行,当前行有数据
false:无效行,当前行没有数据
③获取数据:
xxx getXxx(参数):获取数据
xxx:数据类型;如:int getInt(参数);String getString(参数)
参数:
int:列的编号,从1开始
String:列的名称
④使用步骤:
游标向下移动一行,并判断该行是否有数据:next()
获取数据:getXxx(参数)
循环判断游标是否是最后一行末尾
4.PreparedStatement作用:
①预编译SQL语句并执行:预防SQL注入问题
②SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
③获取PreparedStatement对象
SQL语句中的参数值,使用?占位符替代
String sql = "SELECT * FROM t_student WHERE id=? AND name=?";
通过Connection对象获取,并传入对应的SQL语句
PreparedStatement pst = con.preparedStatement(sql);
④设置参数值:
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型;如setInt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
⑤执行SQL
executeUpdate();/executeQuery();:不需要传递SQL
4.PreparedStatement原理:
①PreparedStatement好处:
预编译SQL,性能更高
防止SQL注入:将敏感字符进行转义
②PreparedStatement预编译功能开启:&useServerPrepStmts=true
③配置MySQL执行日志(重启mysql服务后生效)
log-output=FILE
general-log=1
general_log_file="日志存放路径"
slow-query-log=1
slow_query_log_file="路径"
long_query_time=2
④PreparedStatement原理:
在获取PreparedStatement对象时,将SQL语句发送给mysql服务器进行检查,编译(这些步骤很耗时)
执行时就不用再进行这些步骤了,速度更快
如果SQL模板一样,则只需要进行一次检查、编译
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
String id = rs.getString("id");
String name = rs.getString("name");
String sex = rs.getString("sex");
String age = rs.getString("age");
String address = rs.getString("address");
System.out.println(id+","+name+","+sex+","+age+","+address);
System.out.println("-------------");
hm.setId(id);
hm.setName(name);
hm.setSex(sex);
hm.setAge(age);
hm.setAddress(address);
all.add(hm);
}
PreparedStatement ps = null;
String sql = "INSERT INTO t_student(id,name,sex,age,address) VALUES(?,?,?,?,?)";
try {
ps = conn.prepareStatement(sql);
ps.setString(1,id);
ps.setString(2,name);
ps.setString(3,sex);
ps.setString(4,age);
ps.setString(5,address);
i = ps.executeUpdate();
return i;
} catch (SQLException e) {
6.处理返回结果:
1.System.out.println(sum);//返回在数据库里处理了几条数据所以是int型
7.释放资源:
close();
rs.close();
st.close();
con.close();
五、事务管理:
1.MySQL事务管理
①开启事务:BEGIN;/START TRANSACTION;
②提交事务:COMMIT;
③回滚事务:ROLLBACK;
MySQL默认自动提交事务
2.JDBC事务管理:Connection接口中定义了3个对应方法
①开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
②提交事务:commit();
②回滚事务:rollback()
六、数据库连接池简介
1.数据库连接池是一个容器,负责分配、管理数据库连接(Connection)
2.它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
3.释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
4.好处:
①资源重用
②提升系统响应速度
③避免数据库连接遗漏
5.标准接口:DataSource
①官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
②功能;获取连接
Connection getConnection()
6.常见的数据库连接池:
①DBCP
②C3PO
③Druid
7.Druid(德鲁伊)
①Druid连接池是阿里巴巴开源的数据库连接池项目
②功能强大,性能优秀,是Java语言最好的数据库连接池之一