JDBC访问数据库(增删查改)

JDBC技术所涉及到的类需要导入的包:

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

JDBC是一种用于执行SQL语句的Java API, 由一组类与接口组成。

所涉及到的类有:

  • 驱动程序接口: Driver
  • 驱动程序管理器类: DriverManager
  • 数据库连接接口类: Connection
  • 执行SQL语句接口类: Statement
  • 执行动态SQL语句接口类: PreparedStatement
  • 访问结果集类: ResultSet
类或接口作用
java.sql.DriverManager该类处理驱动程序的加载和建立新数据库连接
java.sql.Connection该接口实现对特定数据库的连接
java.sql.Satement该接口用于执行静态SQL语句并返回它所生成结果的对象
java.sql.PreparedStatement该接口表示预编译的SQL语句的对象,派生自Satement,预编译SQL效率高且支持参数查询
java.sql.CallableStatement该接口表示用于执行SQL语句存储过程的对象。派生自PreparedStatement,用于调用数据库中的存储过程
java.sql.ResultSet该接口表示数据库结果集的数据表,该数据表通过执行查询数据库的语句生成
1.驱动程序接口: Driver

每种数据库( MySQL、SQL Server、oracle 等等)都提供了数据库驱动程序,并且都提供了一个实现java.sql.Driver接口的类,简称Driver类。.

  1. 在应用程序开发中,需要通过java. lang. Class类的静态方法加载该Driver类:
    Class. forName( String className);
  2. 对于MySQL数据库,其驱动程序加载格式:
    Class. forName ("com.mysql.cj.jdbc.Driver");
  3. 创建自己的实例对象(采用默认的对象名称),并向java. sql. DriverManager类注册该实例
2.驱动程序管理器: DriverManager

DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,主要用于在数据库和驱动程序之间建立连接

  1. DriverManager类提供的创建连接对象的方法是:
    Connection getConnection (String url);
    该方法为静态方法,用来获得数据库连接,有1个入口参数,为连接字符串。
  2. 对于MySQL数据库的连接对象,可采用如下方式创建:
String url1=" jdbc : mysql://数据库服务器IP :3306/数据库名";
String url2=" ?user=root&password=密码”;
String url3=" &useUni code= true&characterEncoding =UTF- 8; // 支持汉字编码
Connection conn=Dr iverManager. getConnection(url); //获取 数据库连接对象
3.数据库连接接口: Connection

Connection接口负责与特定数据库的连接,形成连接对象。

  1. Connection接口的常用方法
方法名称功能描述
createStatement()创建并返回一个Statement实例,通常在执行无参数的SQL语句时创建该实例
prepareStatement()创建并返回一个PreparedStatement实例,在执行包含参数的SQL语句时创建该实例,并对SQL语句进行了预编译处理
close()立即释放Connection实例占用的数据库和JDBC资源,即关闭数据库连接
  1. 使用带参数的SQL语句(“?”表示参数值),创建PreparedStatement对象。

例如:
String ss=" select * from stu_ info where age>=? and sex=?" ;
PreparedStatement pstmt= conn.preparedStatement (ss);
注意:在SQL语句中,没有指定具体的年龄和性别,在实际执行该SQL前,需要利用pstmt对象,设置参数值.

4.执行动态SQL语句接口: PreparedStatement

PreparedStatement接口继承于Statement接口,是Statement接口的扩展,使用更灵活。

  1. PreparedStatement接口提供的常用方法:
方法名称功能描述
executeQuery()执行SELECT语句,并返回一个ResultSet实例对象(查询结果集合)
executeUpdate()执行INSERT、UPDATE或DELETE语句,返回int型数值,为更新记录数
setXxx(position,value)为指定参数设置Xxx型值,注意: position是从1开始的
close()关闭PreparedStatement对象,释放资源
  1. 使用示例
    String sq1= “select xh, name,cj from stu where cj>=? and name=?; // 查询SQL语句
    PreparedStatement pstmt= conn.prepareStatement (sq1) ;
    pstmt.setInt(1, 60);  //根据?所在的位置号,给出对应的具体数据。
    pstmt. setString(2,”张三”):
    Rrsul tSet rs=pstmt. executeQuery() ;  //执行,得到查询结果集合,注意,这里是空参数
    
5.访问结果集接口: ResultSet——获得查询结果并进行处理

ResultSet实例是通过执行查询数据库的语句生成。即:ResultSet对象是由查询结果构成的数据表。
对查询结果的处理,一般需要,首先定位记录位置,然后对确定记录的字段项实现操作

  1. ResultSet接口提供的记录定位方法:
方法名称功能描述
first()移动第一行
last()移动最后一行
previous()向上移动一行
next()向后移动一行。注意:对于查询结果集,其指针最初位于第一行之前,第一次调用该方法将移动到第一行; 如果存在下一行则返回true,否则返回false
getRow()获得当前行的索引编号(编号从1开始)
  1. 读取指定字段的数据操作:
    两种格式:
    利用整数指定字段的索引(索引从1开始)
    利用字段名来指定字段。

下表列出采用“指定字段的索引号”获取各种类型的字段值的方法:

方法名称方法说明
boolean getBoolean(int ColumnIndex)返回指定字段的以Java的booelan类型表示的字段值
String getString(int Columnlndex)返回指定字段的以Java的String类型表示的字段值
byte getByte(int ColumnIndex)返回指定字段的以Java的byte类型表示的字段值
int getlnt(int ColumnIndex)返回指定字段的以Java的int类型表示的字段值
byte[ ] getBytes(int ColumnIndex)返回指定字段的以Java的字节数组类型表示的字段值
Date getDate(int ColumnIndex)返回指定字段的以Java.sql.Date的Date类型表示的字段值
  1. 修改指定字段的数据操作.
    移到指定的数据行后,可使用updateXxx ()方法设置字段新的数值,
    其中:“Xxx” 指的是Java的数据类型

    方法: updateXxx(字段名或字段序号,新数值) 中的参数也有两种格式:
    使用整数指定字段的索引(索引从1开始)
    使用字段名来指定字段

实现步骤:

1.利用Java实现对MySQL数据库访问,需要搭建支持环境。
  1. 从MySQL数据库下载其连接驱动程序:
    (mysql-connector-java-5.1.7-bin.jar)
  2. 将其复制到Web.工程(对于Java工程先创建1ib)的lib子目录下(导入该支持程序)
2.使用JDBC访问数据库,其访问流程是:
  1. 注册驱动(加载驱动程序) : Class. forName (com. mysql. jdbc. Driver);
  2. 建立连接(Connection):
    Connection conn=DriverManager. getConnection(url): //创建连接对象
    注意: url如何形成? URL连接字格式一定要正确,否则会出现连接数据库错 误! ! !
  3. 创建数据库操作对象用于执行SQL的语句:
    PreparedStatement pstmt= conn. prepareStatement (sql) ;
  4. 执行语句; (分两种类型:查询和更新操作)。
    Resul tSet rs=pstmt.executeQuery(); //执行,得到查询结果集合,注意,这里是空参数
    或int n=pstmt.executeUpdate(): //执行, 返回实际删除记录的条数,
  5. 对于查询要处理执行结果(ResultSet)。
  6. 释放资源。
3.命令行中文乱码问题:

现象: mysql 的默认编码设置为utf-8,页面以utf-8的编码方式写入到数据库。用工具查看一切正常, 但从mysql的命令行读数据出来总是乱码

原因: mysql 的客户端根本无法以utf- 8的形式返回数据
解决如下:

set names gb2312;//改成支持汉字的国标编码
4.查看mysq1数据库的字符编码
mysql> show variables like 'character%';//查询当前mysql数据库的所有属性的字符编码
5.修改mysql数据库的字符编码
mysql> SET character_set_client=utf8 ;
	SET character_set_client = utf8;
	SET character_set_results = utf8;
	SET character_set_connection = utf8;

添加记录:

public class Add_db {
	
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		
		String driverName="com.mysql.cj.jdbc.Driver";
		String userName ="root" ;//数据库用户名
		String userPwd ="190211" ;//密码
		String dbName ="student" ;//数据库名
		String url1="jdbc:mysql://localhost :3306/" +dbName;
		String url2 ="?user=" +userName+"&password=" +userPwd; 
		String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
		String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
		Class.forName(driverName);
		Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
		
		//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
			
			String sql="insert into stu(id,sno,sname,sex,bjid,fen) value(?,?,?,?,?,?)";
			//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
			PreparedStatement pstmt= conn.prepareStatement(sql);
			pstmt.setInt(1, 10);
			//根据?所在的位置号,从1开始编号,给出对应的具体数据。
			pstmt.setString(2, "001");
			pstmt.setString(3,"张济");
			pstmt.setString(4,"男");
			pstmt.setString(5, "2001");
			pstmt.setInt(6, 69);
			int n=pstmt. executeUpdate();
			//执行,返回实际影响记录的条数,注意,这里是空参数
			
			//第3步:对执行结果处理
			//对数据n进行判定并给出相应的处理
			//第4步:关闭对象,释放资源
			if(n>0) {
				System.out.println("添加成功,共添加了"+n+"条记录");
			}else {
				System.out.println("添加不成功");
			}
			
			pstmt. close() ;
			conn. close();
	}
}

删除记录:

public class Del_db {
	
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		String driverName="com.mysql.cj.jdbc.Driver";
		String userName ="root" ;//数据库用户名
		String userPwd ="190211" ;//密码
		String dbName ="web_01" ;//数据库名
		String url1="jdbc:mysql://localhost :3306/" +dbName;
		String url2 ="?user=" +userName+"&password=" +userPwd; 
		String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
		String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
		Class.forName(driverName);
		Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
		
		//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
			
			String sql="delete from stu where grade<?";
			//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
			PreparedStatement pstmt= conn.prepareStatement(sql);
			pstmt.setInt(1, 60);
			//根据?所在的位置号,从1开始编号,给出对应的具体数据。
			int n=pstmt. executeUpdate();
			//执行,返回实际影响记录的条数,注意,这里是空参数
			
			//第3步:对执行结果处理
			//对数据n进行判定并给出相应的处理
			//第4步:关闭对象,释放资源
			if(n>0) {
				System.out.println("删除成功,共删除了"+n+"条记录");
			}else {
				System.out.println("删除不成功");
			}
			
			pstmt. close() ;
			conn. close();
	}
}

查询记录:

public class Select {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		
		String driverName="com.mysql.cj.jdbc.Driver";
		String userName ="root" ;//数据库用户名
		String userPwd ="190211" ;//密码
		String dbName ="web_01" ;//数据库名
		String url1="jdbc:mysql://localhost :3306/" +dbName;
		String url2 ="?user=" +userName+"&password=" +userPwd; 
		String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
		String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
		Class.forName(driverName);
		Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
		
		//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
			
			String sql="select id,name,grade from stu where grade>=?";
			//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
			PreparedStatement pstmt= conn.prepareStatement(sql);
			pstmt.setInt(1, 90);
			//根据?所在的位置号,从1开始编号,给出对应的具体数据。
			ResultSet n=pstmt.executeQuery();
			//执行,返回实际影响记录的条数,注意,这里是空参数
			
			//第3步:对执行结果处理
			//对数据n进行判定并给出相应的处理
			//第4步:关闭对象,释放资源
			while(n.next()) {
				int a=n.getInt("id");
				String b=n.getString("name");
				int c=n.getInt("grade");
				String x="id="+a+" name="+b+"  grade="+c;
				System.out.println(x);
			}
			
			pstmt. close() ;
			conn. close();
	}
}

修改记录:

public class Set_db {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		String driverName="com.mysql.cj.jdbc.Driver";
		String userName ="root" ;//数据库用户名
		String userPwd ="190211" ;//密码
		String dbName ="web_01" ;//数据库名
		String url1="jdbc:mysql://localhost :3306/" +dbName;
		String url2 ="?user=" +userName+"&password=" +userPwd; 
		String url3="&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8";
		String url =url1+url2+url3;//形成带数据库读写编码的数据库连接字
		Class.forName(driverName);
		Connection conn =DriverManager.getConnection(url) ; //创建连接对象 (创建桥)
		
		//第2步:利用SQL语句,创建执行语句(执行对象: pstmt) ,并执行SQL,得到结果
			
			String sql="update stu set grade=? where id=?";
			//更 新数据库的:添加、删除、修改操作的SQL语句,可以有参数
			PreparedStatement pstmt= conn.prepareStatement(sql);
			pstmt.setInt(1, 100);
			pstmt.setInt(2, 2);
			//根据?所在的位置号,从1开始编号,给出对应的具体数据。
			int n=pstmt. executeUpdate();
			//执行,返回实际影响记录的条数,注意,这里是空参数
			
			//第3步:对执行结果处理
			//对数据n进行判定并给出相应的处理
			//第4步:关闭对象,释放资源
			if(n>0) {
				System.out.println("修改成功,共修改了"+n+"条记录");
			}else {
				System.out.println("修改不成功");
			}
			
			pstmt. close() ;
			conn. close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值