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. 方法要定义为无参无返回值的。且测试类的名字不能是 Test2. 在方法上使用 @Test 这个注解3. 光标放在后面,然后使用 alt + 回车 进行自动导包,选择 ---Add 'JUnit4' toclasspath4. 这个方法就不需要依赖 main 方法就可以直接执行*/@Testpublic 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" ;@Testpublic void testSelectAll () throws ClassNotFoundException , SQLException {//JDBC 操作数据库的步骤//1. 首先在项目根目录创建 lib 文件夹,放入 jdbc 驱动程序,然后 Add As Library//2. 加载数据库驱动Class . forName ( driver );//3. 使用驱动管理器来获得连接 --- 获得一个数据库连接对象 ConnectionConnection 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(); } } }