13、JDBC

初識JDBC,先手寫一個DBHelper工具類

public class DBHelper {
    private DBHelper() {
    }

    private static String url;
    private static String name;
    private static String pass;
    //ThreadLocal<T> 對每個線程都創建一個唯一的不可變的參數化類型的副本(對象)
    private static final ThreadLocal<Connection> CONNECTION_THREAD_LOCAL = new ThreadLocal<>();

    static {
        Properties properties = new Properties();
        try {
            properties.load(DBHelper.class.getClassLoader().getResourceAsStream("jdbc.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        url = properties.getProperty("jdbc.url");
        name = properties.getProperty("jdbc.name");
        pass = properties.getProperty("jdbc.pass");
        // 加載驅動
        try {
            Class.forName(properties.getProperty("jdbc.driver"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    public static Connection getConnection() {
        Connection connection = CONNECTION_THREAD_LOCAL.get();
        //獲取連接
        try {
            if (connection == null || connection.isClosed()) {
                connection = DriverManager.getConnection(url, name, pass);
                CONNECTION_THREAD_LOCAL.set(connection);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static void closeConnection(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
        try {
            if (resultSet != null) resultSet.close();
            if (preparedStatement != null) preparedStatement.close();
            if (connection != null) {
                connection.close();
                CONNECTION_THREAD_LOCAL.remove();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  • jdbc.properties
jdbc.url = jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF8&useSSL=true
jdbc.name = root
jdbc.pass = root
jdbc.driver = com.mysql.jdbc.Driver

JDBC的CRUD操作

  • dao.StudentDao
public interface StudentDao {

    /**
     * 分頁查詢學生信息
     *
     * @param page 頁碼
     * @return 查詢到的學生信息集合
     */
    List<Student> selectWithLimit(int page);

    /**
     * 查詢全表信息
     * @return 所有信息
     */
    List<Student> selectCount();

    /**
     * 單個字段查詢學生信息
     * @param params map集合,key表格的列頭,value爲是要查詢的信息
     * @return  查詢到的學生信息集合
     */
    List<Student> selectByKey(Map<String, Object> params);

    /**
     * 添加學生信息
     * @param student  要添加的學生信息
     * @return 受影響的行數,判斷是否添加成功
     */
    int addStudent(Student student);

    /**
     * 修改學生信息
     * @param params 要修改學生的信息字段
     * @param id  要修改學生的id
     * @return 受影響的行數,判斷是否添加成功
     */
    int updateStudent(Map<String, Object> params,int id);

    /**
     * 刪除學生信息
     * @param id  要刪除學生的id
     * @return  受影響的行數,判斷是否添加成功
     */
    int deleteStudent(int id);

}
  • dao.StudentDaoImpl
public class StudentDaoImpl implements StudentDao {
    private Connection connection;
    private PreparedStatement ps;
    private ResultSet rs;
    private String sql;
    private int result;

    @Override
    public List<Student> selectWithLimit(int page) {
        Objects.requireNonNull(page);
        if (page < 1) {
            page = 1;
        }
        int pageNom = selectCount().size() / StudentConsts.PAGE_SIZE + 1;
        if (page > pageNom) {
            page = pageNom;
        }

        connection = DBHelper.getConnection();
        sql = "select * from student limit ?,?";
        List<Student> StudentList = new ArrayList<>();
        try {
            ps = connection.prepareStatement(sql);
            ps.setInt(1, ((page - 1) * StudentConsts.PAGE_SIZE));
            ps.setInt(2, StudentConsts.PAGE_SIZE);
            rs = ps.executeQuery();

            while (rs.next()) {
                StudentList.add(new Student(rs));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return StudentList;
    }

    @Override
    public List<Student> selectCount() {
        List<Student> list = new ArrayList<>();
        connection = DBHelper.getConnection();
        sql = "select * from student";
        try {
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()) {
                list.add(new Student(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return list;
    }

    @Override
    public List<Student> selectByKey(Map<String, Object> params) {
        List<Student> list = new ArrayList<>();
        connection = DBHelper.getConnection();
        sql = "SELECT * FROM student WHERE ";
        StringBuilder builder = new StringBuilder(sql);
        try {
            params.forEach((k, v) -> {
                if ("stu_name".equals(k)) {
                    builder.append(k);
                    builder.append(" like '%");
                    builder.append(v + "%'");
                } else {
                    builder.append(k);
                    builder.append(" = '");
                    builder.append(v + "'");
                }
            });
            System.out.println(builder.toString());
            ps = connection.prepareStatement(builder.toString());
            rs = ps.executeQuery();
            while (rs.next()) {
                list.add(new Student(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return list;
    }

    @Override
    public int addStudent(Student student) {
        connection = DBHelper.getConnection();
        sql = "INSERT INTO student(stu_name,stu_sex,stu_age,stu_address,stu_phone) VALUES(?,?,?,?,?)";
        try {
            ps = connection.prepareStatement(sql);
            ps.setString(1, student.getStu_name());
            ps.setString(2, student.getStu_sex());
            ps.setInt(3, student.getStu_age());
            ps.setString(4, student.getStu_address());
            ps.setString(5, student.getStu_phone());
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return result;
    }

    @Override
    public int updateStudent(Map<String, Object> params, int id) {
        connection = DBHelper.getConnection();
        sql = "UPDATE student SET ";
        StringBuilder builder = new StringBuilder(sql);
        params.forEach((k, v) -> builder.append(k + " = '" + v + "',"));
        builder.deleteCharAt(builder.lastIndexOf(","));
        builder.append(" WHERE id =" + id);
        System.out.println(builder.toString());
        try {
            ps = connection.prepareStatement(builder.toString());
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return result;
    }

    /**
     * 刪除學生信息
     *
     * @param id 要刪除學生的id
     * @return 受影響的行數,判斷是否添加成功
     */
    @Override
    public int deleteStudent(int id) {
        connection = DBHelper.getConnection();
        sql = "DELETE FROM student WHERE id = ?";
        try {
            ps = connection.prepareStatement(sql);
            ps.setInt(1, id);
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBHelper.closeConnection(connection, ps, rs);
        }
        return result;
    }
}
  • test.StudentTest
public class StudentTest {
    StudentDao studentDao = new StudentDaoImpl();

    @Test
    public void selectWithLimit() {
        List<Student> students = studentDao.selectWithLimit(6);
        students.forEach((student) -> System.out.println(student));
    }

    @Test
    public void selectByKey() {
        Map<String, Object> map = new HashMap<>();
        map.put("stu_name", "王");
        List<Student> students = studentDao.selectByKey(map);
        students.forEach(student -> System.out.println(student));
    }

    @Test
    public void addStudent() {
        Student student = new Student(null, "jim", "男", 18, null, null);
        int result = studentDao.addStudent(student);
        if (result >= 1) {
            System.out.println("success");
        } else {
            System.out.println("error");
        }

    }

    @Test
    public void updateStudent() {
        Scanner sc = new Scanner(System.in);
        // 先遍歷表格內容
        List<Student> students = studentDao.selectCount();
        students.forEach(student -> System.out.println(student));
        Map<String, Object> map = new HashMap<>();

        System.out.print("請選擇要修改的學生id:");
        int updateId = sc.nextInt();
        String answer = null;
        do {
            System.out.print("請輸入要修改的字段:");
            String key = sc.next();
            System.out.print("要修改內容爲:");
            String value = sc.next();
            map.put(key, value);
            System.out.print("是否要繼續修改(y/n):");
            answer = sc.next();
        } while ("y".equals(answer));
        int result = studentDao.updateStudent(map, updateId);
        if (result >= 1) {
            System.out.println("success");
        } else {
            System.out.println("error");
        }
    }

    @Test
    public void deleteStudent() {
        Scanner sc = new Scanner(System.in);
        // 先遍歷表格內容
        List<Student> students = studentDao.selectCount();
        students.forEach(student -> System.out.println(student));

        System.out.print("請選擇要刪除的學生id:");
        int deleteId = sc.nextInt();
        int result = studentDao.deleteStudent(deleteId);
        if (result >= 1) {
            System.out.println("success");
        } else {
            System.out.println("error");
        }
    }
}
  • bean.Student
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Integer id;
    private String stu_name;
    private String stu_sex;
    private Integer stu_age;
    private String stu_address;
    private String stu_phone;

    public Student(ResultSet rs) throws SQLException {
        this.setId(rs.getInt("id"));
        this.setStu_name(rs.getString("stu_name"));
        this.setStu_sex(rs.getString("stu_sex"));
        this.setStu_age(rs.getInt("stu_age"));
        this.setStu_address(rs.getString("stu_address"));
        this.setStu_phone(rs.getString("stu_phone"));
    }
}
  • consts.StudentConsts
public class StudentConsts {
    public static final int PAGE_SIZE = 5;
}
  • table student
    在這裏插入圖片描述

三條靈感

  • 把ResultSet寫進Student實體類的構造裏,就不用每次都一個個賦值了;
  • sql語句的key = value多個條件判斷,可以通過StringBuilder的動態拼接來完成;
  • sql語句的key = value條件判斷,可以通過Map傳參。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章