依照第一篇文章创建一个数据操作的工程,这里是展现操作mysql数据库的。采用JPA是一种比较普通的使用方法,就从这里开始。
当然首先的是要引进对MYSQL的MAVEN依赖,在POM文件中增加下面的几个引用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<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>
这几个依赖不大,不过可能需要人品,如果能翻墙代理最好或者配置一些好的国内的代理。这样会快很多,时间也是金钱。
在工程中增加一个配置类:
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement(proxyTargetClass= true)
@EnableJpaRepositories(basePackages= "com.example.**.repository")
@EntityScan(basePackages ="com.example.**.entity")
public classJpaConfiguration {
@Bean
PersistenceExceptionTranslationPostProcessorpersistenceExceptionTranslationPostProcessor(){
return newPersistenceExceptionTranslationPostProcessor();
}
}
需要注意的是@EntityScan这个注解已经提示不推荐使用了。
然后在resources中再增加一个yml文件:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: test
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
这是一个配置数据库操作的配置文件,在整个程序完成后,运行时,这里会报一个没有权限操作本地的错误:
ERROR 1045 (28000): Accessdenied for user 'mysql'@'localhost' (using password: NO)
解决方法:
grant all privileges on *.*to 'test'@'localhost' identified by'123456' with grant option;
然后重启MYSQL的服务即可。
根据实际情况创建表的ORM映射类即可,JPA会自动的连接到数据库并在MYSQL中自动创建相关的表。
同样,要创建访问DAO的接口层,并且需要使用@Repository将其定义为一个资源库,针对上面创建的表比如User:
@Repository
public interfaceUserRepository extends JpaRepository<User, Long> {
User findByNameLike(String name);
User readByName(String name);
List<User>getByCreatedateLessThan(Date star);
}
同理,根据不同的情况创建不同的表的这种资源接口。定义好这些接口后就可以直接使用相关的CRUD等数据库的操作了。
这时候,可以用intelidea增加一个junit的单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {JpaConfiguration.class})
public class MysqlTest {
private static Logger logger =LoggerFactory.getLogger(MysqlTest.class);
@Autowired
UserRepository userRepository;
@Autowired
DepartmentRepository departmentRepository;
@Autowired
RoleRepository roleRepository;
@Before
public void initData(){
userRepository.deleteAll();
roleRepository.deleteAll();
departmentRepository.deleteAll();
Department department = new Department();
department.setName("开发部");
departmentRepository.save(department);
Assert.notNull(department.getId());
Role role = new Role();
role.setName("admin");
roleRepository.save(role);
Assert.notNull(role.getId());
User user = new User();
user.setName("user");
user.setCreatedate(new Date());
user.setDeparment(department);
List<Role> roles =roleRepository.findAll();
Assert.notNull(roles);
user.setRoles(roles);
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==== username:{}, department name:{}, role name:{}",
user.getName(),user.getDeparment().getName(), user.getRoles().get(0).getName());
}
}
//@Test
public void test(){
User user1 =userRepository.findByNameLike("u%");
Assert.notNull(user1);
User user2 =userRepository.readByName("user");
Assert.notNull(user2);
List<User> users =userRepository.getByCreatedateLessThan(new Date());
Assert.notNull(users);
}
}
程序就可以直接跑起来了。
这里唯一遇到的麻烦是配置数据库时,各种无语,密码不对,没有重启和用户名不对啊。最后一一修改后才完成了整个工作。