初識JDBC,先手寫一個DBHelper工具類
public class DBHelper {
private DBHelper() {
}
private static String url;
private static String name;
private static String pass;
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.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操作
public interface StudentDao {
List<Student> selectWithLimit(int page);
List<Student> selectCount();
List<Student> selectByKey(Map<String, Object> params);
int addStudent(Student student);
int updateStudent(Map<String, Object> params,int id);
int deleteStudent(int id);
}
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;
}
@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;
}
}
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");
}
}
}
@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"));
}
}
public class StudentConsts {
public static final int PAGE_SIZE = 5;
}
- table student
三條靈感
- 把ResultSet寫進Student實體類的構造裏,就不用每次都一個個賦值了;
- sql語句的key = value多個條件判斷,可以通過StringBuilder的動態拼接來完成;
- sql語句的key = value條件判斷,可以通過Map傳參。