JDBC

JDBC

一、jdbc基础

JDBC (Java Database Connectivity) 是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类和接口组成。

JDBC 是一种规范,各数据库厂商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMSJava应用程序的开发工具和产品成为可能。

所需接口与类都在java.sql中,常用接口与类如下:

 Driver (interface)

 DriverManager (class)

 Connection (interface)

Statement (interface)

PreparedStatement (interface)

CallableStatement (interface)

ResultSet (interface)

DatabaseMetaData (interface)

ResultSetMetaData (interface)

Types (class)

 

二、MySql连接

下载jar包(mysql-connector-java),下载地址:http://www.cr173.com/soft/45333.html,导入jar包。

package day0912;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;

public class MySql {
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static void main(String[] args) {
		//jdbc连接数据库参数 账号 密码 ip 端口 数据库名
		String url = "jdbc:mysql://localhost:3306/test";
		//驱动类,告诉jdbc使用哪个数据库
		String driverClass="com.mysql.jdbc.Driver";
		//账号密码
		String user = "root";
		String password = "zyp";
		//需要jvm加载该类(反射)
		try {
			Class.forName(driverClass);
			//connection 用于和数据库连接的类
			//DriverManager 驱动管理类,通过获取不同数据库的驱动类,实现不同的登录方式
			Connection conn=DriverManager.getConnection(url, user, password);
			//如果打印出地址则登录成功,异常则失败
			System.out.println(conn);
			//statement 用来执行静态sql语句
			Statement state = conn.createStatement();
			//ResultSet 用来游标遍历数据行 next()
			ResultSet rs =state.executeQuery("select * from emp");
			while(rs.next()){
				int empno = rs.getInt(1);//根据下标获取值,下标从1开始
				String ename = rs.getString("ename");//根据列名获取值
				String job = rs.getString("job");
				int mgr = rs.getInt(4);
				//mysql  datestamp对应java.sql.Timestamp
				Timestamp hiredate = rs.getTimestamp(5);//取时间
				int sal = rs.getInt(6);
				int comm = rs.getInt(7);
				int deptno = rs.getInt(8);
				String empdesc = rs.getString("empdesc");
				System.out.println(empno+" "+ename+" "+job+" "+mgr+" "+sdf.format(hiredate)+" "+sal+" "+comm+" "+deptno+" "+empdesc);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

三、Oracle连接

寻找jar包:在oracle的安装目录中就有(c:\app\Administrator\product\11.2.0\)一般用ojdbc6, 导入jar包。


package day0912;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;

public class Oracle {
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static void main(String[] args) {
		//jdbc连接数据库参数 账号 密码 ip 端口 数据库名
		String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
		//驱动类,告诉jdbc使用哪个数据库
		String driverClass="oracle.jdbc.OracleDriver";
		//账号密码
		String user = "scott";
		String password = "tiger";
		//需要jvm加载该类(反射)
		try {
			Class.forName(driverClass);
			//connection 用于和数据库连接的类
			//DriverManager 驱动管理类,通过获取不同数据库的驱动类,实现不同的登录方式
			Connection conn=DriverManager.getConnection(url, user, password);
			//如果打印出地址则登录成功,异常则失败
			System.out.println(conn);
			//statement 用来执行静态sql语句
			Statement state = conn.createStatement();
			//ResultSet 用来游标遍历数据行 next()
			ResultSet rs =state.executeQuery("select * from emp");
			while(rs.next()){
				int empno = rs.getInt(1);//根据下标获取值,下标从1开始
				String ename = rs.getString("ename");//根据列名获取值
				String job = rs.getString("job");
				int mgr = rs.getInt(4);
				//oracle  date
				Date hiredate = rs.getDate(5);//取时间
				int sal = rs.getInt(6);
				int comm = rs.getInt(7);
				int deptno = rs.getInt(8);
				System.out.println(empno+" "+ename+" "+job+" "+mgr+" "+sdf.format(hiredate)+" "+sal+" "+comm+" "+deptno);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}
}



四、整理和补充

jdbc参数:

url="jdbc:mysql://ip:端口/数据库名"(mysql)

url="jdbc:oracle:thin:@ip:端口:数据库名"(oracle)

dirverClass="com.mysql.jdbc.Driver"(mysql)

dirverClass="oracle.jdbc.OracleDriver"(oracle)

username=用户名

password=密码

sql注入:

由于sql语句是字符串拼接的,所以再传值时,有人会传入一个恒成立语句,使得sql语句的条件成立,这样就会暴露数据库中的信息

:

   原来sql语句:select * from emp where job=''

   传值后sql语句:select * from emp where job='' or1=1 or 1=''

解决方法:使用PreparedStatement预编译传值   

StatmentPreparedStatement:

Statement 每一次都会将sql语句传给数据库,如果要执行多次,会占用数据库资源,效率会下降,并且它还是不安全的,会被sql注入。

PreparedStatement 继承Statement,用来处理一个预编译的sql,防止sql注入,

可滚动游标:用来指定行抓取数据,分页,设置,最大抓取行数

 

事务:是一个运行的单元,该单元运行的程序,必须满足acid特性,jdbc中事务是自动提交的

设置手动提交:conn.setAutoCommit(true/false);true自动,false手动

提交方式:conn.commit()提交,conn.rollbacke()回滚

 

调用存储过程:

{call 存储过程名 (?...)}

调用函数:

{?=call 函数名 (?...)}

批处理:减少连接,提高效率

 使用addBatch(),executeBatch()


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值