1.jdbc的概念
JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
JDBC的作用:可以通过java代码操作数据库
2.jdbc的本质
其实就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接!
3.jdbc的快速入门程序
-
导入jar包
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
-
获取执行者对象
Statement stat = conn.createStatement();
-
执行sql语句,并接收返回结果
String sql = "SELECT * FROM user"; ResultSet rs = stat.executeQuery(sql);
-
处理结果
while(rs.next()) { System.out.println(rs.getInt("id") + "\t" + rs.getString("name")); }
-
释放资源
rs.close(); stat.close(); conn.close();
-
创建一个java项目:JDBC基础
-
将jar包导入,并添加到引用类库
-
新建com.lichee01.JDBCDemo01
public class JDBCDemo01 { public static void main(String[] args) throws Exception{ //1.导入jar包 //2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //3.获取连接 (连接的数据库名是db2,第二个第三个参数是连接数据库的用户名密码) Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db2","root","lichee"); //4.获取执行者对象 (statement:表现,声明,跟程序意思不匹配) Statement stat = conn.createStatement(); //5.执行sql语句,并且接收结果 String sql = "SELECT * FROM user"; ResultSet rs = stat.executeQuery(sql); //execute执行,query:查询,resultset:结果集 //6.处理结果 while(rs.next()) { System.out.println(rs.getInt("id") + "\t" + rs.getString("name")); } //7.释放资源 conn.close(); stat.close(); conn.close(); } }
二、JDBC各个功能类详解
1.DriverManager
DriverManager:驱动管理对象注册驱动(告诉程序该使用哪一个数据库驱动)
注册给定的驱动程序:static void registerDriver(Driver driver) (DriverManager的方法)
我们在刚刚的入门案例中并没有注册驱动,也成功了,咋回事呢
这是因为我们使用了Class.forName:Class.forName(“com.mysql.jdbc.Driver”)
我们通过了给forName指定了是mysql的驱动
它会帮助我们注册驱动,如下:
在com.mysql.jdbc.Driver类中存在静态代码块(通过查看源码发现)
//这是com.mysql.jdbc.Driver的静态代码块,只要使用这个类,就会执行这段代码 //而Class.forName("com.mysql.jdbc.Driver")就正好使用到了这个类 static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
注意:我们不需要通过DriverManager调用静态方法registerDriver(),因为只要Driver类被使用,则会执行其静态代码块完成注册驱动
mysql5之后可以省略注册驱动的步骤。在jar包中,存在一个java.sql.Driver配置文件,文件中指定了com.mysql.jdbc.Driver
所以后边我们其实可以省略注册驱动的步骤(可以注释掉上个案例的注册驱动的步骤,也可以查询到数据)
获取数据库连接(获取到数据库的连接并返回连接对象)
static Connection getConnection(String url, String user, String password);
返回值:Connection数据库连接对象
参数
url:指定连接的路径。语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
user:用户名
password:密码
2.Connection
Connection:数据库连接对象
获取执行者对象
获取普通执行者对象:Statement createStatement();
获取预编译执行者对象:PreparedStatement prepareStatement(String sql);
管理事务
开启事务:setAutoCommit(boolean autoCommit); 参数为false,则开启事务。
提交事务:commit();
回滚事务:rollback();
释放资源
立即将数据库连接对象释放:void close();
3.Statement
Statement:执行sql语句的对象
执行DML语句:int executeUpdate(String sql);
返回值int:返回影响的行数。
参数sql:可以执行insert、update、delete语句。
执行DQL语句:ResultSet executeQuery(String sql);
返回值ResultSet:封装查询的结果。
参数sql:可以执行select语句。
释放资源
立即将执行者对象释放:void close();
4.ResultSet
ResultSet:结果集对象
判断结果集中是否还有数据:boolean next();
有数据返回true,并将索引向下移动一行
没有数据返回false
获取结果集中的数据:XXX getXxx(“列名”);
XXX代表数据类型(要获取某列数据,这一列的数据类型)
例如:String getString(“name”); int getInt(“age”);
释放资源
立即将结果集对象释放:void close();
三、JDBC案例student学生表的CRUD
1. 数据准备
数据库和数据表-- 创建student表 CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, -- 学生id NAME VARCHAR(20), -- 学生姓名 age INT, -- 学生年龄 birthday DATE -- 学生生日 ); -- 添加数据 INSERT INTO student VALUES (NULL,'张三',23,'1999-09-23'),(NULL,'李四',24,'1998-08-10'),(NULL,'王五',25,'1996-06-06'),(NULL,'赵六',26,'1994-10-20');
实体类
Student类,成员变量对应表中的列
注意:所有的基本数据类型需要使用包装类,以防null值无法赋值
数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 空指针 风险
新建com.lichee02.domain.Student (保存实体类的包名,可以用bean,也可以用domain)
public class Student { private Integer sid; private String name; private Integer age; private Date birthday; //Constructor //Getter and Setter //toString }
-
本案例会使用分层思想,所以需要新建几个包
-
dao:数据持久层:操作数据库
//定义dao接口:StudentDao //本案例要处理五个功能,所以dao接口中定义五个抽象方法 /* Dao层接口 */ public interface StudentDao { //查询所有学生信息 public abstract ArrayList<Student> findAll(); //条件查询,根据id获取学生信息 public abstract Student findById(Integer id); //新增学生信息 public abstract int insert(Student stu); //修改学生信息 public abstract int update(Student stu); //删除学生信息 public abstract int delete(Integer id); }
service:业务层:处理业务逻辑,调用dao
//定义service接口:StudentService /* Service层接口 */ public interface StudentService { //查询所有学生信息 public abstract ArrayList<Student> findAll(); //条件查询,根据id获取学生信息 public abstract Student findById(Integer id); //新增学生信息 public abstract int insert(Student stu); //修改学生信息 public abstract int update(Student stu); //删除学生信息 public abstract int delete(Integer id); }
controller:控制层,调用业务层方法,将数据返回给前端界面(不过目前我们这个案例没有与界面结合)
//定义控制层类:StudentController,提前准备好对应的测试方法 public class StudentController { /* 查询所有学生信息 */ @Test public void findAll() { } /* 条件查询,根据id查询学生信息 */ @Test public void findById() { } /* 添加学生信息 */ @Test public void insert() { } /* 修改学生信息 */ @Test public void update() { } /* 删除学生信息 */ @Test public void delete() { } }