JDBC连接数据库基础(二)

JDBC连接数据库基础(二)

三、数据库的增删改查

上一节我们建好了数据库和Java的实体类,这次我们就来让Java 和 Mysql进行数据通信。

  • 数据库连接驱动安装
    首先,我们需要一个Java连接数据库的驱动。所谓驱动,就是一堆写好过的代码,打包成.jar文件,就是我们常说的jar包。针对不同的数据库,连接需要的jar包也是不同的,这里给大家提供两款jar包供下载。
    Java连接Mysql数据库的jar包下载 >>>提取码: ager
    Java连接Orcale数据库的jar包下载 >>>提取码: 6kcs

jar包导入方法:把jar包拖到lib文件夹下,右键项目 build pathconfigure build path,然后在下图位置,Add jar,找到你要加入的jar包,apply and close
JDBC连接数据库基础(二)_第1张图片

  • 连接数据库(第一版)
    先复制下面这段代码跑一遍,感受一下。具体加载什么驱动,根据你的mysql版本来修改。
package com.zx.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.zx.domain.Student;

public class MyDAO {
	
	public static void main(String[] args) throws SQLException {
		try {
			//加载连接驱动
			//Mysql数据库加载这个类   mysql8以后的jar包是加载 com.mysql.cj.jdbc.Driver
			Class.forName("com.mysql.jdbc.Driver");
			//Orcale数据库加载这个类 其他部分都差不多
			//Class.forName("oracle.jdbc.driver.OracleDriver");
			
			String url = "jdbc:mysql://localhost:3306/demo";
			String user = "root";
			String password = "root";
			//调用驱动根据url、用户名、密码 创建一个连接
			Connection conn = DriverManager.getConnection(url, user, password);
			//创建一个语句对象
			Statement stmt = conn.createStatement();
			//书写一个sql   根据传入的班级id来动态变化sql语句
			System.out.println("你想查询哪个班级的学生?请输入班级id:");
			Scanner input = new Scanner(System.in);
			int classId = input.nextInt();
			//查询student表中指定班级id的所有数据
			String sql = "select * from student where class_id = " + classId;
			
			//根据sql语句执行查询     使用一个专用的ResultSet集合来接收
			ResultSet rs = stmt.executeQuery(sql);
			
			//创建一个集合,用来存放Student对象,你就当数组理解
			List<Student> list = new ArrayList<Student>();
			
			//遍历这个集合,取出数据   set集合是无序的,需要使用这种方式来遍历。
			//可以理解为有一个头指针,如果下一个位置有值,就继续循环
			//遍历的是表的每一行,每一行包括很多个字段的值,注意要使用相应的数据类型来接收
			while(rs.next()) {
				//创建一个Student 实体类对象,用来把数据库查询到的值存成对象
				Student stu = new Student();
				stu.setId(rs.getInt("id"));
				stu.setName(rs.getString("name"));
				stu.setAge(rs.getInt("age"));
				stu.setClassId(rs.getInt("class_id"));
				//把对象放入集合
				list.add(stu);
			}
			
			//查询完毕,关闭资源 注意关闭的顺序
			rs.close();
			stmt.close();
			conn.close();
			//遍历集合,看看我们的查询结果
			for(Student stu : list) {
				System.out.println("ID"+stu.getId() + ",姓名:"+stu.getName() + ",年龄:" 
						+ stu.getAge() + ",班级ID:" + stu.getClassId());
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

可能运行会报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrec ....
这是mysql时区和我们操作系统时区不一致引起的,我们打开navcat,新建一个查询,使用下面这段指令来修改为东八区:set global time_zone = '+8:00'

成功运行后的结果应该如下:
JDBC连接数据库基础(二)_第2张图片

  • 连接数据库(第二版)

在进入下一阶段之前,我们不妨来把代码优化一下,把获得连接的方法和关闭资源的方法封装出来,我们以后可能会做很多次查询,方便代码重用。
我们在这个基础上,再加上增删改的方法

package com.zx.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.zx.domain.Student;

public class MyDAO {
	public static void main(String[] args) throws SQLException {
			Connection conn = null;
			Statement stmt = null;
			ResultSet rs = null;
			
			String url = "jdbc:mysql://localhost:3306/demo";
			String user = "root";
			String password = "root";
			//调用驱动根据url、用户名、密码 创建一个连接
			conn = getConnection(url, user, password);
			//创建一个语句对象
			stmt = conn.createStatement();
			//书写一个sql   根据传入的班级id来动态变化sql语句
			System.out.println("你想查询哪个班级的学生?请输入班级id:");
			Scanner input = new Scanner(System.in);
			int classId = input.nextInt();
			//查询student表中指定班级id的所有数据
			String sql = "select * from student where class_id = " + classId;
			
			//根据sql语句执行查询     使用一个专用的ResultSet集合来接收
			rs = stmt.executeQuery(sql);
			System.out.println("查询结果:");
			//自定义查询
			myQuery(rs);
			
			//我们再来更新一下数据   我们把   吴亦凡(id 为 1)的年龄改为12
			System.out.println("更新后:");
			stmt.execute("update student set age = 18 where id = 1");
			rs = stmt.executeQuery("select * from student where id = 1");
			myQuery(rs);
			
			//删除吴亦凡
			System.out.println("删除后:");
			stmt.execute("delete from student where id = 1");
			rs = stmt.executeQuery("select * from student where id = 1");
			myQuery(rs);
			
			//增加吴亦凡
			System.out.println("增加后:");
			stmt.execute("insert into student (id,name,age,class_id) values(1,'吴亦凡',22,1)");
			rs = stmt.executeQuery("select * from student where id = 1");
			myQuery(rs);
			//查询完毕,关闭资源 注意关闭的顺序
			closeAll(conn, stmt, rs);
	}
	
	//关闭资源的方法
	public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException {
		if(null != rs) rs.close();
		if(null != stmt) stmt.close();
		if(null != conn) conn.close();
	}
	
	//获得连接的方法
	public static Connection getConnection(String url,String user,String password) throws SQLException {
		//加载连接驱动
		//Mysql数据库加载这个类   mysql8以后的jar包是加载 com.mysql.cj.jdbc.Driver

		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Orcale数据库加载这个类 其他部分都差不多
		//Class.forName("oracle.jdbc.driver.OracleDriver");
		//调用驱动根据url、用户名、密码 创建一个连接
		Connection conn = DriverManager.getConnection(url, user, password);
		return conn;
	}
	
	//自定义打印结果集的方法
	public static void myQuery(ResultSet rs) throws SQLException {
		//创建一个集合,用来存放Student对象,你就当数组理解
		List<Student> list = new ArrayList<Student>();
		//遍历这个集合,取出数据   set集合是无序的,需要使用这种方式来遍历。
		//可以理解为有一个头指针,如果下一个位置有值,就继续循环
		//遍历的是表的每一行,每一行包括很多个字段的值,注意要使用相应的数据类型来接收
		while(rs.next()) {
			//创建一个Student 实体类对象,用来把数据库查询到的值存成对象
			Student stu = new Student();
			stu.setId(rs.getInt("id"));
			stu.setName(rs.getString("name"));
			stu.setAge(rs.getInt("age"));
			stu.setClassId(rs.getInt("class_id"));
			//把对象放入集合
			list.add(stu);
		}
		for(Student stu : list) {
			System.out.println("ID"+stu.getId() + ",姓名:"+stu.getName() + ",年龄:" 
					+ stu.getAge() + ",班级ID:" + stu.getClassId());
		}
	}
}

你可能感兴趣的:(java)