您的位置:首页 > 编程语言

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是不可以注入的。

 代码示例:

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()带参数的方法了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Javaee jdbc 编程