Spring Boot 3 Hibernate


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM