javaWeb_JDBC
来源:互联网 发布:帝国cms生成html 编辑:程序博客网 时间:2024/05/20 18:01
JDBC
1.什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
2.JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
DriverManger(驱动管理器)的作用有两个:
注册驱动:这可以让JDBC知道要使用的是哪个驱动;
获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
- Connection最为重要的一个方法就是用来获取Statement对象;
Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
void executeUpdate(String sql):执行更新操作(insert、update、delete等);
ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
注册驱动:Class.forName(“com.mysql.jdbc.Driver”)
获取连接: DriverManager.getConnection(url,username,password)
url: jdbc:mysql://localhost:3306/mydb1
获取Statement:Statement stmt = con.createStatement();
发送SQL增、删、改语句:String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);
发送SQL查询语句:String sql = “select * from user”;
ResultSet rs = stmt.executeQuery(sql);
读取结果集中的数据:rs.next();//光标移动到第一行
rs.getInt(1);//获取第一行第一列的数据
关闭:
rs.close();
stmt.close();
con.close();
举例:
public static Connection getConnection() throws Exception { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb1"; return DriverManager.getConnection(url, "root", "123");}
@Test public void query() { Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = getConnection(); stmt = con.createStatement(); String sql = "select * from user"; rs = stmt.executeQuery(sql); while(rs.next()) { String username = rs.getString(1); String password = rs.getString(2); System.out.println(username + ", " + password); } } catch(Exception e) { throw new RuntimeException(e); } finally { try { if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(con != null) con.close(); } catch(SQLException e) {} } }
PreparedStatement
PreparedStatement叫预编译声明!
PreparedStatement是Statement的子接口,你可以使用PreparedStatement来替换Statement。
PreparedStatement的好处:
防止SQL攻击;
提高代码的可读性,以可维护性;
提高效率。
建议使用PreparedStatement,而不是用Statement
String sql = “select * from tab_student where s_number=?”;PreparedStatement pstmt = con.prepareStatement(sql);pstmt.setString(1, “S_1001”);ResultSet rs = pstmt.executeQuery();rs.close();pstmt.clearParameters();pstmt.setString(1, “S_1002”);rs = pstmt.executeQuery();
批处理
con = JdbcUtils.getConnection();String sql = "insert into stu values(?,?,?,?)";pstmt = con.prepareStatement(sql);for(int i = 0; i < 10; i++) { pstmt.setString(1, "S_10" + i); pstmt.setString(2, "stu" + i); pstmt.setInt(3, 20 + i); pstmt.setString(4, i % 2 == 0 ? "male" : "female"); pstmt.addBatch();}pstmt.executeBatch();
事务
事务的四大特性(ACID)
原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
同一事务中所有的操作,都在使用同一个Connection对象!
jdbc处理事务的代码格式:try { con.setAutoCommit(false);//开启事务… …. … con.commit();//try的最后提交事务} catch() { con.rollback();//回滚事务}
事务的并发读问题
脏读:读取到另一个事务未提交数据;
不可重复读:两次读取不一致;
幻读(虚读):读到另一事务已提交数据
四大隔离级别
3 四大隔离级别
4个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。
SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差;
REPEATABLE READ(可重复读)(MySQL)
防止脏读和不可重复读,不能处理幻读问题;
性能比SERIALIZABLE好
READ COMMITTED(读已提交数据)(Oracle)
防止脏读,没有处理不可重复读,也没有处理幻读;
性能比REPEATABLE READ好
READ UNCOMMITTED(读未提交数据)
可能出现任何事务并发问题
性能最好
MySQL的默认隔离级别为REPEATABLE READ,这是一个很不错的选择吧!
JDBC设置隔离级别
con. setTransactionIsolation(int level)
参数可选值如下:
Connection.TRANSACTION_READ_UNCOMMITTED;Connection.TRANSACTION_READ_COMMITTED;Connection.TRANSACTION_REPEATABLE_READ;Connection.TRANSACTION_SERIALIZABLE。
- javaWeb_JDBC
- 方立勋_30天掌握JavaWeb_JDBC、SQL防注入(一)
- 方立勋_30天掌握JavaWeb_jdbc实现客户关系管理(未完)
- 方立勋_30天掌握JavaWeb_JDBC、存储过程、事务(二)
- 方立勋_30天掌握JavaWeb_JDBC、连接池、JNDI(三)
- MYSIAM和INNODB引擎区别
- java基础 - url & 线程
- 图片轮播
- 【firefox】常用扩展组件
- python+Eclipse+pydev环境搭建
- javaWeb_JDBC
- 深度学习的入门资料
- HDU3555 Bomb(数位DP)
- JSON和XML小记
- linux中cat、more、less、tail、head命令的区别(转载)
- React Native mac 环境集成步骤
- SQL学习笔记之(DATETIME)
- 近距离端详Android ART运行时库
- UNITY 3D 协程执行顺序