1.连接数据库三种方式
//连接数据库的URL private String url = "jdbc:mysql://localhost:3306/day17"; // jdbc协议:数据库子协议:主机:端口/连接的数据库 // private String user = "root";//用户名 private String password = "root";//密码
方法一:创建驱动程序对象
//1.创建驱动程序类对象 Driver driver = new com.mysql.jdbc.Driver(); //新版本 //Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本 //设置用户名和密码 Properties props = new Properties(); props.setProperty("user", user); props.setProperty("password", password); //2.连接数据库,返回连接对象 Connection conn = driver.connect(url, props);
方法二:使用驱动器类连接数据库(注册了2次没必要)
Driver driver = new com.mysql.jdbc.Driver(); //Driver driver2 = new com.oracle.jdbc.Driver(); //1.注册驱动程序(可以注册多个驱动程序) DriverManager.registerDriver(driver); //DriverManager.registerDriver(driver2); //2.连接到具体的数据库 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn);
方式三推荐:加载驱动程序
//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序 Class.forName("com.mysql.jdbc.Driver"); //Driver driver2 = new com.oracle.jdbc.Driver(); //1.注册驱动程序(可以注册多个驱动程序) //DriverManager.registerDriver(driver); //DriverManager.registerDriver(driver2); //2.连接到具体的数据库 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn);
2.JDBC核心API
java.sql.*和javax.sql
1)Driver接口:java驱动程序接口,任何数据库厂商都要实现这个接口;
这个接口里面有一个方法:connect(url,properties)
url:jdbc协议:数据库子协议://主机:端口号/数据库
user:数据库用户名
password:数据库密码
2)DriverManger类:管理驱动程序Driver的
registerDriver(Driver):注册驱动程序,可以注册多个驱动程序对他们进行管理
getConnection(url,user,password):获得连接对象
3)Connection接口:表示java程序与数据库的连接对象
CreateStatement();创建Stataement对象
prepareStatement();创建PrepareStatement()对象
prepareCall(String sql);创建CallableStatement对象
4)Statement接口
excuteUpdate():执行预编译存储过程sql语句
executeQuery() : 执行预编译的查询sql语句(DQL)
PrepareStatement接口:执行预编译
CallableStatement接口:用于执行存储过程的sql语句(call xxx)
ResultSet executeQuery() : 调用存储过程的方法
5)ResultSet接口
boolean next() : 将光标移动到下一行
getXX() : 获取列的值
3.预编译:PreparedStatement执行sql语句
执行sql语句会预编译,sql中有参数,可以之后再添加
//2.准备预编译的sql String sql = "INSERT INTO student(NAME,gender) VALUES(?,?)"; //?表示一个参数的占位符 //3.执行预编译sql语句(检查语法) stmt = conn.prepareStatement(sql); //4.设置参数值 /** * 参数一: 参数位置 从1开始 */ stmt.setString(1, "李四"); stmt.setString(2, "男");
4.CallableStatement执行存储过程
1.sql String sql=conn.prepareCall(sql); //预编译 stmt=conn.prepareCall(sql); //设置输入参数 stmt.setInt(1,6); //设置输出参数(注册输出参数) stmt.registerOutParameter(2,java.sql.Type.varchar); //发送参数,执行 stmt.executeQuery(); //得到结果 String result=stmt.getString(2);//getXX方法专门用于获取存储过程中的输出参数
5.事务;
事务特性:原子性,一致性,隔离性,持久性
原子性,是一个最小逻辑操作单元 !
一致性,事务过程中,数据处于一致状态。
持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。
隔离性, 事务与事务之间是隔离的。
技术:setAutoCommit();设置是否自动提交事务
commit();手动提交事务
rollback();代码需要回退到开始前的状态
例子:转账,这里可以设置回滚的到莫一位置,在第一次转账结束位置设置一个回滚点,要是在哪里就发生错误就回滚到指定的代码段
// 3. 转账,使用事务, 回滚到指定的代码段 public void trans() { // 定义个标记 Savepoint sp = null; // 第一次转账 String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName='张三';"; String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName='李四';"; // 第二次转账 String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName='张三';"; String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName='李四';"; try { con = JdbcUtil.getConnection(); // 默认开启的隐士事务 con.setAutoCommit(false); // 设置事务手动提交 /*** 第一次转账 ***/ pstmt = con.prepareStatement(sql_zs1); pstmt.executeUpdate(); pstmt = con.prepareStatement(sql_ls1); pstmt.executeUpdate(); // 回滚到这个位置? sp = con.setSavepoint(); /*** 第二次转账 ***/ pstmt = con.prepareStatement(sql_zs2); pstmt.executeUpdate(); pstmt = con.prepareStatement(sql_ls2); pstmt.executeUpdate(); } catch (Exception e) { try { // 回滚 (回滚到指定的代码段) con.rollback(sp); } catch (SQLException e1) { } e.printStackTrace(); } finally { try { // 提交 con.commit(); } catch (SQLException e) { } JdbcUtil.closeAll(con, pstmt, null); } }