JdbcTemplate
Spring對數據庫的操作在jdbc上面做了深層次的封裝,使用spring的注入功能,可以把DataSource注冊到JdbcTemplate之中。
JdbcTemplate 是在JDBC API基礎上提供了更抽象的封裝,並提供了基於方法注解的事務管理能力。
通過使用SpringBoot自動配置功能並代替我們自動配置beans.
pom.xml添加依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
在application.properties中添加:
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=hongda$123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update
如果不行再添加一部分:
########################################################
### Java Persistence Api
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL # Show or not log for each sql query spring.jpa.show-sql = true # Hibernate ddl auto (create, create-drop, update) spring.jpa.hibernate.ddl-auto = update # Naming strategy spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy # stripped before adding them to the entity manager) spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
除了這種方式添加配置屬性以外,還有application.yml方式
如果使用tomcat-jdbc-{version}.jar,可以自動為我們配置DataSource
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
spring.datasource.schema=xxxx-db.sql 可以定義你的建庫文件 spring.datasource.data=xxxx-data.sql 可以定義你的數據文件 spring.datasource.initialize=true|false 可以決定是不是要初始化這些數據庫文件 spring.datasource.continueOnError=true|false 有了錯誤是否繼續運行
Spring的jdbc是自動配置的,通過@AutoWired來注入到bean中使用
定義數據訪問操作
@Service public class UserServiceImpl implements UserService { @Autowired private JdbcTemplate jdbcTemplate; @Override public void create(String name, Integer age) { jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age); } @Override public void deleteByName(String name) { jdbcTemplate.update("delete from USER where NAME = ?", name); } @Override public Integer getAllUsers() { return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class); } @Override public void deleteAllUsers() { jdbcTemplate.update("delete from USER"); } }
但是這種方式不怎么好用,為了解決大量枯燥的數據操作,引入ORM框架Hibernate
Hibernate中Spring-data-jpa
為了解決抽象各個Java實體基本的“增刪改查”操作,我們通常會以泛型的方式封裝一個模板Dao來進行抽象簡化,但是這樣依然不是很方便,
我們需要針對每個實體編寫一個繼承自泛型模板Dao的接口,再編寫該接口的實現。
雖然一些基礎的數據訪問已經可以得到很好的復用,但是在代碼結構上針對每個實體都會有一堆Dao的接口和實現
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
在application.properties中添加配置
創建實體,通過ORM框架映射到數據庫中
@Entity public class User { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private Integer age; public User(){} public User(String name, Integer age) { this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
創建數據訪問接口:
public interface UserRepository extends JpaRepository<User, Long> { User findByName(String name); User findByNameAndAge(String name, Integer age); @Query("from User u where u.name=:name") User findUser(@Param("name") String name); }
添加測試:
@Autowired private UserRepository userRepository; @Test public void test() throws Exception { // 創建10條記錄 userRepository.save(new User("AAA", 10)); userRepository.save(new User("BBB", 20)); userRepository.save(new User("CCC", 30)); userRepository.save(new User("DDD", 40)); userRepository.save(new User("EEE", 50)); userRepository.save(new User("FFF", 60)); userRepository.save(new User("GGG", 70)); userRepository.save(new User("HHH", 80)); userRepository.save(new User("III", 90)); userRepository.save(new User("JJJ", 100)); Integer num = userRepository.findAll().size(); System.out.println(num); // 測試findAll, 查詢所有記錄 Assert.assertEquals(10, userRepository.findAll().size()); }
編譯運行會發現報錯:

找了很多,發現原來跟上篇的Swagger2中的@Configuration沖突,具體為什么我也不知道,比較才入java這行。
注釋掉@Configuration就可以正常運行
注意,@Entity會自動生成表結構,但是數據庫必須是自己創建,有點類似net的codefirst。
https://github.com/tomlxq/best-practice/tree/master/gs-jdbc
http://blog.didispace.com/springbootdata1/
