JDBC的原理和基本使用

由于数据库的厂商有很多,每个数据库的特点都不同,为了屏蔽数据库层的细节,规定一组接口,具体实现由每个数据库的厂商根据自己情况实现,java应用层只需要面向这个接口,这个接口就是JDBC
基本的使用:
获取数据库连接的5种方式:
1、获取Driver对象,这种方式属于静态加载,灵活性差,依赖强

public void connect01 throws SQLException{
	//创建Driver对象
	Driver driver = new Driver();
	//保存数据库地址,这里的jdbc:mysql:是固定的,不能更改
	String url = "jdbc:mysql://ip地址:端口/表的地址";
	//将用户名、密码保存在Properties对象
	Properties properties = new Properties();
	Properties.setProperty("user","用户名");
	Properties.setProperty("password","密码");
	//创建Connection对象,建立连接
	Connection connection = driver.connect(url,properties);	
	}

2、使用反射加载Driver类,主要是创建Driver对象的不同,相对灵活,减少依赖性

public void connect02 throws NotClassFoundException{
	//通过反射加载Driver类
	Class<?> aClass = Class.forName("Driver包目录");
	Driver driver = (Driver)aClass,newInstance(); 
	//保存数据库地址
	String url = "jdbc:mysql://ip地址:端口/表的地址";
	//将用户名、密码保存在Properties对象
	Properties properties = new Properties();
	Properties.setProperty("user","用户名");
	Properties.setProperty("password","密码");
	//创建Connection对象,建立连接
	Connection connection = driver.connect(url,properties);	
	}

3、使用DriverManager替代Driver对象

public void connect03 throws Exception{
	//通过反射加载Driver类
	Class<?> aClass = Class.forName("Driver包目录");
	Driver driver = (Driver)aClass,newInstance(); 
	//保存数据库地址,用户名,密码
	String url = "jdbc:mysql://ip地址:端口/表的地址";
	String user = "用户名";
	String password = "密码";
	//注册Driver驱动
	DriverManager.registerDriver(driver);
	//创建Connection对象,建立连接
	Connect connect = DriverManager.getConnection(url,user,password);	
	}

4、使用Class.forName自动完成注册驱动,是对方法3的简化

public void connect04 throws Exception{
	//通过反射加载Driver类,在jdk1.5以后使用了jdbc4,不再需要显式的反射,会自动调用驱动包
	//中的类名称去注册
	//另外mysql5.1.6之后的版本不用反射
	//不过还是建议显式写出
	Class.forName("Driver包目录");
	//保存数据库地址,用户名,密码
	String url = "jdbc:mysql://ip地址:端口/表的地址";
	String user = "用户名";
	String password = "密码";
	//创建Connection对象,建立连接
	Connect connect = DriverManager.getConnection(url,user,password);	
	}

方法4之所以能简化,是因为Driver类有个静态方法块,已经注册好了驱动,也是比较推荐的
5、在方法4的基础上改进,增加配置文件,可以更加灵活

public void connect05 throws Exception{
	//创建Properties对象,获取配件文件信息
	Properties properties = new Properties();
	properties.load(new FileInputStream("配置文件目录"));
	//保存数据库地址,用户名,密码,驱动
	String url = properties.getProperty("url");
	String user = properties.getProperty("user");
	String password = properties.getProperty("password");
	String driver = properties.getProperty("driver");
	//创建Connection对象,建立连接
	Class.forName("Driver包目录");//可不写,建议写上
	Connect connect = DriverManager.getConnection(url,user,password);	
	}

通过jdbc操作表:

public void jdbctest throws Exception{
	//先利用上面的5种方式连接表,代码就先省略
	...
	//执行sql
	String sql = "sql语句";
	Statement statement = connect.creatStatement();
	int rows = statement.executeUpdate(sql);//返回的是查询的行数或者dml影响到的行数
	//关闭连接资源
	statement.close();
	connect.close();
	}

ResultSet(结果集):
通常是操作表后执行,里面有个方法类似迭代,可以通过循环语句遍历表中的数据

public void ResultSettest throws Exception{
	//连接表、执行sql,代码就先省略
	...
	//执行后的表,一行数据作为一个对象,创建ResultSet对象后,光标指向列名的一行
	ResultSet resultSet = statement.executeQuery(sql);
	//通过while遍历表中的数据
	while(resultSet.next()){//如果没有更多行,返回false
		int i = resultSet.getInt(1);//获取该行的第一列数据
		String name = resultSet.getString(2);//获取该行的第二列数据,可以看出方法名需要根据数据类型选择
	}
	//关闭连接资源
	resultSet.close();
	statement.close();
	connect.close();
	}

SQL注入:
利用sql的语法漏洞,输入非法的sql语句,恶意攻击数据库
之前用的是Statement对象操作sql语句,无法阻止非法注入
所以衍生了扩展类preparedStatement预处理,可以有效阻止这类情况发生

public void preparedStatementSettest throws Exception{
	//连接表,代码就先省略
	...
	String sql = "select * from table where lable1 = ? and lable2 = ?";
	//通过PreparedStatement操作sql,也可以进行DML操作
	PreparedStatement preparedStatement = connect.preparedStatement (sql);
	//第一个参数代表占位符的第几顺位,第二个参数代表替换
	preparedStatement.setString(1,String1);
	preparedStatement.setString(2,String2);
	//这里就不要带参数了
	ResultSet resultSet = preparedStatement.executeQuery();
	//关闭连接资源
	resultSet.close();
	statement.close();
	connect.close();
	}

其他知识点:
1、在java程序中,用Connection连接表时,事务默认是自动提交状态
可以通过setAutoCommit(false)方法,关闭自动提交
rollback()回滚到setAutoCommit(false)这一行
2、批量处理
在java程序中执行sql后,PreparedStatement或者Statement调用addBatch()方法进行批量处理打包
然后executeBatch()进行批量执行
可以通过clearBatch()进行批量包清空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值