近期在做项目的时候,项目框架已定,底层都是手写的mapper,哪怕是最最简单的单表增删改,而且在接手这个项目的时候发现,前人在写这个项目的时候没有注意项目的封装性,真是想到哪里写到哪里,没有抽出公共的。于是乎这块但凡加个新的功能,就需要重新写sql,比较的麻烦,维护的时候感觉也很糟糕。
于是想到了之前在前一家公司的时候采取的做法,都是直接用的公共的,有直接使用generator直接生成的,也有用jpa规范的。生成的这个之前自己做过一个小的demo,所以这次索性试试新的方法用jpa规范。公司项目框架用的spring cloud ,docker这一套,查阅文档,spring实现了jpa规范就在spring data模块中。
接下来就是对jpa的尝试。
备注:
spring.jpa.hibernate.ddl-auto=create的时候重启都会删除之前的数据,重新建表。
在application.properties总写好数据库配置:
spring.datasource.url=jdbc:mysql://localhost/base-org-permission spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver #update属性可以保证非每次重启重新建表 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.data.jpa.repositories.enabled=true引入相关的jar
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Use MySQL Connector-J --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
接下来就是自己写几个简单的实体类:
@Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String firstName; private String lastName; private Integer age; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public long getId() { return id; } public void setId(long id) { this.id = id; } }
@Entity public class Organization { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String orgName; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getOrgName() { return orgName; } public void setOrgName(String orgName) { this.orgName = orgName; } }
接下来写两个接口并且实现CrudRepostory
public interface OrganizationRepository extends CrudRepository<Organization,Long> { }
public interface PersonRepository extends CrudRepository<Person, Long> { List<Person> findByLastName(@Param("name") String name); }
最后就是写相关的Controller进行测试
@RestController @RequestMapping("/org") public class OrganizationController { @Resource private OrganizationRepository organizationRepository; @RequestMapping("add") public Integer add (){ Organization organization= new Organization(); organization.setOrgName("蜂网北京"); organizationRepository.save(organization); return organization.getId(); } @RequestMapping("findAll") public Iterable<Organization> findAll(){ Iterable<Organization> all = organizationRepository.findAll(); return all; } }
@RestController @RequestMapping("/person") public class PersonController { @Autowired private PersonRepository personRepository; @RequestMapping("add") public Long add(){ Person person = new Person(); person.setFirstName("xiao"); person.setLastName("ming"); person.setAge(5); Person people = new Person(); people.setFirstName("xiao"); people.setLastName("hua"); people.setAge(4); personRepository.save(person); personRepository.save(people); System.out.println(person.getId()); return person.getId(); } @RequestMapping("findAll") public Iterable<Person> findAll(){ Iterable<Person> all = personRepository.findAll(); return all; } @RequestMapping("findByCondition") public List<Person> findByCondition(){ Iterable<Person> all = findAll(); List<Person> list = new ArrayList<>(); for (Person person :all) { list.add(person); } list.forEach(System.out::println); return list; } }感受:使用jpa的时候遇到了不少的坑,但是总体上是非常方便使用的。只需实现一个接口就可实现对单表的增删改的操作。而且他可以实现自动建表,表里头的字段是随着属性的变化而变化的。很智能。