JDBC

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语句,用于检查语法的错误,执行的时候是没有参数的)
			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方法一样。










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值