{"id":1780,"date":"2023-03-26T22:32:15","date_gmt":"2023-03-26T14:32:15","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1780"},"modified":"2023-04-23T21:17:17","modified_gmt":"2023-04-23T13:17:17","slug":"spring-boot-integrate-jpa","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/26\/spring-boot-integrate-jpa\/","title":{"rendered":"Spring Boot \u96c6\u6210 JPA"},"content":{"rendered":"<h2>JPA\u7b80\u4ecb<\/h2>\n<p><code>JPA<\/code>\u5168\u79f0<code>Java Persistence API<\/code>\uff0cJPA\u901a\u8fc7JDK 5.0\u6ce8\u89e3\u6216XML\u63cf\u8ff0\u5bf9\u8c61\uff0d\u5173\u7cfb\u8868\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u5e76\u5c06\u8fd0\u884c\u671f\u7684\u5b9e\u4f53\u5bf9\u8c61\u6301\u4e45\u5316\u5230\u6570\u636e\u5e93\u4e2d\u3002<\/p>\n<p><code>JPA<\/code>\u7684\u76ee\u6807\u4e4b\u4e00\u662f\u5236\u5b9a\u4e00\u4e2a\u53ef\u4ee5\u7531\u5f88\u591a\u4f9b\u5e94\u5546\u5b9e\u73b0\u7684API\uff0c\u5e76\u4e14\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u7f16\u7801\u6765\u5b9e\u73b0\u8be5API\uff0c\u800c\u4e0d\u662f\u4f7f\u7528\u79c1\u6709\u4f9b\u5e94\u5546\u7279\u6709\u7684API\u3002<\/p>\n<p><!-- more --><\/p>\n<p><code>JPA<\/code>\u662f\u9700\u8981<code>Provider<\/code>\u6765\u5b9e\u73b0\u5176\u529f\u80fd\u7684\uff0c<code>Hibernate<\/code>\u5c31\u662f<code>JPA Provider<\/code>\u4e2d\u5f88\u5f3a\u7684\u4e00\u4e2a\uff0c\u5e94\u8be5\u8bf4\u65e0\u4eba\u80fd\u51fa\u5176\u53f3\u3002\u4ece\u529f\u80fd\u4e0a\u6765\u8bf4\uff0c<code>JPA<\/code>\u5c31\u662f<code>Hibernate<\/code>\u529f\u80fd\u7684\u4e00\u4e2a\u5b50\u96c6\u3002<\/p>\n<h2>JPA\u5b9e\u6218<\/h2>\n<p>\u672c\u6587\u5b9e\u73b0\u529f\u80fd\uff1a<\/p>\n<ul>\n<li><code>Spring Boot<\/code>\u4e0e<code>Spring Data JPA<\/code>\u6574\u5408<\/li>\n<li><code>JpaRepository<\/code>\u63a5\u53e3\u5feb\u6377\u5f00\u53d1<\/li>\n<li><code>MVC<\/code>\u67b6\u6784+\u5206\u9875\u529f\u80fd\u5b9e\u6218<\/li>\n<\/ul>\n<h3>pom\u4f9d\u8d56<\/h3>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;mysql&lt;\/groupId&gt;\n    &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n    &lt;version&gt;8.0.21&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n    &lt;version&gt;2.3.3.RELEASE&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!--\u963f\u91cc\u5df4\u5df4\u6570\u636e\u5e93\u8fde\u63a5\u6c60\uff0c\u4e13\u4e3a\u76d1\u63a7\u800c\u751f --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n    &lt;artifactId&gt;druid&lt;\/artifactId&gt;\n    &lt;version&gt;1.1.23&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n    &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n    &lt;optional&gt;true&lt;\/optional&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h3>application.properties\u914d\u7f6e<\/h3>\n<pre><code># \u901a\u7528\u6570\u636e\u6e90\u914d\u7f6e\nspring.datasource.url=jdbc:mysql:\/\/localhost:3306\/test\nspring.datasource.username=root\nspring.datasource.password=root\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.type=com.alibaba.druid.pool.DruidDataSource\n\n# JPA \u76f8\u5173\u914d\u7f6e\nspring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect\nspring.jpa.show-sql=true\n# \u91cd\u542f\u5e94\u7528\u540e\u6570\u636e\u5e93\u4e0d\u6e05\u7a7a\nspring.jpa.hibernate.ddl-auto=update\n#spring.jpa.hibernate.ddl-auto=create<\/code><\/pre>\n<h3>\u5b9e\u4f53\u7c7b<\/h3>\n<pre><code class=\"language-java\">import lombok.Data;\n\nimport javax.persistence.*;\nimport java.util.Date;\n\n\/**\n * @author http:\/\/www.appblog.cn\n *\/\n@Data\n@Entity\n@Table(name = &quot;user&quot;)\npublic class User {\n    public User() {\n    }\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.AUTO)\n    private Integer id;\n\n    @Column(nullable = false)\n    private String username;\n    @Column(nullable = false)\n    private Date birthday;\n    @Column(nullable = false)\n    private String sex;\n    @Column(nullable = false)\n    private String address;\n\/\/    @Column(nullable = false)\n\/\/    private String memo;\n}<\/code><\/pre>\n<h3>\u5b9e\u73b0DAO\u5c42<\/h3>\n<pre><code class=\"language-java\">import me.yezhou.springboot.jpa.model.User;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Modifying;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.stereotype.Repository;\n\n\/**\n * @author http:\/\/www.appblog.cn\n *\/\n@Repository\npublic interface UserRepository extends JpaRepository&lt;User, Integer&gt; {\n\n    \/\/\u81ea\u5b9a\u4e49repository, \u624b\u5199sql\n    @Query(value = &quot;update user set name=?1 where id=?4&quot;, nativeQuery = true)   \/\/\u5360\u4f4d\u7b26\u4f20\u503c\u5f62\u5f0f\n    @Modifying\n    int updateById(String name, int id);\n\n    @Query(&quot;from User u where u.username=:username&quot;)\n        \/\/SPEL\u8868\u8fbe\u5f0f\n    User findUser(@Param(&quot;username&quot;) String username);  \/\/\u53c2\u6570username \u6620\u5c04\u5230\u6570\u636e\u5e93\u5b57\u6bb5username\n}<\/code><\/pre>\n<p>\u6ce8\u610f\uff1a\u53ea\u6709<code>@Query<\/code>\u7684\u6ce8\u89e3\u4e0b\u4e0d\u80fd\u4f7f\u7528<code>update<\/code>\uff0c\u6211\u4eec\u9700\u8981\u5728\u4e0a\u9762\u518d\u6dfb\u52a0\u4e2a<code>@Modifying<\/code>\u6ce8\u89e3\uff0c<code>nativeQuery<\/code>\u662f\u8be2\u95ee\u662f\u5426\u4f7f\u7528\u539f\u751fsql\u8bed\u53e5\u3002\u591a\u8868\u67e5\u8be2\u4e5f\u662f\u5728\u8fd9\u91cc\u624b\u5199sql\uff0c\u5efa\u8bae\u4f7f\u7528\u66f4\u597d\u7684\u652f\u6301\u591a\u8868\u67e5\u8be2\u7684\u5de5\u5177\u6846\u67b6<code>QueryDSL<\/code>\u5b9e\u73b0\u3002<\/p>\n<h3>\u5b9e\u73b0Service\u5c42<\/h3>\n<p>UserService .java<\/p>\n<pre><code class=\"language-java\">import me.yezhou.springboot.jpa.model.User;\n\nimport java.util.Iterator;\n\n\/**\n * @author http:\/\/www.appblog.cn\n *\/\npublic interface UserService {\n    \/**\n     * \u5220\u9664\n     *\/\n    public void delete(int id);\n\n    \/**\n     * \u589e\u52a0\n     *\/\n    public void insert(User user);\n\n    \/**\n     * \u66f4\u65b0\n     *\/\n    public int update(User user);\n\n    \/**\n     * \u67e5\u8be2\u5355\u4e2a\n     *\/\n    public User selectById(int id);\n\n    \/**\n     * \u67e5\u8be2\u5168\u90e8\u5217\u8868\n     *\/\n    public Iterator&lt;User&gt; selectAll(int pageNum, int pageSize);\n}<\/code><\/pre>\n<p>UserServiceImpl.java<\/p>\n<pre><code class=\"language-java\">import me.yezhou.springboot.jpa.dao.UserRepository;\nimport me.yezhou.springboot.jpa.model.User;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Iterator;\nimport java.util.Optional;\n\n\/**\n * @author http:\/\/www.appblog.cn\n *\/\n@Service\npublic class UserServiceImpl implements UserService {\n\n    @Autowired\n    private UserRepository userRepository;\n\n    \/**\n     * \u5220\u9664\n     *\n     * @param id\n     *\/\n    @Override\n    public void delete(int id) {\n        userRepository.deleteById(id);\n    }\n\n    \/**\n     * \u589e\u52a0\n     *\n     * @param user\n     *\/\n    @Override\n    public void insert(User user) {\n        userRepository.save(user);\n    }\n\n    \/**\n     * \u66f4\u65b0\n     *\n     * @param user\n     *\/\n    @Override\n    public int update(User user) {\n        userRepository.save(user);\n        return 1;\n    }\n\n    \/**\n     * \u67e5\u8be2\u5355\u4e2a\n     *\n     * @param id\n     *\/\n    @Override\n    public User selectById(int id) {\n        Optional&lt;User&gt; optional = userRepository.findById(id);\n        User user = optional.get();\n        return user;\n    }\n\n    \/**\n     * \u67e5\u8be2\u5168\u90e8\u5217\u8868,\u5e76\u505a\u5206\u9875\n     *\n     * @param pageNum  \u5f00\u59cb\u9875\u6570\n     * @param pageSize \u6bcf\u9875\u663e\u793a\u7684\u6570\u636e\u6761\u6570\n     *\/\n    @Override\n    public Iterator&lt;User&gt; selectAll(int pageNum, int pageSize) {\n        \/\/\u5c06\u53c2\u6570\u4f20\u7ed9\u8fd9\u4e2a\u65b9\u6cd5\u5c31\u53ef\u4ee5\u5b9e\u73b0\u7269\u7406\u5206\u9875\u4e86\uff0c\u975e\u5e38\u7b80\u5355\u3002\n        Sort sort = Sort.by(Sort.Direction.DESC, &quot;id&quot;);\n        Pageable pageable = PageRequest.of(pageNum, pageSize, sort);\n        Page&lt;User&gt; users = userRepository.findAll(pageable);\n        Iterator&lt;User&gt; userIterator = users.iterator();\n        return userIterator;\n    }\n}<\/code><\/pre>\n<p>\u5206\u9875\u4e0d\u6b62\u53ef\u4ee5\u8fd9\u6837\u505a\uff0c\u4e5f\u53ef\u4ee5\u5728<code>Controller<\/code>\u5c42\u8fdb\u884c\u5b9e\u4f8b\u5316\u548c\u521d\u59cb\u5316\u7136\u540e\u5c06<code>Pageable<\/code>\u5bf9\u8c61\u4f20\u7ed9<code>Service<\/code>\u3002<br \/>\n\u5f53\u7136\u4e5f\u53ef\u4ee5\u5bf9\u5206\u9875\u8fdb\u884c\u5c01\u88c5\uff0c\u5c01\u88c5\u540e\u7684\u5c55\u793a\u3002<\/p>\n<pre><code class=\"language-java\">Page&lt;User&gt; datas = userRepository.findAll(PageableTools.basicPage(1, 5, new SortDto(&quot;id&quot;)));<\/code><\/pre>\n<h3>\u5b9e\u73b0Controller<\/h3>\n<pre><code class=\"language-java\">import me.yezhou.springboot.jpa.model.User;\nimport me.yezhou.springboot.jpa.service.UserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\n\n\/**\n * @author http:\/\/www.appblog.cn\n *\/\n@RestController\n@RequestMapping(&quot;\/user&quot;)\npublic class UserController {\n\n    @Autowired\n    private UserService userService;\n\n    @RequestMapping(method = RequestMethod.GET, value = &quot;\/delete\/{id}&quot;)\n    public void delete(@PathVariable(&quot;id&quot;) int id) {\n        userService.delete(id);\n    }\n\n    @RequestMapping(method = RequestMethod.POST, value = &quot;\/insert&quot;)\n    public void insert(@RequestBody User user) {\n        userService.insert(user);\n    }\n\n    @RequestMapping(method = RequestMethod.POST, value = &quot;\/update\/{id}&quot;)\n    public void update(@RequestBody User user) {\n        userService.update(user);\n    }\n\n    @RequestMapping(method = RequestMethod.GET, value = &quot;\/{id}\/select&quot;)\n    public User select(@PathVariable(&quot;id&quot;) int id) {\n        return userService.selectById(id);\n    }\n\n    @RequestMapping(method = RequestMethod.GET, value = &quot;\/selectAll\/{pageNum}\/{pageSize}&quot;)\n    public List&lt;User&gt; selectAll(@PathVariable(&quot;pageNum&quot;) int pageNum, @PathVariable(&quot;pageSize&quot;) int pageSize) {\n        Iterator&lt;User&gt; userIterator = userService.selectAll(pageNum, pageSize);\n        List&lt;User&gt; list = new ArrayList&lt;&gt;();\n        while (userIterator.hasNext()) {\n            list.add(userIterator.next());\n        }\n        return list;\n    }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>JPA\u7b80\u4ecb JPA\u5168\u79f0Java Persistence API\uff0cJPA\u901a\u8fc7JDK 5.0\u6ce8\u89e3\u6216XML\u63cf\u8ff0\u5bf9\u8c61\uff0d [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[451],"class_list":["post-1780","post","type-post","status-publish","format-standard","hentry","category-spring-boot","tag-jpa"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1780"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1780\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}