SpringDataJpa入门案例(一)

SpringDataJpa的入门操作

一、搭建环境

1**. 创建工程,导入坐标**

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
    properties>

    <dependencies>
        
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.1.10version>
        dependency>

        <dependency>
            <groupId>com.mchangegroupId>
            <artifactId>c3p0artifactId>
            <version>0.9.5.4version>
        dependency>


        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>4.0.1version>
            <scope>providedscope>
        dependency>

        
        <dependency>
            <groupId>javax.servlet.jspgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.2version>
            <scope>providedscope>
        dependency>

        
        <dependency>
            <groupId>jstlgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>

        
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.15version>
        dependency>

        <dependency>
            <groupId>commons-dbcpgroupId>
            <artifactId>commons-dbcpartifactId>
            <version>1.2.2version>
        dependency>

        
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.58version>
        dependency>

        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.9version>
        dependency>


        
        <dependency>
            <groupId>log4jgroupId>
            <artifactId>log4jartifactId>
            <version>1.2.17version>
        dependency>


        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.1.5.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-txartifactId>
            <version>5.1.5.RELEASEversion>
        dependency>

        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>5.1.5.RELEASEversion>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
        dependency>

        
        
        <dependency>
            <groupId>aopalliancegroupId>
            <artifactId>aopallianceartifactId>
            <version>1.0version>
        dependency>
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.9.4version>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aspectsartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>


        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>

        
        
        <dependency>
            <groupId>org.springframework.datagroupId>
            <artifactId>spring-data-jpaartifactId>
            <version>2.2.3.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-coreartifactId>
            <version>5.4.9.Finalversion>
        dependency>

        
        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-entitymanagerartifactId>
            <version>5.4.9.Finalversion>
        dependency>

         
        <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-validatorartifactId>
            <version>6.0.18.Finalversion>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-ormartifactId>
            <version>5.1.9.RELEASEversion>
        dependency>
    dependencies>

2.配置Spring的配置文件(整合Spring Data Jpa)
注意:mysql指定数据库方言时,新版本要用MySQL5Dialect
老版本用MySQLDialect
不然会连接数据库异常


    <context:property-placeholder location="classpath:druid.properties"/>
    <context:component-scan base-package="com.sinosoft"/>

    
    
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource">property>
        
        <property name="packagesToScan" value="com.sinosoft.entity">property>
        
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider">bean>
        property>

        
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                
                <property name="generateDdl" value="false">property>
                
                <property name="database" value="MYSQL">property>
                
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect">property>
                
                <property name="showSql" value="true">property>
            bean>
        property>
    bean>

    
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${Jdbc.driverClassName}">property>
        <property name="url" value="${Jdbc.url}">property>
        <property name="username" value="${Jdbc.username}">property>
        <property name="password" value="${Jdbc.pwd}">property>
    bean>

    
    <jpa:repositories
            base-package="com.sinosoft.dao"
            transaction-manager-ref="transactionManager"
            entity-manager-factory-ref="entityManagerFactory">
    jpa:repositories>

    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory">property>
    bean>

3.编写实体类,使用JPA注解配置映射关系
一定要生成Getter/Setter方法

@Entity//告诉JPA这是一个实体类(和数据表映射的类)
@Table(name = "users")//指定来和哪个数据表进行映射;如果省略那么默认是表名小写
public class Users {
    @Id//主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//自增主键
    private Integer id;
    @Column//省略默认列名就是属性名
    private String name;
    @Column //指定表名
    private String pwd;
    @Column
    private String email;

4.编写一个符合SpringDataJpa的dao层接口

  • 只需要编写dao层接口,无需实现类
  • dao层接口规范
    1.需要继承两个接口(JpaRepository,JpaSpecificationExecutor)
    2.需要提供响应的泛型
/*
* 符合SpringDataJpa的dao层接口规范
*   JpaRepository<操作的实体类,实体类主键的类型>
        封装了基本的CRUD操作
    JpaSpecificationExecutor<操作的实体类>
    *   封装了复杂查询(例如分页)
* */


public interface UsersDao extends JpaRepository<Users,Integer>, JpaSpecificationExecutor<Users> {
}

5.测试dao层接口

  1. finall() :查询所有用户
  2. save(users) :报错或者更新(依据:传递的实体类对象中,是否包含id属性)
  3. delete(id) :根据id删除
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UsersDaoTest {

    @Autowired
    UsersDao usersDao;

    /**
     * 查询所有
     */
    @Test
    public void findTest(){
        List<Users> all = usersDao.findAll();
        System.out.println(all);
    }

    /**
     * save:保存或者更新
     *      根据传递的对象是否存在主键id
     *      如果没有id属性:保存
     *      存在id数据,根据id查询数据,更新数据
     */
    @Test
    public void saveTest(){
        Users users = new Users();
        users.setName("吴彦祖");
        users.setPwd("123");
        users.setEmail("[email protected]");
        usersDao.save(users);
    }

    /**
     * 如果传递的对象有id属性,保存会变成更新
     * 并且没有赋值的实体类属性,表中对应的字段会自动变成Null
     */
    @Test
    public void updateTest(){
        Users users = new Users();
        users.setId(28);
        users.setName("wms吴彦祖");
        users.setPwd("123");
        usersDao.save(users);
    }

    /*
    * 根据id删除
    * */
    @Test
    public void deleteTest(){
        usersDao.deleteById(28);
    }

6.SpringDataJpa的运行过程和原理剖析
1.通过JdkDynamicAopProxy的invoke方法创建了一个动态代理对象
2.SimpleJpaRepository当中封装了Jpa的操作(借助JPA的api完成数据的CRUD)
3.通过hibernate完成数据库操作(封装了jdbc)

SpringDataJpa入门案例(一)_第1张图片

你可能感兴趣的:(新姿势)