JDBC编程
2016-04-18 21:53
253 查看
jdbc的理解:
所谓的jdbc简单的就是Java代码和数据库之间的一个桥梁,是Java公司制定的一个规范,各个数据库厂商实现的操作数据库的(规范就是借口,这里各个数据库厂商实现接口以便在
Java代码中操作数据库)。
使用jdbc的步骤:
1)加载各个数据库的驱动对象(用于连接数据库的,以MySQL为例)Class.forName("com.mysql.jdbc.driver");这里加载了MySQL驱动的字节码文件,这里就会到驱动管理器里面注册
了一个驱动,在这个类的静态代码块中会注册一个驱动,所以只需要加载他的字节码文件就行。
2)通过驱动管理器来连接数据库,返回的是一个Connection对象。Connection con = DriverManager.getConnection(url,user,password);这里的参数分别的表示连接数据的url,
数据库的用户名和用户密码,其中url的格式为jdbc:mysql://localhost:3306/test,首先采用的jdbc协议,MySQL子协议,然后是主机名和端口,test表示的连接的具体的数据库。和http
协议中的url是类似的,不过这里的协议不是http协议而已。
3)通过连接来创建一个对象(Statement对象,用于操作静态的sql语句的)Statement statement = con.creatStatement();
4)通过statement对象来执行sql语句。Int count = statement.extcuteUpdate(sql);返回值表示的是影响的行数,executeUpdate可以执行ddl和dml语句。
jdbc常用的api:
Connection接口,这个对象主要的作用就是在Java代码中可以通过这个对象来实现sql的执行,Connection接口下主要的有三个接口,分别为Statement(主要的用于执行静态的sql);
PreparedSatement接口,主要的用于操作预编译的sql语句,CallableStatement主要的用于调用存储过程执行的(通过call关键字来调用)。
Statement接口:该接口下主要有int count = executeUpdate(String sql);和Result result = executeQuery(String sql);方法,用于执行静态的sql。
PreparedStatement接口:该接口下主要有 int count = executeUpdate();和Result result = executeQuery();用于执行预编译的sql,注意这里是没有参数的。
CallableStatement接口:该接口主要有Result result = executeQuery()方法。因为CallableStatement接口是PreparedStatement接口的子接口所以也是没有参数的
通过上面的对比发现三个接口的方法名都是一样的,不过这里指定的sql是不一样的,还有就是在CallableStatement接口中没有 executeUpdate()方法,这三者的关系是
Statement接口是PreparedStatement接口的父接口,PreparedStatement是CallableStatement接口父接口。
ResultSet接口:用于封装查询出来的数据的,这个方法中有next()方法,这个方法就是一个指针,开始的时候是指向表头的,当向下移动的时候就移动到第一行,调用几次这个next
方法就会走到第几行,ResultSet rs = statement.executeQuery(sql);这个方法的返回值就是,然后通过getXXX(int colomindex);getXXX(String colomName),就可以获得对应行
中的列的数据。rs.getInt(1);表示的就是获取当前行的第一列的数据
PreparedStatement接口和Statement接口的对比:
1)语法不同PreparedStatement执行的是预编译的sql,而Statement执行的是静态的sql。2)效率不同PreparedStatement有缓冲区(oracle和SQLServer有,MySQL没有),Statement
没有缓冲区。3)安全性不同Statement可以sql注入,但是PreparedStatement是不可以注入的。
代码示例:
b)PreparedStatement对象:(首先要有一条预编译的sql,简单的理解就是有一个带有?的sql语句,用于检查语法的错误,执行的时候是没有参数的executeUpdate(),所有的sql发送到数据库服务器都要进行编译,这种只编译一次,从而就提高了效率,后面的传参就不用编译了)
c)CallableStatement对象:
2)有返回值的:
事物编程:
默认的一条sql是提交事物的,这种就叫做隐士的事物,通过jdbc的连接独享的setAutoCommit()方法来设置,默认参数是true,如果要将多个sql放入到事物中就要将这个参数设置为false,将这块的代码放入奥try块中,如果发生了异常就要回滚当前的事物,就要调用连接对象的rollback()方法,这个方法有一个重载的方法,就是回滚到具体的节点上,这里就要设置连接对象的保存节点,然后就可以使用rollback()带参数的方法了
所谓的jdbc简单的就是Java代码和数据库之间的一个桥梁,是Java公司制定的一个规范,各个数据库厂商实现的操作数据库的(规范就是借口,这里各个数据库厂商实现接口以便在
Java代码中操作数据库)。
使用jdbc的步骤:
1)加载各个数据库的驱动对象(用于连接数据库的,以MySQL为例)Class.forName("com.mysql.jdbc.driver");这里加载了MySQL驱动的字节码文件,这里就会到驱动管理器里面注册
了一个驱动,在这个类的静态代码块中会注册一个驱动,所以只需要加载他的字节码文件就行。
2)通过驱动管理器来连接数据库,返回的是一个Connection对象。Connection con = DriverManager.getConnection(url,user,password);这里的参数分别的表示连接数据的url,
数据库的用户名和用户密码,其中url的格式为jdbc:mysql://localhost:3306/test,首先采用的jdbc协议,MySQL子协议,然后是主机名和端口,test表示的连接的具体的数据库。和http
协议中的url是类似的,不过这里的协议不是http协议而已。
3)通过连接来创建一个对象(Statement对象,用于操作静态的sql语句的)Statement statement = con.creatStatement();
4)通过statement对象来执行sql语句。Int count = statement.extcuteUpdate(sql);返回值表示的是影响的行数,executeUpdate可以执行ddl和dml语句。
jdbc常用的api:
Connection接口,这个对象主要的作用就是在Java代码中可以通过这个对象来实现sql的执行,Connection接口下主要的有三个接口,分别为Statement(主要的用于执行静态的sql);
PreparedSatement接口,主要的用于操作预编译的sql语句,CallableStatement主要的用于调用存储过程执行的(通过call关键字来调用)。
Statement接口:该接口下主要有int count = executeUpdate(String sql);和Result result = executeQuery(String sql);方法,用于执行静态的sql。
PreparedStatement接口:该接口下主要有 int count = executeUpdate();和Result result = executeQuery();用于执行预编译的sql,注意这里是没有参数的。
CallableStatement接口:该接口主要有Result result = executeQuery()方法。因为CallableStatement接口是PreparedStatement接口的子接口所以也是没有参数的
通过上面的对比发现三个接口的方法名都是一样的,不过这里指定的sql是不一样的,还有就是在CallableStatement接口中没有 executeUpdate()方法,这三者的关系是
Statement接口是PreparedStatement接口的父接口,PreparedStatement是CallableStatement接口父接口。
ResultSet接口:用于封装查询出来的数据的,这个方法中有next()方法,这个方法就是一个指针,开始的时候是指向表头的,当向下移动的时候就移动到第一行,调用几次这个next
方法就会走到第几行,ResultSet rs = statement.executeQuery(sql);这个方法的返回值就是,然后通过getXXX(int colomindex);getXXX(String colomName),就可以获得对应行
中的列的数据。rs.getInt(1);表示的就是获取当前行的第一列的数据
PreparedStatement接口和Statement接口的对比:
1)语法不同PreparedStatement执行的是预编译的sql,而Statement执行的是静态的sql。2)效率不同PreparedStatement有缓冲区(oracle和SQLServer有,MySQL没有),Statement
没有缓冲区。3)安全性不同Statement可以sql注入,但是PreparedStatement是不可以注入的。
代码示例:
a)statement对象: Connection conn = null; Statement stmt = null; //模拟传入参数 int id = 3; //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象 conn = DriverManager.getConnection(url, user, password); //3.创建Statement对象,当使用statement对象的时候要创建这个对象。 stmt = conn.createStatement(); //4.sql语句 String sql = "DELETE FROM student WHERE id="+id+""; System.out.println(sql); //5.执行sql int count = stmt.executeUpdate(sql);
b)PreparedStatement对象:(首先要有一条预编译的sql,简单的理解就是有一个带有?的sql语句,用于检查语法的错误,执行的时候是没有参数的executeUpdate(),所有的sql发送到数据库服务器都要进行编译,这种只编译一次,从而就提高了效率,后面的传参就不用编译了)
Connection conn = null; PreparedStatement stmt = null; //1.获取连接 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象 conn = DriverManager.getConnection(url, user, password); //2.准备预编译的sql String sql = "DELETE FROM student WHERE id=?"; //?表示一个参数的占位符 //3.执行预编译sql语句(检查语法) stmt = conn.prepareStatement(sql); //4.设置参数值 stmt.setInt(1, 9); //5.发送参数,执行sql int count = stmt.executeUpdate();
c)CallableStatement对象:
1)没有返回值的 Connection conn = null; CallableStatement stmt = null; ResultSet rs = null; //获取连接 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象 conn = DriverManager.getConnection(url, user, password); //准备sql String sql = "CALL pro_findById(?)"; //可以执行预编译的sql //预编译 stmt = conn.prepareCall(sql); //设置输入参数 stmt.setInt(1, 6); //发送参数 rs = stmt.executeQuery(); //注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!! //遍历结果 while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); System.out.println(id+","+name+","+gender); }
2)有返回值的:
//获取连接 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接对象 conn = DriverManager.getConnection(url, user, password); //准备sql String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数,这个是可变的 //预编译 stmt = conn.prepareCall(sql); //设置输入参数(第一个为位置,第二个为具体的值) stmt.setInt(1, 6); //设置输出参数(注册输出参数) /** * 参数一: 参数位置 * 参数二: 存储过程中的输出参数的jdbc类型 VARCHAR(20) */ stmt.registerOutParameter(2, java.sql.Types.VARCHAR); //发送参数,执行 stmt.executeQuery(); //结果不是返回到结果集中,而是返回到输出参数中 //得到输出参数的值 /** * 索引值: 预编译sql中的输出参数的位置 */ String result = stmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数与registerOutParameter方法一样。
事物编程:
默认的一条sql是提交事物的,这种就叫做隐士的事物,通过jdbc的连接独享的setAutoCommit()方法来设置,默认参数是true,如果要将多个sql放入到事物中就要将这个参数设置为false,将这块的代码放入奥try块中,如果发生了异常就要回滚当前的事物,就要调用连接对象的rollback()方法,这个方法有一个重载的方法,就是回滚到具体的节点上,这里就要设置连接对象的保存节点,然后就可以使用rollback()带参数的方法了
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- [转]我们需要一种其他人能使用的编程语言
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)
- DB2编程序技巧 (一)
- DB2编程序技巧 (八)
- DB2编程序技巧 (十)
- VBS基础编程教程 (第1篇)
- VBS基础编程教程 (第3篇)
- Lua中的类编程代码实例
- Shell编程的一些知识集合