JDBC复习
1.什么是JDBC
概念:ava数据库连接,(lavaDatabaseConnectivity,简称DBC)是lava语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
IDBC也是Sun Microsystems的商标。我们通常说的IDBC是面向关系型数据库的。
各数据库厂商根据DBC的规范,实现自身数据库操作的功能代码,然后以jar包(数据库厂商提供的驱动包)的形式提供给开发人员使用,开发人员使用反射的机制创建这些具体实现类的兑现完成数据库的操作。
1.安装MySQL8.0版本和Navicat
使用phpstuday启动MySQL8.0版本
使用Navicat新建数据库然后新建查询(建表)如下:
2. 使用Navicat创建项目
2.1右击项目新建一个名为lib的Directory文件
复制粘贴jar包到lib中然后作为一个库添加进来
3.导入junit包
junit用法:
1.方法要定义为无参无返回值的。且测试类的名字不能是Test
2.在方法上使用@Test 这个注解
3.光标放在后面,然后使用 alt +enter 进行自动导包,选择---AddJUnit4’to classpath
4.这个方法就不需要依main方法就可以直接执行
JDBC操作数据库的步骤
1.首先在项目根目录创建lib文件夹,放入jdbc驱动程序,然后Add As Library
2.加载数据库驱动
3.使用驱动管理器来获得连接---获得一个数据库连接对象Connection
4.使用Connection创建PreparedStatement语句对象---PreparedStatement对象可以执行sql语句
5.使用PreparedStatement对象执行SQL语句
6.操作判断--增删改返回的是影响的行数(返回值是int),只有查询获得结果集(返回值ResultSet)
7.回收资源
第一个页面:一个Student类
package one;
public class Student {
//属性
private int stuId;
private String stuName;
private String stuSex;
private int stuAge;
private String stuAddr;
//IDEA自动构造代码快捷键:alt + insert
//无参的构造函数
public Student() {
}
//有参的构造函数
public Student(int stuId, String stuName, String stuSex, int stuAge, String stuAddr) {
this.stuId = stuId;
this.stuName = stuName;
this.stuSex = stuSex;
this.stuAge = stuAge;
this.stuAddr = stuAddr;
}
//set和get方法
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public int getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public String getStuAddr() {
return stuAddr;
}
public void setStuAddr(String stuAddr) {
this.stuAddr = stuAddr;
}
//toString方法
@Override
public String toString() {
return "Student{" +
"stuId=" + stuId +
", stuName='" + stuName + '\'' +
", stuSex='" + stuSex + '\'' +
", stuAge=" + stuAge +
", stuAddr='" + stuAddr + '\'' +
'}';
}
}
第二个页面:
JDBC连接数据库,需要配置四大参数,同时需要导入数据库对应的驱动包
查询操作
@Test
public void testSelectAll() throws ClassNotFoundException, SQLException {
//System.out.println("testSelectAll()执行…………");//快捷键sout
//JDBC操作数据库的步骤
//1.首先在项目根目录创建lib文件夹,放入jdbc驱动程序,然后Add As Libray
//2.加载数据库驱动
Class.forName(driver);//alt+enter提示 抛出异常,由该方法的调用者来处理(throws ClassNotFoundException)
//3.使用驱动管理器来获得连接---获得一个数据库连接对象Connection
Connection con = DriverManager.getConnection(url, username, password);//alt+enter提示 抛出异常,由该方法的调用者来处理(throws ClassNotFoundException, SQLException)
//4.使用Connection创建PreparedStatement语句对象---PreparedStatement对象可以执行sql语句
String sql = "select * from student";//查询语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.使用PreparedStatement对象执行SQL语句
ResultSet rs = pstm.executeQuery();
//6.操作判断--增删改返回的是影响的行数(返回值是int),只有查询获得结果集(返回值ResultSet)
//6.1定义集合(大的容器),用来装Student对象(小容器)
List studentList = new ArrayList<>();
//6.2让结果集的游标不断地往下移动,直到没有数据的时候结束循环
while (rs.next()) {
//6.2.1根据字段名称获取表中的数据
int stuId = rs.getInt("stuId");
String stuName = rs.getString("stuName");
String stuSex = rs.getString("stuSex");
int stuAge = rs.getInt("stuAge");
String stuAddr = rs.getString("stuAddr");
//6.2.2把数据封装到Student对象中
Student student = new Student();//一行数据就封装成了一个Student对象
student.setStuId(stuId);
student.setStuName(stuName);
student.setStuSex(stuSex);
student.setStuAge(stuAge);
student.setStuAddr(stuAddr);
//6.2.3把当前行封装后的Student对象装载到List集合中
studentList.add(student);
}
//6.3输出
System.out.println(studentList);
//7.回收资源,先关闭rs结果集对象,再关闭pstm与处理对象,最后关闭con连接对象
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
}
添加操作
@Test
public void testAdd() throws ClassNotFoundException, SQLException {
//1.导入驱动程序包
//2.通过反射加载驱动程序
Class.forName(driver);
//3.通过驱动管理器获得数据库的连接对象
Connection con = DriverManager.getConnection(url, username, password);
//4.通过连接对象,获取sq预处理对象
String sql = "insert into student(stuName,stuSex,stuAge,stuAddr) values (?,?,?,?)";//新增语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.实际开发是前端页面传递过来的数据,此处我们直接模拟一组数据
Student student = new Student();
student.setStuName("李四");
student.setStuSex("男");
student.setStuAge(18);
student.setStuAddr("南阳");
//5.1预处理对象的sql语句有?所以需要进行传参
pstm.setObject(1,student.getStuName());
pstm.setObject(2,student.getStuSex());
pstm.setObject(3,student.getStuAge());
pstm.setObject(4,student.getStuAddr());
//5.2执行更新(增删改查都叫做数据库的更新,更新返回的是影响的行数)
int n = pstm.executeUpdate();
//6.判断影响的行数n>0表示插入成功,否则插入失败
if(n>0){
System.out.println("插入数据成功");
}else{
System.out.println("插入数据失败");
}
//7.释放资源
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
}
删除操作
@Test
public void testDel() throws ClassNotFoundException, SQLException {
//1.导入驱动程序包
//2.通过反射加载驱动程序
Class.forName(driver);
//3.通过驱动管理器获得数据库的连接对象
Connection con = DriverManager.getConnection(url, username, password);
//4.通过连接对象,获取sq预处理对象
String sql = "delete from student where stuId =?";//删除语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.1预处理对象的sql语句有?,所以需要传参
int stuId =3;//实际开发是从前端页面获取要删除的id
pstm.setObject(1,stuId);
//5.2执行更新操作(增删改查都是更新操作,返回的结果是影响的行数)
int n =pstm.executeUpdate();
//6.判断影响的行数n>0表示删除成功,否则删除失败
if(n>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
//7.释放资源
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
}
修改操作
/**
* 修改操作
* 根据id查询学生信息
* id:要查询的学生编号
* 返回的是该id对应的学生信息,封装到Student对象
*/
public Student selectById(int id) throws ClassNotFoundException, SQLException {
Student student = null;
//1.导入驱动程序包
//2.通过反射加载驱动程序
Class.forName(driver);
//3.通过驱动管理器获得数据库的连接对象
Connection con = DriverManager.getConnection(url, username, password);
//4.通过连接对象,获取sq预处理对象----可以对带?的sql语句进行预编译
String sql = "select * from student where stuId =?";//查询语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.如果sql带?需要进行传参,传参完毕执行sql语句
pstm.setObject(1,id);
ResultSet rs = pstm.executeQuery();
//6.结果集的解析---由于根据主键id查询必然只有一条数据
if(rs.next()){
//数据行有数据,实例化Student对象
student = new Student();
//通过rs根据字段名获取数据库表中的数据,然后把数据封装到Student对象中
student.setStuId(rs.getInt("stuId"));
student.setStuName(rs.getString("stuName"));
student.setStuSex(rs.getString("stuSex"));
student.setStuAge(rs.getInt("stuAge"));
student.setStuAddr(rs.getString("stuAddr"));
}
//7.资源的释放
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
return student;
}
@Test
public void testUpdate() throws SQLException, ClassNotFoundException {
//修改的业务逻辑
//第一步:根据id查询学生的信息,然后进行展示
Student student = selectById(2);
System.out.println("修改前的原始数据:"+student);
//第二步:根据需要修改学生的字段值
Scanner scanner = new Scanner(System.in);
System.out.println("请修改名字:");
String newName = scanner.next();
student.setStuName(newName);
System.out.println("请修改性别:");
String newSex = scanner.next();
student.setStuSex(newSex);
System.out.println("请修改年龄:");
int newAge = scanner.nextInt();
student.setStuAge(newAge);
System.out.println("请修改地址:");
String newAddr = scanner.next();
student.setStuAddr(newAddr);
//第三步:把最新的数据执行数据库的更新操作
//1.导入jar包
//2.使用反射加载驱动程序
Class.forName(driver);
//3.使用驱动管理器获得数据库的连接
Connection con = DriverManager.getConnection(url, username, password);
//4.使用连接对象获取sql的预处理对象
String sql = "update student set stuName=?,stuSex=?,stuAge=?,stuAddr=? where stuId=?";//查询语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.传参并执行sql语句
pstm.setObject(1,student.getStuName());
pstm.setObject(2,student.getStuSex());
pstm.setObject(3,student.getStuAge());
pstm.setObject(4,student.getStuAddr());
pstm.setObject(5,student.getStuId());
int n = pstm.executeUpdate();
//6.判断执行结果
if(n>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
//7.资源的释放
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
}
模糊查询
@Test
public void testSeach() throws ClassNotFoundException, SQLException {
//1.导入jar包
//2.加载驱动
Class.forName(driver);
//3.获取数据库连接
Connection con = DriverManager.getConnection(url, username, password);
//4.获取预处理对象
String sql = "select * from student where stuName like ?;";//查询语句
PreparedStatement pstm = con.prepareStatement(sql);
//5.传参并执行sql语句
pstm.setObject(1,"%李%");
ResultSet rs = pstm.executeQuery();
//6.解析结果集,模糊查询有可能查到很多条数据,所以定义集合存储
//6.1定义集合(大的容器),用来装Student对象(小容器)
List studentList = new ArrayList<>();
//6.2让结果集的游标不断地往下移动,直到没有数据的时候结束循环
while (rs.next()) {
//6.2.2把数据封装到Student对象中
Student student = new Student();//一行数据就封装成了一个Student对象
student.setStuId(rs.getInt("stuId"));
student.setStuName(rs.getString("stuName"));
student.setStuSex(rs.getString("stuSex"));
student.setStuAge(rs.getInt("stuAge"));
student.setStuAddr(rs.getString("stuAddr"));
//6.2.3把当前行封装后的Student对象装载到List集合中
studentList.add(student);
}
//6.3打印输出
System.out.println(studentList);
//7.回收资源,先关闭rs结果集对象,再关闭pstm与处理对象,最后关闭con连接对象
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (con != null) {
con.close();
}
}