SpringDataJpa入门案例(一)

SpringDataJpa的入门操作

一、搭建环境

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

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

    <dependencies>
        <!--连接池-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.4</version>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/jstl/jstl -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!--mysql数据库连接-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>

        <!--json-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>


        <!--Spring相关jar包-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

        <!--测试包-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.5.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--AOP相关jar包-->
        <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <!--Springmvc的jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <!--SpringDataJpa依赖包-->
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.2.3.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.9.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.9.Final</version>
        </dependency>

         <!--https://mvnrepository.com/artifact/org.hibernate/hibernate-validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.18.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
    </dependencies>

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

<!--导入配置文件-->
    <context:property-placeholder location="classpath:druid.properties"/>
    <context:component-scan base-package="com.sinosoft"/>

    <!--spring 和 spring data jsp的配置-->
    <!--1.创建entityManagerFactory对象交给Spring管理-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!--包扫描,扫描实体类所在的包-->
        <property name="packagesToScan" value="com.sinosoft.entity"></property>
        <!--jpa实现的厂家-->
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider"></bean>
        </property>

        <!--jpa供应商适配器-->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--是否自动创建数据库表-->
                <property name="generateDdl" value="false"></property>
                <!--指定数据库类型-->
                <property name="database" value="MYSQL"></property>
                <!--指定数据库方言,新版本用MySQL5Dialect-->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"></property>
                <!--是否在控制台显示sql语句-->
                <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,扫描DAO层,事务配置,实例类-->
    <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("123@qq.com");
        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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值