在一部分內(nèi)容中,我們學(xué)習(xí)了Restful接口的編寫蔑滓,及接口文檔的生成郊酒。我們需要將接口數(shù)據(jù)進行持久化存儲遇绞,這一部分我們主要學(xué)習(xí)幾種持久化框架將數(shù)據(jù)進行存儲。本部分內(nèi)容中燎窘,我們都將使用mysql為例來做為演示數(shù)據(jù)庫摹闽。
在剛開始接觸數(shù)據(jù)庫操作的時候我們都會使用JDBC來進行數(shù)據(jù)庫操作,但是每次都要創(chuàng)建連接褐健,關(guān)閉連接非常麻煩付鹿,Spring將JDBC進行了簡易的封裝成了一個新的框架——JdbcTemplate。
項目搭建
1 添加mysql依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
2. 添加jdbcTemplate依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
3. 配置mysql
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/simple_fast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&useAffectedRows=true&allowPublicKeyRetrieval=true
username: root
password: root
簡單操作數(shù)據(jù)庫
新建一張表student
用來測試JdbcTemplate的常用功能蚜迅。建表語句如下:
CREATE TABLE `student` (
`student_id` int(30) NOT NULL,
`age` int(1) DEFAULT NULL COMMENT '年齡',
`name` varchar(45) DEFAULT NULL COMMENT '姓名',
`sex` int(1) DEFAULT NULL COMMENT '性別:1:男舵匾,2:女,0:未知',
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
`status` int(1) DEFAULT NULL COMMENT '狀態(tài):1:正常谁不,-1:刪除',
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='學(xué)生表'
對應(yīng)的實體類如下:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentBean implements Serializable {
private static final long serialVersionUID = 4618004018169112427L;
private Integer studentId;
private Integer age;
private String name;
private Integer sex;
private Date createTime;
private Integer status;
}
JdbcTemplate提供了比較完善的數(shù)據(jù)庫操作API坐梯,日常開發(fā)中比較常用的API主要為兩類,分別是
- query與queryXXX
- update與batchUpdate
JdbcTemplate的使用也非常簡單刹帕,哪兒需要使用注入即可
@Autowired
private JdbcTemplate jdbcTemplate;
1 查詢單個實體
public StudentBean getStudent(int status){
String sql = "select * from student where status = ? limit 1";
return jdbcTemplate.queryForObject(sql,new Object[]{status},new BeanPropertyRowMapper<>(StudentBean.class));
}
2 查詢List集合
public List<StudentBean> studentBeanList(int status){
String sql = "select * from student where status = ?";
return jdbcTemplate.query(sql,new Object[]{status},new BeanPropertyRowMapper<>(StudentBean.class));
}
3. 刪除操作
public int deleteStudent(int status){
String sql = "delete from student where status = 0";
return jdbcTemplate.update(sql);
}
4. 更新操作
public int updateStudent(int studentId,String name){
String sql = "update student set name = ? where student_id = ?";
return jdbcTemplate.update(sql,new Object[]{name,studentId});
}
5. 插入操作
public int addStudent(){
String sql = "insert into student(student_id,age,name,status) values(?,?,?,?)";
return jdbcTemplate.update(sql,new Object[]{30,18,"Java旅途",0});
}
6. 批量插入
JdbcTemplate提供了批量插入的API吵血,為了減少與數(shù)據(jù)庫的操作,提高插入效率偷溺,將待插入的數(shù)據(jù)批量放在緩沖區(qū)蹋辅,一次批量插入多條數(shù)據(jù)。
public int batchAddStudent(){
// 構(gòu)造list集合
List<StudentBean> studentBeanList = new ArrayList<>();
StudentBean studentBean = new StudentBean(31, 31, "Java旅途", 1, new Date(), 1);
StudentBean studentBean1 = new StudentBean(32, 32, "javatrip", 1, new Date(), 1);
studentBeanList.add(studentBean);
studentBeanList.add(studentBean1);
String sql = "insert into student values(?,?,?,?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
StudentBean student = studentBeanList.get(i);
ps.setInt(1, student.getStudentId());
ps.setInt(2, student.getAge());
ps.setString(3, student.getName());
ps.setInt(4, student.getSex());
ps.setDate(5,new java.sql.Date(System.currentTimeMillis()));
ps.setInt(6, student.getStatus());
}
@Override
public int getBatchSize() {
return studentBeanList.size();
}
});
return ints.length;
}
上面只是演示了幾個簡單的例子挫掏,如果需要更詳細的用法可以參考官方提供的JdbcTemplate API侦另。JdbcTemplate對于初學(xué)者來說是比較容易上手的一個框架,使用起來也非常方便。但是也存在一些缺點褒傅,它是將sql硬編碼到j(luò)ava代碼中硫麻,如果需要修改sql,就需要重新編譯java代碼樊卓,不利于維護拿愧。
此是spring-boot-route系列的第七篇文章,這個系列的文章都比較簡單碌尔,主要目的就是為了幫助初次接觸Spring Boot 的同學(xué)有一個系統(tǒng)的認(rèn)識浇辜。本文已收錄至我的github,歡迎各位小伙伴star
唾戚!
github:https://github.com/binzh303/spring-boot-route
點關(guān)注柳洋、不迷路
如果覺得文章不錯,歡迎關(guān)注叹坦、點贊熊镣、收藏,你們的支持是我創(chuàng)作的動力募书,感謝大家绪囱。
如果文章寫的有問題,請不要吝嗇莹捡,歡迎留言指出鬼吵,我會及時核查修改。
如果你還想更加深入的了解我篮赢,可以微信搜索「Java旅途」進行關(guān)注齿椅。回復(fù)「1024」即可獲得學(xué)習(xí)視頻及精美電子書启泣。每天7:30準(zhǔn)時推送技術(shù)文章涣脚,讓你的上班路不在孤獨,而且每月還有送書活動寥茫,助你提升硬實力遣蚀!