1.JPAjava
JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它爲Java開發人員提供了一種對象/關聯映射工具來管理Java應用中的關係數據。他的出現主要是爲了簡化現有的持久化開發工做和整合ORM技術,結束如今Hibernate,TopLink,JDO等ORM框架各自爲營的局面。值得注意的是,JPA是在充分吸取了現有Hibernate,TopLink,JDO等ORM框架的基礎上發展而來的,具備易於使用,伸縮性強等優勢。JPA是一套規範,不是一套產品,那麼像Hibernate,TopLink,JDO他們是一套產品,若是說這些產品實現了這個JPA規範,那麼咱們就能夠叫他們爲JPA的實現產品。mysql
2.項目搭建spring
本文采用IDEA搭建Spring Boot的JPA應用,Demo結構圖以下:sql
3.具體實現數據庫
(1)配置文件json
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
spring: profiles: active: product datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/saascrm?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC username: root password: snail123 jpa: hibernate: ddl-auto: update show-sql: true jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: UTC
(2)分層服務器
爲了區別各個模塊,爲項目創建幾個包:controller、Entity、respository、service,這是典型的MVC架構,各個層次的表明意義在此再也不贅述。網絡
(3)Respository層架構
spring data jpa讓咱們解脫了DAO層的操做,基本上全部CRUD均可以依賴於它來實現,須要實現JpaRepository接口app
public interface UserRepository extends JpaRepository<UserInfo,Long> { }
(4)Entity層
定義了用戶信息表實體UserInfo,經過Hibernate與數據庫造成映射關係,以下:
@Entity @Component public class UserInfo { public UserInfo() { } @Id @GeneratedValue 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 String getJobNumber() { return jobNumber; } public void setJobNumber(String jobNumber) { this.jobNumber = jobNumber; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } private Long id; //ID private String name; //姓名 private String jobNumber; //工號 private Date createTime; //建立時間 }
(5)service層
定義了服務層接口以及服務層接口實現類,以下:
public interface UserService { List<UserInfo> getUserList(); UserInfo getUserByName(String name); UserInfo addUserInfo(UserInfo userInfo); UserInfo updateUserInfoById(UserInfo userInfo); void deleteUserInfoById(Long Id); List<UserInfo>getCurrentUserList(); Page<UserInfo> getPageUserList(); }
其中涉及單表的增刪改查,還有分頁查詢等
@Service public class UserServiceImpl implements UserService{ @Autowired private UserRepository userRepository; /** * 獲取全部用戶列表 * @return */ public List<UserInfo> getUserList(){ List<UserInfo> userList=new ArrayList<UserInfo>(); userList=userRepository.findAll(); return userList; } /** * 經過姓名獲取用戶信息 * @param name 用戶姓名 * @return */ public UserInfo getUserByName(String name) { return userRepository.findByName(name); } /** * 新增用戶信息 * @param userInfo 用戶信息 * @return */ public UserInfo addUserInfo(UserInfo userInfo) { return userRepository.save(userInfo); } /** * 更新用戶信息 * @param userInfo 用戶信息 * @return */ public UserInfo updateUserInfoById(UserInfo userInfo) { return userRepository.save(userInfo); } /** * 刪除用戶信息 * @param id 主鍵Id */ public void deleteUserInfoById(Long id) { userRepository.delete(id); } /** * 獲取最新的用戶 * @return */ public List<UserInfo> getCurrentUserList() { Sort sort=new Sort(Sort.Direction.DESC,"createTime"); return userRepository.findAll(sort); } /** * 獲取分頁的用戶 * @return */ public Page<UserInfo> getPageUserList() { Sort sort=new Sort(Sort.Direction.DESC,"createTime"); Pageable pageable=new PageRequest(0,5,sort); return userRepository.findAll(pageable); } }
(6)Controller層
其中,日期格式須要作轉換,在須要日期轉換的Controller中使用SpringMVC的註解@initbinder和Spring自帶的WebDateBinder類來操做。WebDataBinder是用來綁定請求參數到指定的屬性編輯器.因爲前臺傳到controller裏的值是String類型的,當往Model裏Set這個值的時候,若是set的這個屬性是個對象,Spring就會去找到對應的editor進行轉換,而後再SET進去。
@RestController @RequestMapping(value = "/test") public class TestController { @Autowired private UserInfo userInfo; @Resource private UserService userService; /** * 獲取全部用戶 * @return */ @GetMapping(value = "/getUserList") public List<UserInfo> getUserList() { return userService.getUserList(); } @GetMapping(value = "/getUserInfo") public UserInfo getUserInfoByName(@RequestParam("name") String name) { return userService.getUserByName(name); } @GetMapping(value = "/getCurrentUserList") public List<UserInfo> getCurrentUserList(){ return userService.getCurrentUserList(); } @GetMapping(value="/getPageUserList") public Page<UserInfo> getPageUserList(){ return userService.getPageUserList(); } @PutMapping(value = "/addUserInfo") public UserInfo addUserInfo(UserInfo userInfo) { return userService.addUserInfo(userInfo); } @PostMapping(value ="/updateUserInfo") public UserInfo updateUserInfo(UserInfo userInfo){ return userService.updateUserInfoById(userInfo); } @PostMapping(value="/deleteUserInfo") public void deleteUserInfo(@RequestParam("id") Long id){ userService.deleteUserInfoById(id); } @InitBinder protected void init(HttpServletRequest request, ServletRequestDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));/*TimeZone時區,解決差8小時的問題*/ binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); }
4.測試
Http定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,咱們能夠這樣認爲:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應着對這個資源的查,改,增,刪4個操做。
本文藉助PostMan工具進行測試,以下圖所示。(注意事項,若是選擇PUT請求,那麼只能選x-www-form-urlencoded)