上一节我们建好了数据库和Java的实体类,这次我们就来让Java 和 Mysql进行数据通信。
jar包导入方法
:把jar包拖到lib文件夹下,右键项目build path
–configure build path
,然后在下图位置,Add jar
,找到你要加入的jar包,apply and close
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'
在进入下一阶段之前,我们不妨来把代码优化一下,把获得连接的方法和关闭资源的方法封装出来,我们以后可能会做很多次查询,方便代码重用。
我们在这个基础上,再加上增删改的方法
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());
}
}
}