SpringBoot访问数据库
1. New——》Mave项目 ,添加SpringBoot基本依赖、mysql依赖、jpa依赖
(jpa 是一组接口,没有实现,它是在具体的 orm框架中实现,使用 jpa必须要使用实现了 jpa接口的 orm框架,如Hibernate)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
2. Mysql中创建数据库
3. 实体建模
- 创建 User、Role、Department 三个实体类
- @Entity : 表示实体类与数据库表有映射关系
@Table : 设置数据库的表名
@Id : 表示属性对应的是数据库的主键列
@GeneratedValue : 表示主键列的生成方式
@DateTimeFormat : 设置日期类型格式
(包名最好与创建 maven 项目的 groupId 相同:)
(Date类型的字段是 Util 包中的Date:)
(User类:)
4. MySQL的依赖配置
例子中三个实体之间关联关系:
User(N)——>Department(1)
User(N)——>Role(N)
User类中添加 private List< Role > roles;private Department department;以及对应的get、set方法;并添加相应的注解。如下图:。
@ManyToOne:多对一的关联关系
@JoinColumn(name=" did "):设置关联对象(department)的外键列
@ManyToMany(cascade = {},fetch = FetchType.EAGER):多对多; cascade: 级联; fetch: 设置是否启用懒加载。
@JoinTable(name = “user_role”,joinColumns = {@JoinColumn(name = “user_id”)},
inverseJoinColumns={@JoinColumn(name=“roles_id”)}):
@JoinTable: 设置多对多关联关系表信息。
name: 关联关系表表名;joinColumns: 当前对象(User)在关联关系表中的外键名;inverseJoinColumns: 关联的另一方对象在关联关系表中的外键名。
5. 实体持久化
新建包 repositories,创建对应的 xxRepository 接口,继承 JpaRepository 接口;UserRepository 中添加方法findByNameLike(String name)。
底层类的实现:
Repository: 标识的接口,不提供任何方法;
CrudRepository: 继承了 Repository,提供了一系列CRUD相关的方法;
PagingAndSortingRepository: 继承了 CrudRepository,提供了排序和分页相关的方法;
JpaRepository: 提供了一组复核Jpa操作规范的方法。
Jpa 会为接口中符合 jpa 规范的方法提供实现:
SpringData JPA定义的方法规范:
1、查询方法以 find| read| get开头;
2、使用连接关键词连接查询属性,属性名首字母大写;方法的参数位置和个数要和条件的属性名称对应;
3、条件的关键字,上述表中的关键字一列。(eg:UserRepository 中添加方法 findByNameLike(String name))
6. 配置数据库连接(使用Java配置)
test 包下新建测试包,包中新建配置类 JpaConfiguration,类中进行代码编写
import java.util.Properties;
@Configuration //表示当前类是一个配置类,作用类似于Spring框架中的xml配置文件
@EnableJpaRepositories(basePackages = "com.mdd.springbootdb.repositories")
//指定Repository类的包路径
public class JpaConfiguration {
// 1.DataSource
@Bean //告诉Spring框架这个方法的返回值需要注册成Spring中的Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource=new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springbootdb?charaterEncoding=utf8");
dataSource.setUsername("root");
dataSource.setPassword("12345");
return dataSource;
}
// 2.LocalContainerEntityManagerFactoryBean
// 管理EntityManager类对象,用于后续的crud操作
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean=
new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan("com.mdd.springbootdb.domain");
entityManagerFactoryBean.setJpaProperties(buildHibernateProperties());
//设置Jpa接口实现的厂商,用Hibernate
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter(){
{
setDatabase(Database.MYSQL);
}
});
return entityManagerFactoryBean;
}
// 针对Hibernate的配置
protected Properties buildHibernateProperties(){
Properties hibernateProperties=new Properties();
hibernateProperties.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
hibernateProperties.setProperty("hibernate.show_sql","true");
hibernateProperties.setProperty("hibernate.format_sql","true");
hibernateProperties.setProperty("hibernate.hbm2ddl.auto","update");
return hibernateProperties;
}
// 3.事务管理器
@Bean
public PlatformTransactionManager transactionManager(){
return new JpaTransactionManager();
}
// 想看到Spring的异常体系,而不是底层Hibernate的异常体系
@Bean
PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){
return new PersistenceExceptionTranslationPostProcessor();
}
// 用于操作具体的sql
@Bean
public TransactionTemplate transactionTemplate(){
return new TransactionTemplate(transactionManager());
}
}
7. 测试
pom文件中添加 SpringBoot 自带的测试依赖(不是junit了);新建的test包中创建测试类SpringbootMysqlTest;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JpaConfiguration.class)
public class SpringbootMysqlTest {
@Autowired
DepartmentRepository departmentRepository;
@Autowired
RoleRepository roleRepository;
@Autowired
UserRepository userRepository;
@Before
public void initData(){
departmentRepository.deleteAll();
roleRepository.deleteAll();
userRepository.deleteAll();
Department department=new Department();
department.setName("Dep01");
departmentRepository.save(department);
Assert.assertNotNull(department.getId());
Role role=new Role();
role.setName("Stefan");
roleRepository.save(role);
Assert.assertNotNull(role.getId());
User user=new User();
user.setName("user1");
user.setCreateDate(new Date());
user.setDepartment(department);
List<Role> roles=roleRepository.findAll();
Assert.assertNotNull(roles);
user.setRoles(roles);
userRepository.save(user);
Assert.assertNotNull(user.getId());
}
@Test
public void test(){
List<User> userList=userRepository.findByNameLike("u%");
Assert.assertNotNull(userList);
}
}