JDBC ( Java Data Base Connectivity ) , Java的数据库连接技术
但是, Java程序运行过程中, 只有接口没有其实现类是不行的 ! 所以开发时, 我们需要把厂商提供的驱动程序 ( 如: mysqlconnectorjava5.1.18.jar ) 加入到项目的Build Path中.
1 Class.forName("驱动程序名称");
1 Connection conn = DriverManager.getConnection(url, user, password);
1 Statement stmt = conn.createStatement();
1 int rowAffected = stmt.executeUpdate(用于增删改的SQL); // 返回数据库受影响的行数
2 ResultSet rs = stmt.executeQuery(用于查询的SQL); // 返回的是结果集
1 while(rs.next()){ // next()用于后移一行
2 String dname = rs.getString("dname"); // 读取当前行dname列的值 3 }
1 rs.close();
2 stmt.close();
3 conn.close();
DriverManager类
Connection接口
Statement接口
ResultSet接口
注意
开发中使用的Connection , Statement, ResultSet均位于包 java.sql下!
url实际上是告诉驱动管理器: 我要连接到哪台服务器的哪个端口, 我要使用哪个数据库
协议://数据库服务器的地址:端口/目标数据库
jdbc:mysql://localhost:3306/example
如果数据库默认编码是utf8, java程序连接数据库时出现了乱码, 可以写成这样:
jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=UTF8
有时候也可以把user和password写在url中:
jdbc:mysql://localhost:3306/example?user=root&password=root
普通的Statement不会编译SQL语句, 也容易发生SQL注入 ( 具体见示例 )
为了防止SQL注入以及提高SQL语句的执行效率, JDBC API提供了预编译的PreparedStatement.
用法:
PreparedStatement stmt = conn.prepareStatement(sql);
1 stmt.setXxx(1, 参数值);
2 stmt.setXxx(2, 参数值);
3 ...
1 stmt.executeUpdate();
2 stmt.executeQuery();
事实上, 在实际工作中, 所有场景都可以用PreparedStatement来替代Statement!
方案一
方案二
要注意的是: SELECT LAST_INSERT_ID()必须和INSERT语句在同一个Connection上执行 ( 同一会话内 ).
事务, Transaction, 它表示不可分割的一系列操作.
事务为数据操作提供"后悔药".
事务一旦开启, 对数据的更改处于临时状态(可撤销/回滚), 可以后悔.
提交事务指的是让更改正式生效.
回滚事务指的是撤销更改.
事实上, 每个SQL都自动开启了一个隐性事务, 一旦出错, 自动回滚; 一旦没有错误产生, 自动提交; 在MySQL数据库级别, 例如存储过程中, 可以用以下语法控制事务流程:
1 START TRANSACTION //开启事务
2 SET AUTOCOMMIT = FALSE // 同上
1 COMMIT // 提交事务
1 ROLLBACK // 回滚事务
在默认情况下, MySQL的AUTOCOMMIT为TRUE
在JDBC级别, 也可以控制事务流程:
1 connection.setAutoCommit( false ) // 设置不自动提交, 相当于开启事务
1 connection.commit() // 提交事务
1 connection.rollback() // 回滚事务
要注意的是: 一个事务的多个操作(INSERT, UPDATE, DELETE .) 必须在同一个Connection上执行, 事务 才能起作用!