SpringBoot(3)之SpringBoot访问数据库

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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41029923/article/details/83183906