JavaJDBC

1.JDBC的概念

Java 数据库连接,( Java Database Connectivity ,简称 JDBC )是 Java 语言 中用来规范客户端程序 如何来访问数据库的 应用程序接口 ,提供了诸如查询和更新数据库中数据的方法。 JDBC 也是 Sun Microsystems的商标。我们通常说的 JDBC 是面向关系型数据库的。各数据库厂商根据JDBC 的规范,实现自身数据库操作的功能代码,然后以 jar 包(数据库厂商提供的驱动包)的形式提供给开发人员使用,开发人员使用反射的机制创建这些具体实现类,按照JDBC 的规范来完成数据库的操作。
接口和 JDBC 规范的理解:

 2.创建数据库

#设置数据的视图---使用数据库

use mydb;

# 判断表存在就删除表
drop table if exists student;
# 创建表
create table student
(
stuId int primary key auto_increment,
stuName varchar ( 20 ),
stuSex varchar ( 2 ),
stuAge int ,
stuAddr varchar ( 50 ) 3 JDBC 的增删改查
);
# 插入测试数据
insert into student(stuName,stuSex,stuAge,stuAddr) values ( ' 张三 ' , ' ' , 20 , ' 河南 ' );
insert into student(stuName,stuSex,stuAge,stuAddr) values ( ' 小美 ' , ' ' , 18 , ' 山东 ' );
insert into student(stuName,stuSex,stuAge,stuAddr) values ( 'Rose' , ' ' , 19 , ' 美国 ' );
insert into student(stuName,stuSex,stuAge,stuAddr) values ( 'Jack' , ' ' , 21 , ' 英国 ' );
# 查询数据表
select * from student;

 3 JDBC的增删改查

3.1 先在 IDEA 中创建实体类:类的名字对应数据库表的名字、类的属
性对应表的字段
public class Student {
// 属性
private int stuId ;
private String stuName ;
private String stuSex ;
private int stuAge ;
private String stuAddr ;
//IDEA 自动构造代码快捷键: alt + insert
...
3.2 JDBC 的查询操作
junit 的用法补充 :junit 可以使方法脱离 main 方法直接执行,方便进行程序测试。
package com . hp . test2 ;
import org . junit . Test ;
public class StudentTest {
/*
junit 用法: 1. 方法要定义为无参无返回值的。且测试类的名字不能是 Test
2. 在方法上使用 @Test 这个注解
3. 光标放在后面,然后使用 alt + 回车 进行自动导包,选择 ---Add 'JUnit4' to
classpath
4. 这个方法就不需要依赖 main 方法就可以直接执行
*/
@Test
public void testSelectAll (){
System . out . println ( "testSelectAll 执行 ..." );
}
}

 JDBC的全查操作

public class StudentTest {
/** * JDBC 连接数据库,需要配置四大参数,同时需要导入数据库对应的驱动包
*/
private String driver = "com.mysql.cj.jdbc.Driver" ;
private String url = "jdbc:mysql://127.0.0.1:3306/mydb?
useSSL=false&serverTimezone=UTC" ;
private String username = "root" ;
private String password = "123" ;
@Test
public void testSelectAll () throws ClassNotFoundException , SQLException {
//JDBC 操作数据库的步骤
//1. 首先在项目根目录创建 lib 文件夹,放入 jdbc 驱动程序,然后 Add As Library
//2. 加载数据库驱动
Class . forName ( driver );
//3. 使用驱动管理器来获得连接 --- 获得一个数据库连接对象 Connection
Connection con = DriverManager . getConnection ( url , username , password ); //
生成方法调用返回值的快捷键: ctrl + alt + v
//4. 使用 Connection 创建 PreparedStatement 预处理对象 ---PreparedStatement 对象可以
执行带 ? sql 语句
String sql = "select * from student" ;
PreparedStatement pstm = con . prepareStatement ( sql );
//5. 使用 PreparedStatement 对象执行 SQL 语句 , 获得 ResultSet 结果集对象
ResultSet rs = pstm . executeQuery ();
//6. 操作判断 -- 增删改返回的是影响的行数(返回值是 int ),只有查询获得结果集 ( 返回值
ResultSet)
// 让结果集的游标不断的往下移动,直到没有数据的时候结束循环
List < Student > studentList = new ArrayList <> (); // 定义集合(大的容器),用来装
Student 对象(小容器)
while ( rs . next ()){
// 根据字段名称获取表中的数据
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" );
// 把以上数据封装到 Student 对象中
Student student = new Student (); // 一行数据就封装成了一个 Student 对象
student . setStuId ( stuId );
student . setStuName ( stuName );
student . setStuSex ( stuSex );
student . setStuAge ( stuAge );
student . setStuAddr ( stuAddr );
// 把当前行封装后的 Student 对象装载到 List 集合中
studentList . add ( student );
}
System . out . println ( studentList );
//7. 回收资源 , 先关闭 rs 结果集对象 再 pstm 预处理对象 最后 con 连接对象
if ( rs != null ){
rs . close ();
}
if ( pstm != null ){
pstm . close ();
} if ( con != null ){
con . close ();
}
}
}
package Test1;

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;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", stuSex='" + stuSex + '\'' +
                ", stuAge=" + stuAge +
                ", stuAddr='" + stuAddr + '\'' +
                '}';
    }
}
package Test2;

import Test1.Student;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class StudentTest {
    /**
     * JDBC连接数据库,需要配置四大参数,同时需要导入数据库对应的驱动包
     */
    private String driver = "com.mysql.cj.jdbc.Driver";
    private String url = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&severTimezone=UTC";
    private String username = "root";
    private String password = "root";

    @Test
    public void testSelectAll() throws ClassNotFoundException, SQLException {
        //JDBC操作数据库的步骤
        //1.首先在项目根目录创建lib文件夹,放入jdbc驱动程序,然后Add As Library
        //2.加载数据库驱动
        Class.forName(driver);
        //3.使用驱动管理器来获得连接---获得一个数据库连接对象Connection
        Connection con = DriverManager.getConnection(url, username, password);
        //4.使用Connection创建PreparedStatement预处理对象---PreparedStatement对象可以
        //执行带 ? 的sql语句
        String sql = "select *from student";
        PreparedStatement pstm = con.prepareStatement(sql);
        //5.使用PreparedStatement对象执行SQL语句,
        // 获得ResultSet结果集对象
        ResultSet rs = pstm.executeQuery();
        //6.操作判断--增删改返回的是影响的行数(返回值是int),只有查询获得结果集(返回值ResultSet)
        //让结果集的游标不断的往下移动,直到没有数据的时候结束循环
        List<Student> studentList = new ArrayList<>();
        while (rs.next()) {
            //根据字段名称获取表中的数据
            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");
            //把以上数据封装到Student对象中
            //一行数据就封装成了一个Student对象
            Student student = new Student();
            student.setStuId(stuId);
            student.setStuName(stuName);
            student.setStuSex(stuSex);
            student.setStuAge(stuAge);
            student.setStuAddr(stuAddr);
            //把当前行封装后的Student对象装载到 List集合中
            studentList.add(student);
        }
        System.out.println(studentList);
        //7.回收资源,先关闭rs结果集对象 再pstm预处理对象
        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);
        //实际开发是前端页面传递过来的数据,此处我们直接模拟一组数据
        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.通过数据库连接对象获取sql预处理对象
        String sql = "delete from student where stuId=?";
        //5.1预处理对象的sql语句有 ? ,所以需要传参
        PreparedStatement pstm = con.prepareStatement(sql);
        int stuId = 3;
        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查询用户的信息
     *
     * @param id :要查询的用户id编号
     * @return :数据库中Exception
     */

    public Student selectById(int id) throws ClassNotFoundException, SQLException {
        //JDBC操作数据库的步骤
        //1.首先在项目根目录创建lib文件夹,放入jdbc驱动程序,然后Add As Library
        //2.加载数据库驱动,使用反射加载
        Class.forName(driver);
        //3.使用驱动管理器来获得连接---获得一个数据库连接对象Connection
        Connection con = DriverManager.getConnection(url, username, password);
        //4.使用Connection创建PreparedStatement预处理对象---PreparedStatement对象可以
        //对sql语句预处理,sql可以带 ?
        String sql = "select * from student where stuId=?";
        PreparedStatement pstm = con.prepareStatement(sql);
        //5.使用PreparedStatement对象执行SQL语句,查询返回的是结果集,增删改返回的是影响的行数(int)
        pstm.setObject(1, id);
        ResultSet rs = pstm.executeQuery();
        //6.操作判断--增删改返回的是影响的行数(返回值是int),只有查询获得结果集(返回值ResultSet)
        //ResultSet结果集的游标默认指向的是表的标题行,需要让游标向下移动指向数据行。
        Student student = null;
        if (rs.next()) {
            //根据字段名称获取字段的值
            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");

            //把以上数据装载到Student对象中
            student = new Student();
            student.setStuId(stuId);
            student.setStuName(stuName);
            student.setStuSex(stuSex);
            student.setStuAge(stuAge);
            student.setStuAddr(stuAddr);

        }
        //7.回收资源
        if (rs != null) {
            rs.close();
        }
        if (pstm != null) {
            pstm.close();
        }
        if (con != null) {
            con.close();
        }

        return student;
    }

    /**
     * 修改操作
     *
     * @throws Exception
     */
    @Test
    public void testUpdate() throws Exception {
        //===========修改的业务逻辑===================
        //第一步:根据id先查询原始数据
        Student student = selectById(4);
        System.out.println("修改前:" + student);
        //第二步:根据需要修改原始数据的字段值 (后期学习是用前端html页面修改数据,然后传输过来新的数据)
        Scanner sc = new Scanner(System.in);
        System.out.println("请修改名字:");
        String newName = sc.next();
        student.setStuName(newName);

        System.out.println("请修改性别:");
        String newSex = sc.next();
        student.setStuSex(newSex);

        System.out.println("请修改年龄:");
        int newAge = sc.nextInt();
        student.setStuAge(newAge);

        System.out.println("请修改地址:");
        String newAddr = sc.next();
        student.setStuSex(newAddr);
        System.out.println("修改后:" + student);

        //第三步:修改字段值后把最新的数据执行数据库JDBC的修改操作
        //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=?";
        //第三步:修改字段值后把最新的数据执行数据库JDBC的修改操作
        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
        String keyword = "小美"; //后期是通过页面获取用户输入的关键词
        pstm.setObject(1, "%" + keyword + "%"); //对关键词进行前后%的拼接
        ResultSet rs = pstm.executeQuery();
        //6.解析结果集,模糊查询有可能查到很多条数据,所以定义集合存储\
        List<Student> studentList = new ArrayList<>();
        while (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"));
            //把当前的student对象存储到list集合中
            studentList.add(student);
        }
           //打印输出
        System.out.println(studentList);
           //7.资源的释放
        if (rs != null) {
            rs.close();
        }
        if (pstm != null) {
            pstm.close();
        }
        if (con != null) {
            con.close();
        }
    }
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值