在咱们的实际开发的过程当中,不管多复杂的业务逻辑到达持久层都回归到了“增删改查”的基本操做,可能会存在关联多张表的复杂sql,可是对于单表的“增删改查”也是不可避免的,大多数开发人员对于这个简单而繁琐的操做都比较烦恼。java
为了解决这种大量枯燥的简单数据库操做,大体的解决该问题的有三种方式
一、使用相似Hibernate的ORM框架,经过Hibernate完成java实体类和数据库之间的映射,完成简单的单表的“增删改查”mysql
二、使用代码生成工具生成单表的“增删改查”代码,省去咱们手动编写的过程(我将在后面的文章中给出可定制化生成代码方法,敬请关注!)git
三、使用Spring-data-jpa这样的技术,它实现了模板Dao层,只须要在Dao,经过继承一个接口,就可轻松完成“增删改查”,具体使用方法以下:spring
1、在pom.xml文件中添加以下依赖sql
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
2、在application.yml文件中配置数据库信息和jpa信息(注意:不一样的SpringBoot版本jpa配置的方法可能会有不一样)数据库
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8 username: root password: 123456 jpa: hibernate: ddl-auto: update
我的推荐使用yml格式的配置文件,看起来更加清晰简单(注意:每一个配置属性的缩进是两个空格,这点必定要注意,否则会出现配置错误的状况,也能够在开发工具中安装相关的yml的插件方便查看)。服务器
jpa的配置后 jpa.hibernate.ddl-auto= update,在其余低版本的SpringBoot中也有使用spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 这种配置的,具体根据版本而定。该配置的主要做用是:自动建立、更新、验证数据库结构微信
一、create:每次加载hibernate时都会删除上一次的生成的表,而后根据你的model类再从新来生成新表,哪怕两次没有任何改变也要这样执行,这就是致使数据库表数据丢失的一个重要缘由(通常只会在第一次建立时使用)session
二、create-drop:每次加载hibernate时根据model类生成表,可是sessionFactory一关闭,表就自动删除app
三、update:最经常使用的属性,第一次加载hibernate时根据model类会自动创建起表的结构(前提是先创建好数据库),之后加载hibernate时根据model类自动更新表结构,即便表结构改变了但表中的行仍然存在不会删除之前的行。要注意的是当部署到服务器后,表结构是不会被立刻创建起来的,是要等应用第一次运行起来后才会
四、validate:每次加载hibernate时,验证建立数据库表结构,只会和数据库中的表进行比较,不会建立新表,可是会插入新值
3、建立实体
建立一个User类,配置好上面的信息后,启动项目,对应的数据库就会自动生成对应的表结构。@Table、@Entity、@Id等注解是jpa的相关知识,后面的文章将详细讲述。
@Table(name = "t_user") @Entity public class User { @Id @GeneratedValue private Long id; @Column private String name;//姓名 @Column private Integer age;//年龄 // ..... }
4、建立数据库访问Dao层
@Repository public interface UserRepository extends JpaRepository<User,Long>{ /** * 根据年纪查询用户 * @param age * @return */ User findByAge(Integer age); /** * 根据年纪和姓名查询 * @param name * @param age * @return */ User findByNameAndAge(String name, Integer age); /** * 对于复杂查询可使用@Query 编写sql * @param name * @return */ @Query("from User u where u.name=:name") User findUser(@Param("name") String name); }
该Dao成继承了JpaRepository接口,指定了须要操做的实体对象和实体对象的主键类型,经过查看JpaRepository接口源码能够看到,里面已经封装了建立(save)、更新(save)、删除(delete)、查询(findAll、findOne)等基本操做的函数,使用起来很是方便了,可是仍是会存在一些复杂的sql,spring-data-jpa还提供了一个很是方便的方式,经过实体属性来命名方法,它会根据命名来建立sql查询相关数据,对应更加复杂的语句,还能够用直接写sql来完成,具体例子如上所示。
5、单元测试
使用junit进行单元测试,代码以下
/** * * @author 明天的地平线 * * SpringBoot 以前的版本配置单元测试类时使用 @SpringApplicationConfiguration(Application.class) * SpringBoot 1.5.9 改用@SpringBootTest(classes = Application.class) * */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) public class JpaTest { @Autowired private UserRepository userRepository; /** * 新增用户 * @throws Exception */ @Test public void testAddUser() throws Exception { User user = new User(); user.setName("zhangsan"); user.setAge(12); userRepository.save(user); User user2 = new User(); user2.setName("lishi"); user2.setAge(22); userRepository.save(user2); } /** * 删除用户(根据对象删除时,必需要有ID属性) * @throws Exception */ @Test public void testDelUser() throws Exception { User user = new User(); user.setId(1L); user.setName("zhangsan"); user.setAge(12); userRepository.delete(user); } /** * 修改用户信息 * @throws Exception */ @Test public void testUpdUser() throws Exception { User user = new User(); user.setId(2L); user.setName("zhangsan11"); user.setAge(122); userRepository.save(user); } /** * 查询用户 * @throws Exception */ @Test public void testQueryUser() throws Exception { User user = userRepository.findByAge(22); System.out.println(user.getName()); User user2 = userRepository.findByNameAndAge("lishi", 22); System.out.println(user2.getName()); User user3 = userRepository.findUser("zhangsan11"); System.out.println(user3.getName()); } /** * 查询全部用户 * @throws Exception */ @Test public void testQueryUserList() throws Exception { List<User> list = userRepository.findAll(); for (User user : list) { System.out.println(user.getName()); } } }
数据库数据以下:
本文主要以SpringBoot整合jpa为主,Spring-data-jpa的内容远比以上内容丰富和强大,例如分页排序、对原生sql的支持等,后续将对此内容进行专门讲解,感兴趣的小伙伴能够关注个人博客和微信公众号。
Git代码地址:https://gitee.com/Somta/Sprin...
原文地址:http://somta.com.cn/#/blog/vi...
本文由明天的地平线创做,如想了解更多更详细的内容,请关注一下公众号,公众号内将进行最新最实时的更新!