一、JDBC入门

1.jdbc的概念
JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。
JDBC的作用:可以通过java代码操作数据库
2.jdbc的本质
其实就是java官方提供的一套规范(接口)。用于帮助开发人员快速实现不同关系型数据库的连接!
3.jdbc的快速入门程序

  1. 导入jar包

  2. 注册驱动

    Class.forName("com.mysql.jdbc.Driver");
  3. 获取连接
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
    

  4. 获取执行者对象

    Statement stat = conn.createStatement();

  5. 执行sql语句,并接收返回结果

    String sql = "SELECT * FROM user";
    ResultSet rs = stat.executeQuery(sql);
  6. 处理结果

    while(rs.next()) {
        System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
    }
  7. 释放资源

    rs.close();
    stat.close();
    conn.close();

  8. 创建一个java项目:JDBC基础

  9. 将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() {
            
        }
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值