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。
0 0