第三十六天

一.JDBC原生7大操作步骤涉及到的Api

//1)导包---导入msyql驱动包 2)注册驱动--->

Class.forName("com.mysql.jdbc.Driver") ; //为了向后兼容 ---在加载类

本身注册驱动需要用到java.sql.DriverManager:驱动管理类(管理诸如JDBC的服务) 提供静态功能: 1)注册驱动public static void registerDriver(Driver driver) throws SQLException 参数为:java.sql.Drvier---->需要接口的实现类---驱动jar包里面com.mysql.jdbc.Drvier

如果上面的写法使用    DriverManager.registerDriver(new com.mysql.jdbc.Driver());这种方式,会多注册一遍
com.mysql.jdbc.Driver的原码里面
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        public Driver() throws SQLException {
        }
​
        static {  //静态代码块
            try {
                DriverManager.registerDriver(new Driver());  //注册驱动了
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    }
​
    获取数据库的连接对象,返回值 java.sql.Connection
   2)public static Connection getConnection(String url,
                                            String user,
                                            String password)
                                     throws SQLException
​
        url: 协议://域名:端口/库名   (统一资源定位符号)
           jdbc:mysql://localhost:3306/库名
        user:mysql的用户名: root用户
        password:密码

java.sql.Connection:与特定数据库连接会话 接口

     Statement createStatement() throws SQLException; 获取执行对象
​
            返回返回的数据库执行对象--->里面创建具体子实现类对象
            public class StatementImpl implements Statement

java.sql.Statement:用于执行静态SQL语句并返回其生成的结果的对象。 静态sql语句: 弊端 1)硬编码 2)存在sql字符串拼接

         String sql = "update account set balance = balance + 500 where id =1 " ;
​
        两种通用操作
​
            针对DDL语句(针对表/库相关的操作),DML语句的insert ,update,delete   更新操作
            public int executeUpdate(String sql)
​
            针对DQL语句:数据库查询语句 ,返回表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
            ResultSet executeQuery(String sql) throws SQLException

java.sql.ResultSet 据库结果集的数据表 boolean next():是否下一个结果集

优化版JDBC连接数据库

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
​
/**
 * @author 高圆圆
 * @date 2022/12/5 10:27
 *
 * 提供这样一个工具类,构造方法私有,目的就是为了让外界不能new对象
 *  封装哪些
 *
 *          1)每一次书写7大步骤,都需要去获取数据库的连接对象,需要优化
 *          2)每一次都要释放资源的代码,也需要优化
 */
public class Jdbc {
​
    //成员变量声明三个变量
    private static String url = null ;
    private static String user = null ;
    private static String password = null ;
    private static String driverClass = null ;
​
    //模拟 驱动jar包---Driver驱动类---提供静态代码块
    static{
        try {
            //想办法获取这些参数---->提供配置文件  后缀名.properties---->放在src下面
            //1)读取配置文件内容
            InputStream inputStream = Jdbc.class.getClassLoader()
                    .getResourceAsStream("jdbc.properties");
            //2)创建一个属性集合列表Properties
            Properties prop = new Properties() ;
            //System.out.println(prop) ;//测试 ---肯定空列表
            //3)将1)获取资源文件的输入流对象---加载到属性集合列表中
            prop.load(inputStream);
            // System.out.println(prop) ; //测试--->有属性列表内容
            //4)通过key获取value
            driverClass = prop.getProperty("driverClass");
            url = prop.getProperty("url") ;
            user = prop.getProperty("user") ;
            password = prop.getProperty("password") ;
            //5)加载驱动类
            Class.forName(driverClass) ;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
​
​
​
    private  Jdbc(){}
​
​
    /**
     * 这个方法,获取数据库的连接对象
     * @return
     */
    public static Connection getConnection(){
​
        try {
            //需要驱动管理DriverManager获取连接对象
            Connection connection = DriverManager.getConnection(url, user, password);//获取这三个参数的内容
            return connection ;
​
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  null ;
    }
​
    /**
     * 释放资源,针对DDL语句,DML语句
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt,Connection conn){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
​
    public static void main(String[] args) {
​
        Connection connection = Jdbc.getConnection();
        System.out.println(connection);
    }
}

jdbc.properties文件(以后只需改这里的配置)

url:jdbc:mysql://localhost:3306/myee_2211
user:root
password:123456
driverClass:JDBC_Demo.Jdbc

二.JDBC执行DQL语句

import com.qf.jdbc_utils_02.JdbcUtils;

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

/**

  • @author 高圆圆

  • @date 2022/12/5 11:45

  • 使用Statement执行DQL语句操作 */ public class StatementExecuteDQL {

    public static void main(String[] args) throws Exception { //1)直接获取连接对象 Connection conn = JdbcUtils.getConnection(); //2)准备sql语句 String sql = "select * from student" ; //3)获取执行对象 Statement stmt = conn.createStatement(); //4)执行sql ResultSet rs = stmt.executeQuery(sql);

    System.out.println("学生的信息如下:");
    //第一次获取
    //ResultSet--->boolean next() :判断结果集中是否下一条数据

    /* if(rs.next()){ //true //通过列的索引值获取 xxx getXXX(int columneIndex) int id = rs.getInt(1);//第一例 String name = rs.getString(2);//第二列 int age = rs.getInt(3);//第三列 String gender = rs.getString(4);//第四列 String address = rs.getString(5);//第五列 System.out.println(id+"\t"+name+"\t"+gender+"\t"+address);

    }
    ​
    //第二次获取
    if(rs.next()){
        //true
        //通过列的名称获取  xxx getXXX(String columneLaber)
        int id = rs.getInt("id");//第一例的名称
        String name = rs.getString("name");//第二列名称
        int age = rs.getInt("age");//第三列名称
        String gender = rs.getString("gender");//第四列名称
        String address = rs.getString("address");//第五列名称
        System.out.println(id+"\t"+name+"\t"+gender+"\t"+address);
    ​
    }
    ​
    //第三次获取
    if(rs.next()){
        //true
        //通过列的名称获取  xxx getXXX(String columneLaber)
        int id = rs.getInt("id");//第一例的名称
        String name = rs.getString("name");//第二列名称
        int age = rs.getInt("age");//第三列名称
        String gender = rs.getString("gender");//第四列名称
        String address = rs.getString("address");//第五列名称
        System.out.println(id+"\t"+name+"\t"+gender+"\t"+address);
    ​
    }*/
    while(rs.next()){
        //通过列的名称获取  xxx getXXX(String columneLaber)
        int id = rs.getInt("id");//第一例的名称
        String name = rs.getString("name");//第二列名称
        int age = rs.getInt("age");//第三列名称
        String gender = rs.getString("gender");//第四列名称
        String address = rs.getString("address");//第五列名称
        System.out.println(id+" "+name+" "+gender+" "+address);
    }

    //释放
    JdbcUtils.close(rs,stmt,conn);
}

}

三.JDBC:DDL语句,DML语句---都能直接操作

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;

/**

  • @author 高圆圆

  • @date 2022/12/5 10:02

  • JDBC操作DDL语句--->创建一个学生表

  • id,name,gender,age,address */ public class JDBCDemo2 { public static void main(String[] args) {

    Connection conn = null ;
    Statement stmt = null ;
    try {
        //1)导包/注册驱动
        Class.forName("com.mysql.jdbc.Driver") ;
        //2)准备sql
        String sql  = "create table student(" +
                " id int primary key auto_increment," +
                " name varchar(10), " +
                " age int ," +
                " gender varchar(3), " +
                " address varchar(50) " +
                ") ;" ;
        //3)获取连接对象
        conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ee_2211_02",
                "root",
                "123456"
        ) ;
        //4)获取执行对象
       stmt = conn.createStatement() ;
       //5)执行
        int count = stmt.executeUpdate(sql);
        System.out.println(count);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    ​
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    } }

四.JDBC 练习---->学生表(n条数据)

查询全表数据--->将最终的结果封装List<Student>,学生类有姓名,年龄....信息,每一次查询一条,封装到Student类中,将全部数据封装到List集合中,遍历List集合,获取到学生信息!

包的命名:公司域名反写 com.qf.pojo/entity/domain---->实体类--->描述事物的属性和行为.. com.qf.service ---->业务服务层 ----->针对业务的接口 com.qf.service.impl----->针对业务的接口实现-------------------->以后开发中----大量的if.else...

   com.qf.dao   ----->DAO Data Access Object--->数据访问对象 ------>数据访问接口
            XxxDao
   com.qf.dao.impl
                       数据访问接口的实现------>JDBC代码
   com.qf.test----->单元测试的

五.提供一个UserDao接口

import com.qf.dao.StudentDao; import com.qf.pojo.Student; import com.qf.utils.JdbcUtils;

import javax.swing.plaf.nimbus.State; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List;

/**

  • @author 高圆圆

  • @date 2022/12/5 14:41

  • 针对学生数据访问接口的实现 */ public class StudentDaoImpl implements StudentDao { /**

    • 添加学生实体

    • @param student 学生对象 */ @Override public void add(Student student) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "insert into student(name,age,gender,address) values('"+student.getName()+"','" +student.getAge()+"','"+student.getGender()+"','"+student.getAddress()+"')" ; //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); }

    /**

    • 通过学生数据修改学生数据

    • @param student 学生对象

    • @return 影响的行数 */ @Override public int updateStudent(Student student) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "update student set name ='"+student.getName()+"' ,address ='"+ student.getAddress()+"' where id = '"+student.getId()+"'"; System.out.println(sql); //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); return count; }

    /**

    • 根据学生编号删除学生

    • @param id 学生id */ @Override public void deleteStudentById(int id) throws SQLException { //获取数据库连接对象 Connection conn = JdbcUtils.getConnection(); //sql String sql = "delete from student where id = '"+id+"'" ; System.out.println(sql); //获取执行对象 Statement stmt = conn.createStatement() ; //执行更新 int count = stmt.executeUpdate(sql); System.out.println(count) ; JdbcUtils.close(stmt,conn); }

/**
 * 查询所有学生的功能
 * @return 学生列表
 */
@Override
public List<Student> findAllStudent() throws SQLException {
    List<Student> list = new ArrayList<>() ;
    Connection conn = JdbcUtils.getConnection();
    //sql
    String sql = "select * from student" ;
    Statement stmt = conn.createStatement() ;
    //查询结果集
    ResultSet rs = stmt.executeQuery(sql) ;
    //声明学生变量
    Student s = null ;
    while(rs.next()){
        s = new Student() ;
        s.setId(rs.getInt(1)) ;
        s.setName(rs.getString(2));
        s.setAge(rs.getInt(3));
        s.setGender(rs.getString(4));
        s.setAddress(rs.getString(5));
        //添加集合中
        list.add(s) ;
    }
​
    return list;
}
/**
 * 通过学生id获取学生实体
 * @param id 学生编号
 * @return 返回学生实体
 */
@Override
public Student findStudentById(int id) throws SQLException {
    Connection conn = JdbcUtils.getConnection();
     //sql
    String sql = "select * from student where id = '"+id+"'" ;  //id唯一
    //获取执行对象
    Statement stmt = conn.createStatement() ;
    ResultSet rs = stmt.executeQuery(sql);
    Student s = null ;
    if(rs.next()){
​
        //封装学生对象
        s = new Student() ;
        s.setId(rs.getInt("id"));
        s.setName(rs.getString("name"));
        s.setAge(rs.getInt("age"));
        s.setGender(rs.getString("gender"));
        s.setAddress(rs.getString("address"));
    }
​
    return s;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值