Java-web之JDBC

本文详细介绍了Java JDBC的基本概念、功能、编程步骤,包括加载驱动、创建连接、使用Statement和PreparedStatement执行SQL,以及结果处理和资源回收。重点讲解了PreparedStatement的参数化查询和安全性优势。
摘要由CSDN通过智能技术生成

Java-web之JDBC

1.JDBC的概念

(1)JDBC是什么:

JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。

(2)JDBC的功能:

通过提供的类和接口实现对数据库中表记录的插入删除修改查询等。

(3)JDBC API:

JDBC API可以做:与数据库建立链接,执行SQL语句,处理结果

​ DriverManager:依据数据库的不同,管理JDBC驱动

​ Connection:负责连接数据库并担任传送数据的任务

​ Statement:由Connection产生,负责执行SQL语句

​ ResultSet:负责保存Statement执行后所产生的查询结果

2.JDBC编程步骤

(1)加载驱动:

下载导入驱动jar包后使用Class类下的静态方法forName来加载驱动:

如 加载MySQL驱动:

Class.forName(“com.mysql.jdbc.Driver”);

加载jdbc-odbc桥接器驱动:

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

注意:Class.forName需要捕获ClassNotFoundException.

try {
        Class.forName("com.mysql.jdbc.Driver");		
        } catch (ClassNotFoundException e) { 				
            e.printStackTrace();
        }

Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。

(2)创建连接

通过DriverManager获取数据库连接:

DriverManager.getConnection(String url,Stringuser,String pass);

上面的三个参数分别指的是:

​ ●数据库的url

​ ●登录数据库的用户名

​ ●用户密码

数据库url通常写法:

jdbc:subprotocol:other stuff

例如:MySQL中:

●jdbc:mysql://hostname:port/databasename

Access中:

●jdbc:odbc:数据源名称,用户名,密码

因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个工具方法,用的时候直接调用即可:

        /**
	 * 取得数据库的连接
	 * @return 一个数据库的连接
	 */
public static Connection getConnection(){
		Connection conn = null;
		 try {
			 	//初始化驱动类com.mysql.jdbc.Driver
	            Class.forName("com.mysql.jdbc.Driver");
	            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8","root", "admin");
	            //该类就在 mysql-connector-java-5.0.8-bin.jar中,如果忘记了第一个步骤的导包,就会抛出ClassNotFoundException
	        } catch (ClassNotFoundException e) { 				
	            e.printStackTrace();
	        }catch (SQLException e) {							
	            e.printStackTrace();
	        }
		 return conn;
	}

(3)准备语句:

通过创建Statement或者PreparedStatement接口,执行SQL语句

Statement接口:

在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,具体在下文中的对比中介绍。所以Statement在实际过程中使用的非常的少。字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。

●createStatement()

​ 创建基本的Statement对象

Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "insert into t_courses values(null,"+"'数学')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题
s.execute(sql);
System.out.println("执行插入语句成功");
PreparedStatement接口:

与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。

PreparedStatement的优点:

其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。

其具有预编译机制,性能比statement更快。

其能够有效防止SQL注入攻击。

●prepareStatement(String sql)

​ 根据传入的SQL语句创建预编译的Statement对象

●prepareCall(String sql)

​ 根据传入的SQL语句创建CallableStatement对象

例:给数据库中添加课程:

        /**
	 * 添加课程
	 * @param courseName 课程名称
	 */
	public void addCourse(String courseName){
		String sql = "insert into t_course(course_name) values(?)";  
 //该语句为每个 IN 参数保留一个问号(“?”)作为占位符
		Connection conn = null;				//和数据库取得连接
		PreparedStatement pstmt = null;		//创建statement
		try{
			conn = DbUtil.getConnection();
			pstmt = (PreparedStatement)  	conn.prepareStatement(sql);
			pstmt.setString(1, courseName); //给占位符赋值
			pstmt.executeUpdate();			//执行
		}catch(SQLException e){
			e.printStackTrace();
		}
		finally{
			DbUtil.close(pstmt);
			DbUtil.close(conn);		//必须关闭
		}
	}

PreparedStatement接口中批量操作的方法:

for(int i=1;i<100;i++){
     pstmt.setInt(1,8000+i);
     pstmt.setString(2,"xx"+i);
     pstmt.addBatch();
//批量更新
     if(i%10==0){
     pstmt.executeBatch();
    }
}

(4)执行库操作

使用Statement对象执行SQL语句:

所有Statement对象都有以下三个方法:

①execute()

​ 执行任何SQL语句,通用但不好用

②executeUpdate()

​ 执行DML和DDL语句

​ 执行DML语句返回受SQL语句影响的行数

​ 执行DDL语句返回0

③executeQuery()

​ 只能执行查询语句

​ 返回代表查询结果的ResultSet对象

④execute和executeUpdate的区别

相同点:二者都能够执行增加、删除、修改等操作。

不同点:

(1) execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。

(2) execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。

(5)处理结果

执行的SQL语句是查询语句

●将返回一个ResultSet对象来取出查询结果

●ResultSet对象提供了两类方法:

​ —next(),previous(),first(),last(),beforeFirst(),afterLast(),absolute()等

​ 用于移动记录的方法【行上的移动和指定】

​ —getXXX(参数)

​ 获取记录指针指向行,特定的值【某行列上的移动和指定】

​ 可以使用列索引作为参数【性能好】

​ 可以使用列名称作为参数【可读性强】

●ResultSet对象的实质是一个查询结果集,在逻辑结构上非常类似于一个

(6)回收资源

●回收数据库资源

​ —关闭ResultSet

​ —关闭Statement

​ —关闭Connection

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值