使用数据库是开发基本应用的基础。借助于开发框架,我们已经不再编写原始的访问数据库的代码,也不用调用JDBC或者连接池等诸如此类的被称作为底层的代码了。spring boot包含了一个功能强大的资源库,为使用spring boot的开发者提供了更加简便的接口进行访问。
一、使用MySQL:
对于传统关系型数据库来说,spring boot使用JPA资源库来实现对数据库的操作,JPA就是为POJO提供持久化的标准规范,即将java的普通对象通过对象关系映射ORM持久化到数据库中。
1、MySQL依赖配置:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
2、实体建模:
首先创建一些普通对象,用来与数据库的表建立映射关系,然后使用JPA对数据库进行增删改查等存取操作。
@Entity @Table(name = "user") public class User implements java.io.Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createdate; public User() { } 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 Date getCreatedate() { return createdate; } public void setCreatedate(Date createdate) { this.createdate = createdate; } }
3、实体持久化
以上已使用普通对象(POJO)与数据库建立映射关系(ORM),接下来使用JPA实现持久化。
User实体使用JPA进行持久化如下所示。它是一个接口,并继承于JPA资源库JpaRepository接口,使用注解@Repository将这个接口也定义为一个资源库,使他能被其他程序引用,并为其他程序提供存取数据库的功能。
@Repository public interface UserRepository extends JpaRepository<User, Long> { User findByNameLike(String name); User readByName(String name); List<User> getByCreatedateLessThan(Date star); }这样就实现存取数据库的功能了,现在可以对数据库进行增删改查、分页查询、指定排序的字段等操作了。
使用JPA不需要对接口有任何实现的代码,也不需要SQL语句。JpaRepository继承于PagingAndSortingRepository,提供了分页和排序功能,PagingAndSortingRepository继承于CrudRepository,提供了简单的增删改查功能。
JPA还提供了一些自定义声明方法的规则,如,findBy、readBy,getBy作为方法名的前缀,拼接实体类中的属性字段,首字母大写,并可选拼接一些SQL查询关键字来组合成一个查询方法。如上面代码。
4、测试验证:
增加一个JPA配置类,其中@EnableTransactionManagement 启用了JPA的事务管理;@EnableJpaRepositories启用了JPA资源库并指定了上面定义的接口资源库的位置;@EntityScan指定了定义实体的位置,他将导入我们定义的实体。
@Order(Ordered.HIGHEST_PRECEDENCE) @Configuration @EnableTransactionManagement(proxyTargetClass = true) @EnableJpaRepositories(basePackages = "dbdemo.**.repository") @EntityScan(basePackages = "dbdemo.**.entity") public class JpaConfiguration { @Bean PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){ return new PersistenceExceptionTranslationPostProcessor(); } }
需要本地安装MySQL数据库,之后创建一个数据库,可以自定义命名为“shenchong”,配置密码123456。数据库的表结构不用创建,在程序运行的时候将会按照实体的定义自动创建。
然后在application.yml中添加配置,用来设置数据源和JPA的工作模式:
spring: datasource: url: jdbc:mysql://localhost:3306/shenchong?useSSL=false username: root password: 123456 jpa: database: MYSQL show-sql: true #Hibernate ddl auto (validate|create|create-drop|update) hibernate: ddl-auto: update naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy properties: hibernate: dialect: org.hibernate.dialect.MySQL5Dialect
5、编写测试程序:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {JpaConfiguration.class}) public class MysqlTest { private static Logger logger = LoggerFactory.getLogger(MysqlTest.class); @Autowired UserRepository userRepository; @Before public void initData(){ userRepository.deleteAll(); User user = new User(); user.setName("user"); user.setCreatedate(new Date()); userRepository.save(user); Assert.notNull(user.getId()); } @Test public void findPage(){ Pageable pageable = new PageRequest(0, 10, new Sort(Sort.Direction.ASC, "id")); Page<User> page = userRepository.findAll(pageable); Assert.notNull(page); for(User user : page.getContent()) { logger.info("====user==== user name:{}",user.getName()); } }