什么是JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

一、:JDBC的简单使用

首先JDBC是一个接口的集合,是用来控制SQL语句的,要导入一些包,本例子中使用的是junit.Test的测试方式

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

// 测试方法,方法必须是public void,再加上一个@Test,然后选中方法,右键run as junit
import org.junit.Test;

public class Demo {
	@Test
	//发送插入语句
	public void fun1() throws Exception{
		//1 导入驱动类库
		//2 注册驱动
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		//3 连接数据库
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//4 操作数据库
		Statement st = conn.createStatement();
		String sql =  " INSERT INTO `t_user` "+
					  "	VALUES (NULL, 'tom', 18)" ;
		st.executeUpdate(sql);

		//5 关闭资源
		st.close();
		conn.close();
	}

	@Test
	//发送查询语句
	public void fun2() throws Exception{
		//1 导入驱动类库
		//2 注册驱动
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		//3 连接数据库,最后的day05代表的是数据库的意思
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//4 操作数据库
		Statement st = conn.createStatement();
		String sql =  " select * from t_user " ;

		ResultSet rs = st.executeQuery(sql);

		//遍历结果集中的内容并打印
		while(rs.next()){
			String name = rs.getString("name");
			int id = rs.getInt("id");
			int age = rs.getInt("age");

			System.out.println(name+"==>"+age+"==>"+id);
		}

		//5 关闭资源
		st.close();
		conn.close();
	}
}

二、:JDBC驱动的注册

推荐使用的是第二种方式,第一种在静态代码块调用了,静态代码块在类加载时被调用,所以我们加载类就可以了

package cn.itcast.b_dm;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;
//DriverManager细节
public class Demo {
	@Test
	public void fun1() throws Exception{
		// 注册驱动
		//注册方式1:不推荐 => 驱动实现类中 的静态代码以及调用过
		// DriverManager.registerDriver(driver);
		//注册方式2:推荐
		Class.forName("com.mysql.jdbc.Driver");
	}
	@Test
	public void fun2() throws Exception{
		// 获得连接
		DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/day05", "root", "1234");

		//url完整 格式:  大协议:子协议://IP地址:端口号/库名?参数键=参数值
		//完整:			  jdbc:mysql://127.0.0.1:3306/day05?useUnicode=true&characterEncoding=utf8
		//简单: <span style="white-space:pre">		</span>  jdbc:mysql:///day05?useUnicode=true&characterEncoding=utf8
	}
}

三、:JDBC四种执行方式

package cn.itcast.c_st;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;
//Statement细节
public class Demo {
	@Test
	//execute 	原始,增删改查都可以 返回值  true=> 查询有结果集  |  false=> 查询没有结果集
	//executeBatch	批量执行sql
	//executeUpdate 执行增删改
	//executeQuery 执行查询
	public void fun1() throws Exception{
		//1 注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2 获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//3 创建Statement
		Statement st = conn.createStatement();
		//4 书写sql
		String sql =  " INSERT INTO `t_user` "+
				  "	VALUES (NULL, 'jerry', 16)" ;
		//5 执行sql
	boolean result = 	st.execute(sql);
	System.out.println(result);//false
		//6关闭资源
	 st.close();
	 conn.close();
	}
	@Test
	public void fun2() throws Exception{
		//1 注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2 获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//3 创建Statement
		Statement st = conn.createStatement();
		//4 书写sql
		String sql =  "select * from t_user" ;
		//5 执行sql
	boolean result = 	st.execute(sql);
		if(result){
			ResultSet  rs = st.getResultSet();
			System.out.println(rs);
		}
		//6关闭资源
	 st.close();
	 conn.close();
	}
	@Test
	//executeUpdate
	public void fun3() throws Exception{
		//1 注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2 获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//3 创建Statement
		Statement st = conn.createStatement();
		//4 书写sql
		String sql =  " INSERT INTO `t_user` "+
				  "	VALUES (NULL, 'jack', 20)" ;
		//5 执行sql
		int row =  st.executeUpdate(sql);
		if(row!=1){
			throw new RuntimeException("插入失败!");
		}
		System.out.println(row);//1
		//6关闭资源
	 st.close();
	 conn.close();
	}
	@Test
	//executeQuery
	public void fun4() throws Exception{
		//1 注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2 获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "7q7q77qq");
		//3 创建Statement
		Statement st = conn.createStatement();
		//4 书写sql
		String sql =  "select * from t_user" ;
		//5 执行sql
		ResultSet rs = st.executeQuery(sql);
		//遍历rs
		System.out.println(rs);
		//6关闭资源
	 st.close();
	 conn.close();
	}
}

四、:JDBC修改数据库

下面使用的是updateString的方式来修改的

package cn.itcast.d_rs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;
//ResultSet细节
// 2.结果集反向修改数据库
public class Demo3 {
	@Test
	public void fun1() throws Exception{
		//1 注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//2 获得连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05", "root", "1234");
		//3 创建Statement
		Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
		//4 书写sql
		String sql =  "select * from t_user" ;
		//5 执行sql
		ResultSet rs = st.executeQuery(sql);
		//使用结果集 反向修改数据库
		rs.next();//将光标移动到第一行
		rs.updateString("name", "汤姆");// 修改第一行name列的值为中文汤姆
		rs.updateRow();// 确认修改
		//6关闭资源
	 st.close();
	 conn.close();
	}
}

五、:JDBC中的工具类

通过使用工具类来导入db.properties中的数据来获得用户名密码等信息,最终获得连接的过程

package cn.itcast.e_tool;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtils {
	private static String driver;
	private static String url;
	private static String user;
	private static String password;

	static{

		try {
			//0读取配置文件
			Properties prop  = new Properties();

			InputStream is = new FileInputStream("src/db.properties");

			prop.load(is);

			is.close();

			driver = prop.getProperty("driver");
			url = prop.getProperty("url");
			user = prop.getProperty("user");
			password = prop.getProperty("password");

			//1 注册驱动
			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	//1 获得连接
	public static Connection getConnection(){
		Connection conn = null;
		try {
			//2 获得连接
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("创建连接失败!");
		}

		return conn;
	}

	//2 释放资源
		//1> 参数可能为空
		//2> 调用close方法要抛出异常,确保即使出现异常也能继续关闭
		//3>关闭顺序,需要从小到大
	public  static void  close(Connection conn , Statement st , ResultSet rs){

		try {
			if(rs!=null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(st!=null){
				st.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				try {
					if(conn!=null){
						conn.close();
						}
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public static void main(String[] args) {
		System.out.println(getConnection());
	}
}

六、:SQL注入问题

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。下边的fun1()就是一个SQL注入的问题,fun2使问题得以解决了。

package cn.itcast.f_ps;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

import cn.itcast.e_tool.JDBCUtils;
public class Demo {
	@Test
	//演示使用Statement对象,sql注入问题
	public void fun1() throws Exception{
		String name ="xxx' OR 1=1 -- ";
		String password ="7q7q77qq";

		//1 获得连接
		Connection conn= JDBCUtils.getConnection();
		//2 获得Statement
		Statement st = conn.createStatement();
		//3 拼装sql语句
		String sql = "SELECT * FROM t_user  WHERE NAME='"+name+"' AND   PASSWORD='"+password+"';";
		//4 执行sql并拿到结果
		ResultSet rs = st.executeQuery(sql);
		//5 根据结果判断是否登录成功
		if(rs.next()){
			System.out.println("登录成功!");
		}else{
			System.out.println("登录失败!");
		}
		//6关闭资源
		JDBCUtils.close(conn, st, rs);
	}

	@Test
	//演示使用PrepareStatement对象,解决sql注入问题
	public void fun2() throws Exception{
		String name ="xxx' OR 1=1 -- ";
		String password ="7q7q77qq";

		//1 获得连接
		Connection conn= JDBCUtils.getConnection();
		//2 拼装sql语句
		String sql = "SELECT * FROM t_user  WHERE NAME=? AND   PASSWORD=?";
		//3 获得PrepareStatement
		PreparedStatement ps = conn.prepareStatement(sql);
		//4 设置参数到ps对象中
		ps.setString(1, name);
		ps.setString(2, password);
		//5 运送参数,执行sql并拿到结果
	ResultSet rs = 	ps.executeQuery();
		//5 根据结果判断是否登录成功
		if(rs.next()){
			System.out.println("登录成功!");
		}else{
			System.out.println("登录失败!");
		}
		//6关闭资源
		JDBCUtils.close(conn, ps, rs);
	}
}

最后的这个PreparedStatement是有点问题的,正在努力解决中。

时间: 2024-11-05 19:40:49

什么是JDBC的相关文章

jdbc的简单使用

1.加载驱动(mysql的驱动是com.mysql.jdbc.Driver,SqlServer的驱动是 com.microsoft.sqlserver.jdbc.SQLServerDriver) 2.加载数据库的连接(url, username,password) 3.编写sql语句(String sql="select * from grade  where gradeName = ?";) 4.遍历查询结果 [while (resultSet.next()) {   System.

商城项目整理(三)JDBC增删改查

商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABLE 2 ( 3 gid NUMBER not null, 4 gname VARCHAR2(90), 5 gdetails CLOB, 6 gpicture VARCHAR2(100), 7 gprice NUMBER, 8 gleixing NUMBER, 9 gpinpai VARCHAR2(20) 10 ) 11 tablespace

jdbc驱动jar导入eclipse

在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java build path,右边选择libraries 3.选择add External jars 4.选择jar包的按照路径下的确定后就行了. Java连接MySQL的最新驱动包下载地址 http://www.mysql.com/downloads/connector/j 有两种方法导入jar包,第一种

JDBC

Java语言访问数据库的一种规范,是一套API JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC规范采用接口和实现分离的思想设计了Java数据库编程的框架.接口包含在java.sql及javax.sql包中,其中java.sql属于JavaSE,javax.sql属于JavaE

java链接MySQL数据库时使用com.mysql.jdbc.Connection的包会出红线问题

package com.swift; //这里导入的包是java.sql.Connection而不是com.mysql.jdbc.Connection import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class TestJDBC { public static void main(String[] args) { try { Class.forName(

Tomcat JDBC Pool使用说明

Maven依赖 <dependency>   <groupId>org.apache.tomcat</groupId>   <artifactId>tomcat-jdbc</artifactId>   <version>8.5.9</version> </dependency> 最新版本为9.0,推荐使用8.5.9稳定版 常用配置 连接池配置项很多,下面只列出了推荐配置,项目组可根据自身情况进行增减 <b

tomcat启动过程报the JDBC Driver has been forcibly unregistered问题的修复过程

最近两天在整理关于flume的总结文档,没有启动过tomcat.昨天晚上部署启动,发现报了如题的错误,全文如下: 严重: The web application [/oa-deploy] registered the JBDC driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] but failed to unregister it when the web application was stopped. To prevent a mem

使用JDBC如何提高访问数据库的性能?

1. 使用数据连接池(Connection Pool), 避免使用DriverManager.getConnection. 2. 合理的配置数据连接池参数,设置数据连接池的初始大小,最大连接数,连接超时时间等. 3. 选择合适的事务等级,按照不同的数据库操作类型选择不同的事务等级. 4. 及时关闭Connection,不关闭的话会严重影响系统的性能,甚至造成系统罢工. 5. 优化Statement 1) 选择合适的Statement, 根据不同的数据库操作选择Statement, Prepare

回滚的意义---JDBC事务回滚探究

JDBC手动事务提交回滚的常见写法一直是rollback写在commit的catch之后: try{ conn.setAutoCommit(false); ps.executeUpdate(); ps.executeUpdate(); conn.commit(); }catch(Exception e){ conn.rollback(); } 但是,这种回滚是没有意义的: 一旦commit前出错, 就不提交了, 回滚无用 一旦commit了, 说明没错, 不用回滚 找到一篇和我观点相同的文章:

Hive JDBC——深入浅出学Hive

第一部分:搭建Hive JDBC开发环境 搭建:Steps ?新建工程hiveTest ?导入Hive依赖的包 ?Hive  命令行启动Thrift服务 ?hive --service hiveserver & 第二部分:基本操作对象的介绍 Connection ?说明:与Hive连接的Connection对象 ?Hive 的连接 ?jdbc:hive://IP:10000/default" ?获取Connection的方法 ?DriverManager.getConnection(&q