概念
- Java DataBase Connectivity。
- Java连接数据库的接口,是一种可以执行sql的Java API,由sun公司定义,与平台、和数据库类型都无关。。
- 接口的实现由各大数据库公司实现,下载驱动jar包即可使用接口连接数据库编程(注意要把jar包路径添加到classpath环境变量中),面向接口编程的典型应用。
- 数据库驱动程序:将JDBC调用映射成特定的数据库调用。
JDBC编程六步
import java.sql.*
-
注册驱动:告诉java程序要连接哪个品牌的数据库
获取Driver对象:Driver diver = new ...
DriverManager.registerDriver(driver) -
获取连接:表示JVM的进程和数据库进程之间的通道打开了,两个进程之间通信,重量级的,使用完后一定要关闭
String url = "jdbc:mysql://ip:port/DB_name"
String user = "admin"
String password = "Huawei123"
Connection conn = DriverManager.getConnection(url, user, password); -
获取数据库操作对象:专门执行SQL语句的对象
statement stmt = conn.createStatement()
createPreparedStatement():返回预编译的Statement对象,将SQL语句提交到数据库进行预编译。
CallableStatement对象:返回CallableStatement对象,用于调用存储过程。 -
执行sql语句:执行SQL语句
String sql = "insert into dept(deptno, dname, loc) value(50, "name", "beijing")"
int count = stmt.executeUpdate(sql) //返回值是“影响数据库的记录条数” -
处理查询结果集:只有在第四步使用了查询语句才有这一步
String sql = "Select name, age from table"
ResultSet rs = stmt.executeQuery(sql)
rs.next()迭代器
rs.getString("filed"),或者rs.getString(column) ,column从1开始获取那列的值
rs.getInt("filed") 获取int字段的值 -
释放资源:使用完资源之后一定要关闭资源,java和数据库属于进程间的通信,使用完后一定记得关闭
从小到大依次关闭
最好在finally语句中关闭
rs.close()
stmt.close()
conn.close()
模板
Connection conn = null
Statement stmt = null
ResultSet rs = null
try{
// 1 注册驱动
// 2 获取连接
// 3 获取数据库操作对象
// 4 执行sql语句
}catch(SQLException e) {
e.printStackTrace();
}finally {
if(rs != null) {
try{
rs.close();
}catch(SQLExcepton e) {
e.printStackTrace();
}
}
if(stmt != null) {
try{
stmt.close();
}catch(SQLExcepton e) {
e.printStackTrace();
}
}
if(conn != null) {
try{
conn.close();
}catch(SQLExcepton e) {
e.printStackTrace();
}
}
}
注册驱动的第二种方式(常用的)
Class.forName("className")
SQL注入:
密码为 fdsa' or '1' = '1
解决SQL注入问题:只要用户提供的信息不参与SQL语句的编译过程,问题就解决了
即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用
要想用户信息不参与SL语句的编译,那么必须使用java.sql.PreparedStatement
PreparedStatement接口继承了java.sql.Statement
PreparedStatement是属于预编译的数据库操作对象
PreparedStatement的原理是,预先对SQL语句的框架进行编译,然后再给SQL语句传值
传入的参数即使含有SQL语句关键字,但是关键字并没有参与编译,不起作用
PreparedStatement ps = conn.prepareStatement(SQL);
SQL语句使用?作为占位符,使用ps.setString()传值
PreparedStatement好处:
无sql注入问题
提前编译,效率高
在编译器做安全检查
Statement用途:
Statement支持SQL注入,凡是业务方面要求是需要进行sql语句拼接的,必须使用Statement
JDBC事务机制:
jdbc中默认执行任意一条DML语句,则自动提交一次。
单机手动事务机制实现:
拿到connection对象后执行 conn.setAutoCommit(false),
sql执行完后:conn.commit(),
异常后手动回滚:conn.rollback()
分布式事务较难。
行级锁:和jdbc没关系,是sql语句。在sql语句后面加 for update就是把记录锁住了,又叫悲观锁,就是说当前事务未提交前,把选择的记录锁住了,其他线程不可以修改这个记录。
悲观锁:事务必须排队执行,数据锁住了,不允许并发。
乐观锁:支持并发,事务不需要排队,只不过需要一个版本号。