簡(jiǎn)介
Spring Data 包含對(duì) JDBC 的存儲(chǔ)庫(kù)支持恶阴,并將自動(dòng)為CrudRepository上的方法生成 SQL。對(duì)于更高級(jí)的查詢豹障,提供了@Query注解冯事。
當(dāng) classpath 上存在必要的依賴項(xiàng)時(shí),Spring Boot 將自動(dòng)配置 Spring Data 的 JDBC 存儲(chǔ)庫(kù)血公。它們可以通過(guò)spring-boot-starter-data-jdbc的單一依賴項(xiàng)添加到項(xiàng)目中昵仅。如有必要,可以通過(guò)將@EnableJdbcRepositories批注或JdbcConfiguration子類添加到應(yīng)用程序來(lái)控制 Spring Data JDBC 的配置累魔。
API
spring-boot-starter-data-jdbc引入了spring-jdbc摔笤,其 JDBC 特性就是基于spring-jdbc。
而spring-jdbc最核心的 API 無(wú)疑就是JdbcTemplate垦写,可以說(shuō)所有的 JDBC 數(shù)據(jù)訪問(wèn)吕世,幾乎都是圍繞著這個(gè)類去工作的。
Spring 對(duì)數(shù)據(jù)庫(kù)的操作在 Jdbc 層面做了深層次的封裝梯澜,利用依賴注入寞冯,把數(shù)據(jù)源配置裝配到JdbcTemplate中,再由JdbcTemplate負(fù)責(zé)具體的數(shù)據(jù)訪問(wèn)晚伙。
JdbcTemplate主要提供以下幾類方法:
execute方法:可以用于執(zhí)行任何 SQL 語(yǔ)句吮龄,一般用于執(zhí)行 DDL 語(yǔ)句;
update方法及batchUpdate方法:update方法用于執(zhí)行新增咆疗、修改漓帚、刪除等語(yǔ)句;batchUpdate方法用于執(zhí)行批處理相關(guān)語(yǔ)句午磁;
query方法及queryForXXX方法:用于執(zhí)行查詢相關(guān)語(yǔ)句尝抖;
call方法:用于執(zhí)行存儲(chǔ)過(guò)程毡们、函數(shù)相關(guān)語(yǔ)句。
為了方便演示昧辽,以下增刪改查操作都圍繞一個(gè)名為 user 的表(該表的主鍵 id 是自增序列)進(jìn)行衙熔,該表的數(shù)據(jù)實(shí)體如下:
public class User {
? ? private Integer id;
? ? private String name;
? ? private Integer age;
? ? // 省略 getter/setter
}
數(shù)據(jù)實(shí)體只要是一個(gè)純粹的 Java Bean 即可,無(wú)需任何注解修飾搅荞。
execute
使用 execute 執(zhí)行 DDL 語(yǔ)句红氯,創(chuàng)建一個(gè)名為 test 的數(shù)據(jù)庫(kù),并在此數(shù)據(jù)庫(kù)下新建一個(gè)名為 user 的表咕痛。
public void recreateTable() {
? ? jdbcTemplate.execute("DROP DATABASE IF EXISTS test");
? ? jdbcTemplate.execute("CREATE DATABASE test");
? ? jdbcTemplate.execute("USE test");
? ? jdbcTemplate.execute("DROP TABLE if EXISTS user");
? ? jdbcTemplate.execute("DROP TABLE if EXISTS user");
? ? // @formatter:off
? ? StringBuilder sb = new StringBuilder();
? ? sb.append("CREATE TABLE user (id int (10) unsigned NOT NULL AUTO_INCREMENT,\n")
? ? ? ? .append("name varchar (64) NOT NULL DEFAULT '',\n")
? ? ? ? .append("age tinyint (3) NOT NULL DEFAULT 0,\n")
? ? ? ? .append("PRIMARY KEY (ID));\n");
? ? // @formatter:on
? ? jdbcTemplate.execute(sb.toString());
}
update
新增數(shù)據(jù)
public void insert(String name, Integer age) {
? ? jdbcTemplate.update("INSERT INTO user(name, age) VALUES(?, ?)", name, age);
}
刪除數(shù)據(jù)
public void delete(String name) {
? ? jdbcTemplate.update("DELETE FROM user WHERE name = ?", name);
}
修改數(shù)據(jù)
public void update(User user) {
? ? jdbcTemplate.update("UPDATE USER SET name=?, age=? WHERE id=?", user.getName(), user.getAge(), user.getId());
}
批處理
public void batchInsert(List<User> users) {
? ? String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
? ? List<Object[]> params = new ArrayList<>();
? ? users.forEach(item -> {
? ? ? ? params.add(new Object[] {item.getName(), item.getAge()});
? ? });
? ? jdbcTemplate.batchUpdate(sql, params);
}
query
查單個(gè)對(duì)象
public User queryByName(String name) {
? ? try {
? ? ? ? return jdbcTemplate
? ? ? ? ? ? .queryForObject("SELECT * FROM user WHERE name = ?", new BeanPropertyRowMapper<>(User.class), name);
? ? } catch (EmptyResultDataAccessException e) {
? ? ? ? return null;
? ? }
}
查多個(gè)對(duì)象
public List<User> list() {
? ? return jdbcTemplate.query("select * from USER", new BeanPropertyRowMapper(User.class));
}
獲取某個(gè)記錄某列或者 count痢甘、avg、sum 等函數(shù)返回唯一值
public Integer count() {
? ? try {
? ? ? ? return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
? ? } catch (EmptyResultDataAccessException e) {
? ? ? ? return null;
? ? }
}
實(shí)戰(zhàn)
配置數(shù)據(jù)源
在src/main/resource目錄下添加application.properties配置文件茉贡,內(nèi)容如下:
spring.datasource.url = jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
需要根據(jù)實(shí)際情況塞栅,替換url、username腔丧、password放椰。
注入 JdbcTemplate
@Service
public class UserDAOImpl implements UserDAO {
? ? private JdbcTemplate jdbcTemplate;
? ? @Autowired
? ? public UserDAOImpl(JdbcTemplate jdbcTemplate) {
? ? ? ? this.jdbcTemplate = jdbcTemplate;
? ? }
? ? // ...
}
歡迎歡迎學(xué)Java的朋友們加入java架構(gòu)交流: 855835163
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)愉粤、高性能及分布式庄敛、Jvm性能調(diào)優(yōu)、Spring源碼科汗,MyBatis藻烤,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰头滔!趁年輕怖亭,使勁拼,給未來(lái)的自己一個(gè)交代坤检!