JAVA12_05学习总结(JDBC!)

今日内容

1. JDBC操作

JDBC操作DDL语句
    1)导包/创建驱动
    2)准备sql语句
    3)获取连接对象
    4)获取执行对象
    5)执行sql语句
    6)释放资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
​
//创建学生表,id,姓名,年龄,性别,住址
public class jdbcTest {
    public static void main(String[] args) throws Exception {
        //导包/创建驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取链接数据库对象
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/szr",
                "root",
                "123456"
        );
        //准备sql语句,注意拼接
        String sql = "create table student(" +
                "id int primary key auto_increment,"+
                "name varchar(10),"+
                "age int,"+
                "gender varchar(3),"+
                "address varchar(20)"+") ;";
        //获取执行对象 -- 获取要执行的数据库对象
        Statement stat = conn.createStatement();
        //执行sql语句
        stat.executeUpdate(sql); // 创建,删除,添加为Update -- 查询为Query
        //释放资源
        stat.close();
        conn.close();
    }
}

2.优化JDBC代码

优化代码
    每次进行操作时都要连接数据库,重复书写七大步骤
        七大步骤中除了准备sql语句之外基本都一样,过于冗余,所以优化代码结构!
            -注册驱动的路径固定
            -连接数据库的路径,用户,密码在个人使用时不变
        所以
            将这些都写入配置文件!
            直接从配置文件调用,不同的数据库直接更改配置文件即可,不用更改代码结构!--符合开闭原则!
    优化
        将重复步骤单独写入方法中,需要的时候直接调用,避免重复书写!
        将需要的内容写入配置文件,直接读取配置文件,不用破坏代码结构!
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
​
//将对于步骤写入对应的工具类,直接调用方法
public class JdbcUtils {
    //将需要从配置文件获取的值先声明出来
    private static String driverclass = null ;//创建驱动:com.mysql.jdbc.Driver
    private static String url = null ;//获取数据库链接对象路径:jdbc:mysql://localhost:3306/数据库名
    private static String user = null ;//用户名
    private static String password = null ;//密码
    //创建静态代码块,当前类初始化的时候就读取配置文件,获取内容,创建驱动!
    static {
        //读取配置文件--利用输入流读取配置文件
        InputStream input = JdbcUtils.class.getClassLoader() //通过class字节码文件获取类加载器
                .getResourceAsStream("jdbc.properties");
        //通过properties方法通过键获取值
        Properties prop = new Properties();
        try {
            prop.load(input); //加载InputStream输入对象
        } catch (IOException e) {
            e.printStackTrace();
        }
        driverclass = prop.getProperty("driverclass");//获取之后赋给对应的内容
        url = prop.getProperty("url");
        user = prop.getProperty("user");
        password = prop.getProperty("password");
        //创建驱动
        try {
            Class.forName(driverclass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获取数据库链接对象
    public static Connection getConnection() throws SQLException {
        Connection conn = DriverManager.getConnection(url,user,password);//参数值从上面获取
        return conn;//返回获取的数据库连接对象
    }
    //释放资源 -- 不需要返回值的添加,删除,修改
    public static void close(Statement stat , Connection conn){
        try {
            stat.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        //书写方式二
        //close(stat,conn); //调用下面的方法,传值的时候ResultSet传空值!
    }
    public static void close(ResultSet result , Statement stat, Connection conn){
        try {
            result.close();
            stat.close();
            conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
​
​
​
import java.sql.*;
​
//测试
public class JdbcUtilsTest {
    public static void main(String[] args) throws SQLException {
        //删除,添加,修改---修改
        //连接数据库,获取对象--直接调用方法
        Connection conn = JdbcUtils.getConnection();//省去前面的步骤,直接调用
        //准备sql语句--不添加id,id自增长!
        String sql = "insert into student(name,age,gender,address) values" +
                "('钟离','30','男','往生堂') , " +
                "('胡桃','18','女','往生堂') , " +
                "('申鹤','25','女','璃月') , " +
                "('优菈','19','女','蒙德') "+";"; //注意拼接!!!
        //获取执行对象
        Statement stat = conn.createStatement();
        stat.executeUpdate(sql);
        //释放资源--调用方法
        JdbcUtils.close(stat,conn);
​
        //查询
        //连接数据库,获取对象
        Connection conn1 = JdbcUtils.getConnection();
        //准备sql语句
        String sql1 = "select * from student ;";
        //获取执行对象
        Statement stat1 = conn1.createStatement();
        ResultSet result = stat1.executeQuery(sql1);//查询返回结果集,有返回值
        //查询成功--后面说怎么遍历值
        System.out.println(result);//com.mysql.jdbc.JDBC4ResultSet@46fbb2c1
    }
}

3. JDBC查询遍历

JDBC查询遍历
    当查询返回到结果集之后
        ResultSet中有方法
        判断
            boolean next()
                --判断结果集中是否有下一条数据
        获取
            getInt(int index)
                --获取输入角标值列的内容
            getString(String str)
                --获取输入列名称的内容
import JDBC.JDBCTest_02.JdbcUtils;
​
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
​
public class JDBCTest {
    public static void main(String[] args) throws SQLException {
        //获取数据库连接对象
        Connection conn = JdbcUtils.getConnection();
        //准备sql语句
        String sql = "select * from student ;";
        //获取执行对象
        Statement stat = conn.createStatement();
        //执行语句并返回结果集
        ResultSet result = stat.executeQuery(sql);
        //while循环
        while (result.next()){ //next()为判断条件
            //获取输入角标值的内容
            int id = result.getInt(1);
            String name = result.getString(2);
            int age = result.getInt(3);
            String gender = result.getString(4);
            String address = result.getString("address");
            System.out.println(id+" "+name+" "+age+" "+gender+" "+address);
            /*
                1 钟离 30 男 往生堂
                2 胡桃 18 女 往生堂
                3 申鹤 25 女 璃月
                4 优菈 19 女 蒙德
             */
        }
    }
}

4.单元测试

单元测试
    main方法是全局测试,只要有一个地方不对,都运行不了
        所以
            单元测试,只测试我们想要测试的地方!
        1)导包junit的核心包以及依赖包
        2)提供单元测试方法
            定义一个功能,没有返回值,没有参数,在方法上定义
                @Test标记,它是一个单元测试方法
        3)@Before
            标记的方法是在单元测试方法之前先执行
                比如说
                    初始化的操作
        4)@After
            标记的方法是在用单元测试执行之后执行
                比如说
                    释放资源

你可能感兴趣的:(Java学习--二阶段,数据库,sql,java,学习)