JDBC增删改查学习笔记

JDBC增删改查学习笔记

增删改查需要的步骤:

  1. 关联数据库驱动包(不同的数据库使用的驱动包是不一样的)
  2. 注册驱动(通过反射进行驱动的注册)
  3. 连接数据库获取数据库连接对象(登录-选择数据库的过程)
  4. 执行SQL语句
  5. 处理结果集
  6. 关闭数据库连接对象

关键词:DriverManager(管理JDBC驱动)、Statement(用于SQL的编译及执行)/PreparedStatement(预编译)/CallableStatement(执行存储过程)、ResultSet(结果集)

Statement 接口

Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。

execut方法

方法的返回类型是Boolean,表示有无ResultSet返回。

executeQuery 方法
方法返回的类型是ResultSet,返回执行了查询语句的结果集,通常用于执行查询语句。

executeUpdate 方法
返回的类型是int,表示执行了sql语句后被影响到的行数,通常用于执行修改语句。

查询功能

要查询的MySQL数据库中的student表的字段信息
在这里插入图片描述

及其表内数据
在这里插入图片描述

jdbc查询数据库代码演示:

public class JdbcTest {
	//数据库驱动信息
	private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
	//数据库连接参数,test2是数据库名称
	private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
	//数据库用户名
	private static final String USER = "root";
	//数据库登录密码
	private static final String PASSWORD = "123456";
	
	
	/**
	 * 查询功能
	 */
	public static void query() {
		//声明几个变量,需要在以下各个代码块中使用
		Connection conn = null;//Connection接口代表着与数据库的链接
		Statement statement = null;//Statment接口,用于执行sql语句并返回其生成的结果对象
		ResultSet rs = null;//ResultSet结果集,用于遍历
		
		try {//以下对象的创建有出现异常的可能,因此用trycatch捕捉异常
			//加载MySQL驱动
			Class.forName(DRIVER);
			//登录数据库获取连接对象
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			//定义sql语句,选定数据库里的student表中的 s_id,s_name,s_birth,s_sex 字段
			String sql = "select s_id,s_name,s_birth,s_sex from student where s_id = '01' ";
			//创建一个Statement对象,执行SQL语句需要Statement对象
			 statement = conn.createStatement();
			//executeQuery()用于执行SQL语句获取结果集
			 rs = statement.executeQuery(sql);
			//遍历结果集(查询的过程中,可能会出现查询结果为空)
			while( rs.next() ) {//判断是否有下一个元素,每次循环都代表一行数据
				//以下是ResultSet类里的方法,可以获取数据库表里的一行数据中的每个数据,调用的方法要与数据库中的字段类型匹配。
				//方法参数写成数字形式时,必须与以上sql中字段顺序匹配
				int s_id = rs.getInt(1);
				String s_name = rs.getString("s_name");
				Date s_birth = rs.getDate(3);
				String s_sex = rs.getString("s_sex");
				System.out.println(s_id+"--"+s_name+"--"+s_birth+"--"+s_sex);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			//关闭数据库连接对象,注意关闭顺序
			try {//关闭连接对象的操作有出现异常的可能,因此用trycatch捕捉异常
				
				//可能出现了异常导致对象未成功创建,也就不用关闭连接,因此加上if判断
				if(rs != null) {
					rs.close();
				}
				if(statement != null) {
					statement.close();
				}
				if(conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
	}
}

测试查询功能:

public static void main(String[] args) {
	JdbcTest.query();
}
/*程序运行结果
1--赵雷--1990-01-01--男
*/
增删改功能

增删改三个功能的操作有点相似

添加功能

public class JdbcTest {
	//数据库驱动信息
	private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
	//数据库连接参数
	private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
	//数据库用户名
	private static final String USER = "root";
	//数据库登录密码
	private static final String PASSWORD = "123456";

	/**
	 * 添加数据
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public static void insert() throws ClassNotFoundException, SQLException {
        
		//加载驱动程序
		Class.forName(DRIVER);
        
        //连接数据库
		Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
        
		//定义一个sql语句
		String sql = "insert into student values(9,'张三','1991-01-01','男')";
        
		//用于执行sql语句的对象
		Statement statement = conn.createStatement();
        
		//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
		int result = statement.executeUpdate(sql);
		//打印输出被影响到的行数
		System.out.println(result);
		//关闭连接
		if(statement != null) {
			statement.close();
		}
		if(conn != null) {
			conn.close();
		}
	}
}	

测试添加功能:

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		JdbcTest.insert();
	}
/*程序运行结果
1
*/

添加了一行数据后,数据库中student表:
在这里插入图片描述

修改功能

    /**
	 * 修改数据
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public static void update() throws ClassNotFoundException, SQLException  {

		//加载驱动程序
		Class.forName(DRIVER);
        
        //连接数据库
		Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
        
		//定义一个sql语句
		String sql = "update student set s_name='李四' where s_id=9";
        
		//用于执行sql语句的对象
		Statement statement = conn.createStatement();
        
		//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
		int result = statement.executeUpdate(sql);
		//打印输出被影响到的行数
		System.out.println(result);
		//关闭连接
		if(statement != null) {
			statement.close();
		}
		if(conn != null) {
			conn.close();
		}
	}

测试修改功能:

public static void main(String[] args) throws ClassNotFoundException, SQLException {
	JdbcTest.update();
}
/*程序运行结果
1
*/

修改数据后,数据库中student表:
在这里插入图片描述

删除功能

	/**
	 * 删除数据
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public static void delete() throws ClassNotFoundException, SQLException  {

		//加载驱动程序
		Class.forName(DRIVER);
        
        //连接数据库
		Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);
        
		//定义一个sql语句
		String sql = "delete from student where s_id=9";
        
		//用于执行sql语句的对象
		Statement statement = conn.createStatement();
        
		//使用Statement接口里的executeUpdate()方法执行sql语句,返回值为执行了sql语句后被影响到的行数
		int result = statement.executeUpdate(sql);
		//打印输出被影响到的行数
		System.out.println(result);
		//关闭连接
		if(statement != null) {
			statement.close();
		}
		if(conn != null) {
			conn.close();
		}
	}

测试删除功能:

public static void main(String[] args) throws ClassNotFoundException, SQLException {
	JdbcTest.delete();
}
/*程序运行结果
1
*/

删除一条数据后,数据库中student表:
在这里插入图片描述

如果在执行修改动作时出现乱码,是因为开发工具的编码与数据库中的编码不一致导致的,数据库的编码大多数为UTF-8,所以在连接的地址上去设置编码即可,针对5.1及8.0的版本不同,设置编码的方式为:

8.0:jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
5.1:jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8
JDBC增删改功能封装

上面可以看出,增删改查中有重复的代码,尤其是增删改,可以把这些重复的地方封装起来,提高代码的简洁性和灵活性。

先分析相同点和不同点,以决定具体需要封装的功能

增删改查四个功能的相同点和不同点
  	相同点:
  		1、注册驱动
  		2、连接数据库
  		3、关闭数据库
  	不同点:
  		1、SQL语句不同
  		2、结果集不同
  
增删改的异同点
  	相同:
  		1、注册驱动
  		2、连接数据库
  		3、执行SQL方式
  		4、关闭数据库
 	不同点:
 		1、SQL语句不同

代码演示:

/**
 * 一个数据库连接工具类
 * @author Administrator
 */
public class DBUtil {
		//数据库驱动信息
		private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
		//数据库连接参数
		private static final String URL = "jdbc:mysql://localhost:3306/test2?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
		//数据库用户名
		private static final String USER = "root";
		//数据库登录密码
		private static final String PASSWORD = "123456";
		
		private static Connection conn = null;
		
		//注册驱动,写在静态代码块里,随着类的加载而加载驱动
		static {
			try {
				Class.forName(DRIVER);
			} catch (ClassNotFoundException e) {
				System.out.println("驱动注册失败");
				e.printStackTrace();
			}
		}
		
		/**
		 * 获取数据库连接对象的功能
		 * @return 返回值为该对象
		 * @throws SQLException
		 */
		public static Connection newInstance() throws SQLException {
			//对象已经创建,说明数据库已经连接,不需要再创建连接对象
			if(conn == null){
				conn = DriverManager.getConnection(URL,USER,PASSWORD);
			}
			return conn;
		}
		
		/**
		 * 关闭连接的功能
		 * 参数为需要关闭的三个常用连接对象
		 * @param conn
		 * @param sta
		 * @param rs
		 */
		public static void close(Connection conn,Statement sta,ResultSet rs) {
			try {
				//先判断要关闭的对象是否存在,注意关闭顺序
				if(rs != null) {
				rs.close();
				}
				if(sta != null) {
					sta.close();
				}
				if(conn != null) {
					conn.close();
				}
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		/**
		 * 增删改通用方法
		 * @param sql
		 * 要执行的SQL
		 * @return
		 * 0 代表操作失败 正数代表影响的行数
		 */
		public static int curdMethod(String sql) {
			Statement statement = null;
			try {
				//连接数据库
				newInstance();
				//用于执行sql语句的对象
				statement = conn.createStatement();
				//执行sql语句
				int result = statement.executeUpdate(sql);
				return result;
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				//关闭连接
				close(conn,statement,null);
			}
			//上面的操作失败则返回0
			return 0;
		}
}

测试:

public static void main(String[] args)  {
		int i = DBUtil.curdMethod("insert into student values(9,'王五','1992-02-02','男')");
		System.out.println(i);
}
/*运行结果
1
*/

数据库里student表的变动:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值