五、spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate

来源:http://www.cnblogs.com/hdwang/archive/2017/06/17/7041010.html
-Advertisement-
Play Games

1.pom添加依賴 2.添加數據源配置(DataSource啥的,一系列對象spring boot 都會給你註入的,配置配置即可!) 3.新建實體 4.dao層 5.service層 6.controller層 7. spring data jpa新使用方式,更高級 8.註入jdbcTemplate ...


1.pom添加依賴

       <!-- spring data jpa,會註入tomcat jdbc pool/hibernate等 -->
     <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.42</version> </dependency>

 

2.添加數據源配置(DataSource啥的,一系列對象spring boot 都會給你註入的,配置配置即可!)

spring.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#database  pool config
# Number of ms to wait before throwing an exception if no connection is available.
spring.datasource.tomcat.max-wait=10000
# Maximum number of active connections that can be allocated from this pool at the same time.
spring.datasource.tomcat.max-active=300
# Validate the connection before borrowing it from the pool.
spring.datasource.tomcat.test-on-borrow=true
# initial pool size
spring.datasource.tomcat.initial-size=20

#=====================jpa config================================
#實體類維護資料庫表結構的具體行為:update/create/create-drop/validate/none
spring.jpa.hibernate.ddl-auto=none
#列印sql語句
spring.jpa.show-sql=true
#格式化輸出的json字元串
spring.jackson.serialization.indent_output=true

 

3.新建實體

@Entity
@Table(name="user")
public class User {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name="number")
    private String number;

    @Column(name="name")
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

4.dao層

public interface UserDao{

    User getById(int id);

    User getByNumber(String number);

    int addUser(User user);

    void deleteUserById(int id);

    User updateUser(User user);

}

 

@Repository
public class UserDaoImpl implements UserDao {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public User getById(int id) {
        //find by primary key
        return this.entityManager.find(User.class,id);
    }

    @Override
    public User getByNumber(String number) {
        Query query = this.entityManager.createQuery("from User u where u.number=:number",User.class);
        query.setParameter("number",number);
        User user = (User)query.getSingleResult();
        return user;
    }

    @Override
    public int addUser(User user) {
        this.entityManager.persist(user);
        //print the id
        System.out.println(user.getId());
        return user.getId();
    }

    @Override
    public void deleteUserById(int id) {
        User user = this.entityManager.find(User.class,id); //關聯到記錄,方可刪除
        this.entityManager.remove(user);
    }

    @Override
    public User updateUser(User user) {
        User userNew = this.entityManager.merge(user);
        return userNew;
    }
}

 

5.service層

public interface UserService {

    User getById(int id);

    User getByNumber(String number);

    int addUser(User user,boolean throwEx);

    void deleteUserById(int id);

    User updateUser(User user);
}

 

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Transactional(readOnly = true)
    public User getById(int id) {
        return userDao.getById(id);
    }

    @Override
    @Transactional(readOnly = true)
    public User getByNumber(String number) {
        return userDao.getByNumber(number);
    }

    @Override
    public int addUser(User user,boolean throwEx) {
        int id= this.userDao.addUser(user);
        if(throwEx){
            throw new RuntimeException("throw a ex");
        }
        return id;
    }

    @Override
    public void deleteUserById(int id) {
        this.userDao.deleteUserById(id);
    }

    @Override
    public User updateUser(User user) {
        return this.userDao.updateUser(user);
    }


}

 

6.controller層

@Controller("user1")
@RequestMapping("/jpa/user")
public class UserController {
    /**
     * 日誌(slf4j->logback)
     */
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 返回text格式數據
     * @param id 主鍵id
     * @return 用戶json字元串
     */
    @RequestMapping("/get/id/{id}")
    @ResponseBody
    public String getUserById(@PathVariable("id")String id){
        logger.info("request /user/get/id/{id}, parameter is "+id);
        User user = userService.getById(Integer.parseInt(id));
        return JSONObject.toJSONString(user);
    }

    /**
     * 返回json格式數據
     * @param number 編號
     * @return 用戶
     */
    @RequestMapping("/get/number/{number}")
    @ResponseBody
    public User getUserByNumber(@PathVariable("number")String number){
        User user = userService.getByNumber(number);
        return user;
    }

    @RequestMapping("/add/{number}/{name}")
    @ResponseBody
    public String addUser(@PathVariable("number")String number,@PathVariable("name")String name,boolean throwEx){
        User user = new User();
        user.setNumber(number);
        user.setName(name);
        int id = -1;
        try{
            id = userService.addUser(user,throwEx);
        }catch (RuntimeException ex){
            System.out.println(ex.getMessage());
        }
        return String.valueOf(id);
    }

    @RequestMapping("/delete/{id}")
    @ResponseBody
    public void getUserById(@PathVariable("id")int id){
        this.userService.deleteUserById(id);
    }

    @RequestMapping("/update/{id}/{number}/{name}")
    @ResponseBody
    public User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name){
        User user = new User();
        user.setId(id);
        user.setNumber(number);
        user.setName(name);
        return userService.updateUser(user);
    }
}

 

 

7. spring data jpa新使用方式,更高級

1.dao

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    /**
     * spring data jpa 會自動註入實現(根據方法命名規範)
     * @return
     */
    User findByNumber(String number);


    @Modifying
    @Query("delete from User u where u.id = :id")
    void deleteUser(@Param("id")int id);
}

2.service

public interface UserService {

    User findById(int id);

    User findByNumber(String number);

    List<User> findAllUserByPage(int page,int size);

    User updateUser(User user,boolean throwEx);

    void deleteUser(int id);
}

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public User findById(int id) {
        return this.userRepository.findOne(id);
    }

    @Override
    public User findByNumber(String number) {
        return this.userRepository.findByNumber(number);
    }

    @Override
    public List<User> findAllUserByPage(int page,int size) {
        Pageable pageable = new PageRequest(page, size);
        Page<User> users =  this.userRepository.findAll(pageable);
        return users.getContent();
    }

    @Override
    public User updateUser(User user,boolean throwEx) {
        User userNew = this.userRepository.save(user);
        if(throwEx){
            throw new RuntimeException("throw a ex");
        }
        return userNew;
    }

    @Override
    public void deleteUser(int id) {
        this.userRepository.deleteUser(id);
    }
}


3.controller

@Controller("user2")
@RequestMapping("/datajpa/user")
public class UserController {
    /**
     * 日誌(slf4j->logback)
     */
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    /**
     * 返回text格式數據
     * @param id 主鍵id
     * @return 用戶json字元串
     */
    @RequestMapping("/get/id/{id}")
    @ResponseBody
    public String getUserById(@PathVariable("id")String id){
        logger.info("request /user/get/id/{id}, parameter is "+id);
        User user = userService.findById(Integer.parseInt(id));
        return JSONObject.toJSONString(user);
    }

    /**
     * 返回json格式數據
     * @param number 編號
     * @return 用戶
     */
    @RequestMapping("/get/number/{number}")
    @ResponseBody
    public User getUserByNumber(@PathVariable("number")String number){
        User user = userService.findByNumber(number);
        return user;
    }

    @RequestMapping("/get/all/{page}/{size}")
    @ResponseBody
    public List<User> getAllUserByPage(@PathVariable("page")int page,@PathVariable("size")int size){
        return this.userService.findAllUserByPage(page,size);
    }

    @RequestMapping("/update/{id}/{number}/{name}")
    @ResponseBody
    public User addUser(@PathVariable("id")int id, @PathVariable("number")String number, @PathVariable("name")String name,boolean throwEx){
        User user = new User();
        user.setId(id);
        user.setNumber(number);
        user.setName(name);
        User userNew = null;
        try{
            userService.updateUser(user,throwEx);
        }catch (RuntimeException ex){
            System.out.println(ex.getMessage());
        }
        return userNew;
    }

    @RequestMapping("/delete/{id}")
    @ResponseBody
    public void getUserById(@PathVariable("id")int id){
        this.userService.deleteUser(id);
    }


}

 

8.註入jdbcTemplate和transactionTemplate,使用傳統方式操作資料庫,更加靈活,方法如下

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private TransactionTemplate transactionTemplate;

    /**
     * 手動控制事物測試
     * @param throwEx
     */
    @Override
    public void testTransactionManually(boolean throwEx) {

        try {
            transactionTemplate.execute(new TransactionCallback<Boolean>() {

                /**
                 * 事物代碼
                 *
                 * @param transactionStatus 事物狀態
                 * @return 是否成功
                 */
                @Override
                public Boolean doInTransaction(TransactionStatus transactionStatus) {
                    User user = new User();
                    user.setId(1);
                    int a = new Random().nextInt(10); //0-9
                    user.setNumber("10000u" + a);
                    jdbcTemplate.update("UPDATE USER SET NUMBER=? WHERE ID=?", new Object[]{user.getNumber(), user.getId()}, new int[]{Types.VARCHAR, Types.INTEGER});
                    if (throwEx) {
                        throw new RuntimeException("try throw exception"); //看看會不會回滾
                    }
                    return true;
                }
            });
        }catch (RuntimeException ex){
            System.out.println(ex.getMessage());
        }

    }

    /**
     * 手動執行jdbc測試
     */
    @Override
    public void testJdbcTemplate() {
        User  user = new User();
        int a = new Random().nextInt(10); //0-9
        user.setNumber("10000i"+ a );
        user.setName("name"+a);
        this.jdbcTemplate.update("INSERT into USER(NUMBER,NAME )VALUES (?,?)",user.getNumber(),user.getName());
    }

 

 

至此,我已經講了三種方式(jpa兩種+jdbcTemplate)如何操作資料庫了,你愛怎麼用就怎麼用,上述代碼均是實踐證明可行的!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文件上傳 配置伺服器虛擬地址: 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 獲取伺服器虛擬目錄上的文件 ...
  • 文件編碼: ①gbk編碼:中文占用2個位元組,英文占用1個位元組 File類常用API的使用: file類的遍歷目錄 RomdonAccessFile基本操作 五、位元組流 ...
  • 裝飾器 裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。 先看簡單例子: 現有一個新的需求,希望可以記錄下函數的運行時間,需要在代碼中計算時間的代碼: login()等多個函數也有類型的需求,怎麼做?若在每個函數內都寫一 ...
  • 題目背景 嘛,這道非常簡單的給大家提供信心的省選題洛谷居然沒有! 這麼簡單的題怎麼可以沒有! 給大家提升士氣是義不容辭的責任! 所以我就來補一下啦.. 值得一提的是,標程是我自己做的.. 很渣,因為數據很水所以能AC.. 大神勿噴.. 題目描述 有 m 個小組, n 個元素,每個元素屬於且僅屬於一個 ...
  • 數學操作符 字元串操作符 3種基本數據類型及其轉換函數 其他函數 ...
  • 題目描述 現在有一堆數字共N個數字(N<=10^6),以及一個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動一個單位,求出每次滑動後視窗中的最大值和最小值。 例如: The array is [1 3 -1 -3 5 3 6 7], and k = 3. 輸入輸出格式 輸入格式: 輸入一共有兩 ...
  • 介紹一下scrapy 爬蟲框架 安裝方法 pip install scrapy 就可以實現安裝了。我自己用anaconda 命令為conda install scrapy。 1 Engine從Spider處獲得爬取請求(Request)2Engine將爬取請求轉發給Scheduler,用於調度 3 ...
  • spring boot 已經支持多數據源配置了,無需網上好多那些編寫什麼類的,特別麻煩,看看如下解決方案,官方的,放心! 1.首先定義數據源配置 3.Repository數據持久層 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...