Spring Data JPA学习笔记

Spring Data JPA学习笔记

前言
涉及的技术
  • Hibernate
  • JPA标准
  • Hibernate JPA
  • Spring Data
  • Spring Data JPA
  • Spring Data Redis

一 、Hibernate

简介:轻量级的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动的生成SQL语句,自动执行。
TODO:Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。什么是EJB、CMP?

1、Hibernate添加、修改、删除操作

(1)导入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.27.0-GA</version>
        </dependency>
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>5.1.2.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-jta_1.1_spec -->
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.4</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>

(2)配置文件 applicationContext.xml 和 jdbc.properties
① applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

        <!--spring整理hibernate-->

        <!-- 配置读取properties文件的工具类  -->
        <context:property-placeholder location="jdbc.properties"/>
        <!-- 配置C3P0数据库连接池  -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="driverClass" value="${jdbc.driver.class}"/>
            <property name="user"   value="${jdbc.username}"/>
            <property name="password" value="${jdbc.passsword}"/>
        </bean>
        <!-- 配置Hibernate的SessionFactory  -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <!-- hibernateProperties属性,配置与hibernate相关的内容,如果显示sql语句,开启正向工程-->
            <property name="hibernateProperties">
                <props>
                    <!-- 显示当前执行的sql语句 -->
                    <prop key="hibernate.show_sql">true</prop>
                    <!--  开启正向工程 -->
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                </props>
            </property>

            <!-- 扫描实体所在的包 -->
            <property name="packagesToScan">
                <list>
                    <value>it.imut.pojo</value>
                </list>
            </property>
        </bean>
        <!-- 配置HibernateTemplate对象 -->
        <!-- tip: hibernateTemplate中封装了方法使用模板,在使用hibernateTemplate时需要获取sessionFactory -->
        <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <!-- 配置Hibernate的事务管理器  -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <!-- 配置开启注解事务处理  -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        <!-- 配置springIOC的注解扫描  -->
        <context:component-scan base-package="it.imut"/>
</beans>

② jdbc.properties

jdbc.url=jdbc:mysql://localhost:3306/springdata_test?serverTimezone=UTC
jdbc.driver.class=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.passsword=123456

(3) pojo 实体创建

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "admin_user")  //对应表名,如果数据库中没有此表,会自动创建
@Data
public class AdminUser implements Serializable {
    @Id	//标记主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略自增长
    @Column(name = "aid")    // 属性与表的行名映射
    private Integer aid;
    @Column(name = "aname")
    private String aname;
    @Column(name = "aage")
    private Integer aage;

}

(4)持久层DAO,查询,更新,删除操作
① 接口AdminUserDao


import it.imut.pojo.AdminUser;
import java.util.List;

public interface AdminUsersDao {
    void insertAdminUsers(AdminUser adminUser);
    void updateAdminUsers(AdminUser adminUser);
    void deleAdminUsers(AdminUser adminUser);
    AdminUser selectUserById(Integer aid); 
}

② AdminUserDaoImpl实现类

import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository
public class AdminUserImpl implements AdminUsersDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    public void insertAdminUsers(AdminUser adminUser) {
        this.hibernateTemplate.save(adminUser);
    }

    public void updateAdminUsers(AdminUser adminUser) {
        this.hibernateTemplate.update(adminUser);
    }

    public void deleAdminUsers(AdminUser adminUser) {
        this.hibernateTemplate.delete(adminUser);
    }

    public AdminUser selectUserById(Integer aid) {
        return this.hibernateTemplate.get(AdminUser.class, aid);
    }
}

(4)测试类AdminUserDaoImplTest

import it.imut.pojo.AdminUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AdminUserDaoImplTest {
    @Autowired
    private AdminUsersDao adminUsersDao;

    /**
     * 添加用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesInsertAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAid(1);
        adminUser.setAname("111");
        adminUser.setAage(23);
        this.adminUsersDao.insertAdminUsers(adminUser);
    }

    /**
     * 更新用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesUpdateAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAid(3);
        adminUser.setAname("张宏宇");
        adminUser.setAage(23);
        this.adminUsersDao.deleAdminUsers(adminUser);
    }

    /**
     * 删除用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesDeleteAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAid(3);
        this.adminUsersDao.updateAdminUsers(adminUser);
    }

    /**
     * 查询用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesSelectAdminUser(){
        AdminUser adminUser = this.adminUsersDao.selectUserById(3);
        System.out.println(adminUser.toString());
    }
}

Tip::如果不关掉默认回滚,事务提交了会自动回滚,数据无法落库。
TODO: 在正常的业务当中数据库的事务放在MVC框架的哪一层最合理?
1、事务一般放在业务层,即SERVICE层
解释:银bai行转账,如果放DAO层的话,我把钱转给别人我扣了一百,别人加上一百的时候,出错了,结果,我亏了100。
通俗易懂:为了规避在业务代码执行过程中发生意外错误,导致一次业务操作没有将所以的数据落库,造成了脏数据。通过事务的方式将一次业务中的所有数据库操作绑定在一起。(快照)小白自我理解,欢迎大神指正。

2、Hibernate HQL 查询

(1)interface AdminUsersDao



import it.imut.pojo.AdminUser;
import java.util.List;

public interface AdminUsersDao {
    List<AdminUser> selectAdminUserByName(String name); 
}


(2)AdminUserImpl


import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository
public class AdminUserImpl implements AdminUsersDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    public List<AdminUser> selectAdminUserByName(String name) {
        //getCurrentSession:当前session必须要有事务便捷,且只能处理一个事务。当事务提交或者回滚后session自动失效
        //openSession:每次都会打开新的session,假如每次使用多次,则获得的是不同的Session对象。使用完毕后我们需要手动的调用close方法关闭
        Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
        //sql: select * from admin_user where aname =
        Query query = session.createQuery("from AdminUser where aname = :abc");
        Query queryTemp = query.setString("abc", name);
        return queryTemp.list();
    }
}

(3)测试方法:AdminUserDaoImplTest

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AdminUserDaoImplTest {
    @Autowired
    private AdminUsersDao adminUsersDao;
    /**
     * HQL测试
     */
    @Test
    @Transactional  //HQL查询必须有事务  
    public void testSelectAdminUserByName(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByName("222");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }
}

3、Hibernate SQL 和 QBC 查询

(1)AdminUserDao


import it.imut.pojo.AdminUser;
import java.util.List;

public interface AdminUsersDao {
    List<AdminUser> selectAdminUserByNameSql(String name);   //SQL
    List<AdminUser> selectAdminUserByNameCriteria(String name);   //QBC
}

(2)AdminUserDaoImpl


import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository
public class AdminUserImpl implements AdminUsersDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    public List<AdminUser> selectAdminUserByNameSql(String name) {
        Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
        Query query = session.createSQLQuery("select * from admin_user where aname = ?").addEntity(AdminUser.class).setString(1,name);
        return query.list();
    }

    public List<AdminUser> selectAdminUserByNameCriteria(String name) {
        Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
        //sql select * from admin_user where aname = '222'
        Criteria criteria = session.createCriteria(AdminUser.class);
        Criteria criteria1 = criteria.add(Restrictions.eq("aname", name));
        return criteria1.list();
    }
}

(3) AdminUserDaoImplTest

import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AdminUserDaoImplTest {
    @Autowired
    private AdminUsersDao adminUsersDao;
    
    /**
     * HQL测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByName(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByName("222");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }

    /**
     * SQL测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByNameSQL(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByNameSql("222");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }

    /**
     * QBC测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByNameQBC(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByNameCriteria("222");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }
}

二、JPA 标准

简介:JPA(Java Persistence API)中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体持久化到数据库中。

通俗易懂:Sun公司提供了一对对于持久层操作的标准(接口+文档)      “车同轨书同文	”

三、Hibernate JPA

简介:Hibernate在3.2以后根据JPA规范提供了一套操作持久层的API

1、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>it.imut</groupId>
    <artifactId>study_202101</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.27.0-GA</version>
        </dependency>
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>5.1.2.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-jta_1.1_spec -->
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.4</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

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

    </dependencies>

</project>
2、applicationContext.xml 、jdbc.properties

① applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

        <!--spring整理hibernate-->

        <!-- 配置读取properties文件的工具类  -->
        <context:property-placeholder location="jdbc.properties"/>
        <!-- 配置C3P0数据库连接池  -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="driverClass" value="${jdbc.driver.class}"/>
            <property name="user"   value="${jdbc.username}"/>
            <property name="password" value="${jdbc.passsword}"/>
        </bean>
        <!-- Spring整合JPA 配置EntityManagerFactory -->
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <!-- Hibernate相关的属性注入 -->
                    <!-- 配置数据库类型 -->
                    <property name="database" value="MYSQL"/>
                    <!-- 正向工程自动创建表 -->
                    <property name="generateDdl" value="true"/>
                    <!-- 显示执行的SQL -->
                    <property name="showSql" value="true"/>
                </bean>
            </property>
            <!-- 配置扫描实体的包 -->
            <property name="packagesToScan">
                <list>
                    <value>it.imut.pojo</value>
                </list>
            </property>
        </bean>

        <!-- 配置Hibernate的事务管理器  -->
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
        </bean>
        <!-- 配置开启注解事务处理  -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        <!-- 配置springIOC的注解扫描  -->
        <context:component-scan base-package="it.imut"/>
</beans>

② jdbc.properties

jdbc.url=jdbc:mysql://localhost:3306/springdata_test?serverTimezone=UTC
jdbc.driver.class=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.passsword=123456
3、it.imut.pojo.AdminUser
package it.imut.pojo;

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "admin_user")
@Data
public class AdminUser implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略自增长
    @Column(name = "aid")
    private Integer aid;
    @Column(name = "aname")
    private String aname;
    @Column(name = "aage")
    private Integer aage;

}
4、it.imut.dao.AdminUserDao
package it.imut.dao;

import it.imut.pojo.AdminUser;
import java.util.List;

public interface AdminUsersDao {
    void insertAdminUsers(AdminUser adminUser);
    void updateAdminUsers(AdminUser adminUser);
    void deleAdminUsers(AdminUser adminUser);
    AdminUser selectUserById(Integer aid); 
    List<AdminUser> selectAdminUserByName(String name);
    List<AdminUser> selectAdminUserByNameSql(String name);
    List<AdminUser> selectAdminUserByNameCriteria(String name);
    }

}
4、it.imut.dao.impl.AdminUserDaoImpl
package it.imut.dao.impl;

import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
@Repository
public class AdminUserImpl implements AdminUsersDao {
    @PersistenceContext(name = "entityManagerFactory")
    private EntityManager entityManager;
    public void insertAdminUsers(AdminUser adminUser) {
        this.entityManager.persist(adminUser);
    }

    public void updateAdminUsers(AdminUser adminUser) {
        this.entityManager.merge(adminUser);
    }

    public void deleAdminUsers(AdminUser adminUser) {
        AdminUser admin = this.selectUserById(adminUser.getAid());    //重点:先查后删
        this.entityManager.remove(admin);
    }

    public AdminUser selectUserById(Integer aid) {
        return this.entityManager.find(AdminUser.class,aid);
    }
    //HQL
    public List<AdminUser> selectAdminUserByName(String name) {
        return this.entityManager.createQuery("from AdminUser where aname = :abc").setParameter("abc",name).getResultList();
    }
 	//SQL
    public List<AdminUser> selectAdminUserByNameSql(String name) {
        return this.entityManager.createNativeQuery("select * from admin_user where aname = ?", AdminUser.class).setParameter(1,name).getResultList();
    }
    //QBC
    public List<AdminUser> selectAdminUserByNameCriteria(String name) {
        //CriteriaBuilder对象:创建一个CriteriaQuery
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        //CriteriaQuery对象:执行查询的Criteria对象    select * from admin_user
        CriteriaQuery<AdminUser> query = builder.createQuery(AdminUser.class);
        //获取查询的实体类对象
        Root<AdminUser> root = query.from(AdminUser.class);
        //封装查询条件
        Predicate cate = builder.equal(root.get("aname"), name);
        //select * from admin_user where aname = ?
        query.where(cate);
        //执行查询
        TypedQuery<AdminUser> typedQuery = this.entityManager.createQuery(query);
       return typedQuery.getResultList();
    }
}

4、测试类:AdminUserDaoImplTest
import it.imut.dao.AdminUsersDao;
import it.imut.pojo.AdminUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AdminUserDaoImplTest {
    @Autowired
    private AdminUsersDao adminUsersDao;

    /**
     * 添加用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesInsertAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAname("张宏宇");
        adminUser.setAage(23);
        this.adminUsersDao.insertAdminUsers(adminUser);
    }

    /**
     * 更新用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesUpdateAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAid(4);
        adminUser.setAname("张宏宇");
        adminUser.setAage(23);
        this.adminUsersDao.updateAdminUsers(adminUser);
    }

    /**
     * 删除用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesDeleteAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAid(3);
        this.adminUsersDao.deleAdminUsers(adminUser);
    }

    /**
     * 查询用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesSelectAdminUser(){
        AdminUser adminUser = this.adminUsersDao.selectUserById(3);
        System.out.println(adminUser.toString());
    }
	
    /**
     * HQL测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByName(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByName("张宏宇");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }
    /**
     * SQL测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByNameSQL(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByNameSql("张宏宇");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }
	/**
     * QBC测试
     */
    @Test
    @Transactional
    public void testSelectAdminUserByNameQBC(){
        List<AdminUser> adminUsers = this.adminUsersDao.selectAdminUserByNameCriteria("222");
        for (AdminUser a: adminUsers) {
            System.out.println(a);
        }
    }
}

四、Spring Data

简介:Spring Data的任务是为数据访问提供一个熟悉且一致的,基于Spring的编程模型的数据接口,同时仍保留基础数据存储的特​​殊特征。
它使用数据访问技术,关系和非关系数据库,map-reduce框架以及基于云的数据服务变得容易。 这是一个总括项目,其中包含许多特定于给定数据库的子项目。 这些项目是与这些令人兴奋的技术背后的许多公司和开发人员共同开发的。

五、Spring Data JPA

简介:Spring Data JPA是较大的Spring Data系列的一部分,可轻松实现基于JPA的存储库。 该模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术的Spring支持的应用程序变得更加容易。
实现应用程序的数据访问层已经有一段时间了。 为了执行简单查询以及执行分页和审核,必须编写太多样板代码。 Spring Data JPA旨在通过将工作量减少到实际需要的数量来显着改善数据访问层的实施。 作为开发人员,您将编写包括自定义finder方法在内的存储库接口,Spring会自动提供实现。
Demo:
1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>it.imut</groupId>
    <artifactId>springdatajpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.4.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.27.0-GA</version>
        </dependency>
        <dependency>
            <groupId>org.jboss</groupId>
            <artifactId>jandex</artifactId>
            <version>2.1.3.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>5.1.2.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.4.27.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-jta_1.1_spec -->
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jta_1.1_spec</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.6</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.4</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

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

        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-commons -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>2.0.0-alpha1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.4.3</version>
        </dependency>


    </dependencies>

</project>

2、applicationContext.xml && jdbc.properties

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/data/jpa
        https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
    <!--springdata jpa-->

    <!--&lt;!&ndash; 配置读取properties文件的工具类  &ndash;&gt;-->
    <context:property-placeholder location="jdbc.properties"/>
   <!-- &lt;!&ndash; 配置C3P0数据库连接池  &ndash;&gt;-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="driverClass" value="${jdbc.driver.class}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.passsword}"/>
    </bean>
   <!-- &lt;!&ndash; Spring整合JPA 配置EntityManagerFactory &ndash;&gt;-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
               <!-- &lt;!&ndash; Hibernate相关的属性注入 &ndash;&gt;-->
                <!--&lt;!&ndash; 配置数据库类型 &ndash;&gt;-->
                <property name="database" value="MYSQL"/>
                <!--&lt;!&ndash; 正向工程自动创建表 &ndash;&gt;-->
                <property name="generateDdl" value="true"/>
               <!-- &lt;!&ndash; 显示执行的SQL &ndash;&gt;-->
                <property name="showSql" value="true"/>
            </bean>
        </property>
       <!-- &lt;!&ndash; 配置扫描实体的包 &ndash;&gt;-->
        <property name="packagesToScan">
            <list>
                <value>it.imut.pojo</value>
            </list>
        </property>
    </bean>

  <!--  &lt;!&ndash; 配置Hibernate的事务管理器  &ndash;&gt;-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
   <!-- &lt;!&ndash; 配置开启注解事务处理  &ndash;&gt;-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
   <!-- &lt;!&ndash; 配置springIOC的注解扫描  &ndash;&gt;-->
    <context:component-scan base-package="it.imut"/>
    <!-- Spring Data Jpa 的配置 -->
    <jpa:repositories base-package="it.imut.dao"/>
</beans>
jdbc.url=jdbc:mysql://localhost:3306/springdata_test?serverTimezone=UTC
jdbc.driver.class=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.passsword=123456

3、AdminUser

package it.imut.pojo;

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "admin_user")
@Data
public class AdminUser implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略自增长
    @Column(name = "aid")
    private Integer aid;
    @Column(name = "aname")
    private String aname;
    @Column(name = "aage")
    private Integer aage;

}

4、AdminUserDao

package it.imut.dao;

import it.imut.pojo.AdminUser;
import org.springframework.data.jpa.repository.JpaRepository;

public interface AdminUserDao extends JpaRepository<AdminUser, Integer> {
}

5、AdminUserDaoTest

package it.imut;

import it.imut.dao.AdminUserDao;
import it.imut.pojo.AdminUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AdminUserDaoTest {
    @Autowired
    private AdminUserDao adminUserDao;
    /**
     * 添加用户
     */
    @Test
    @Transactional//测试类对于事务的提交方式默认回滚
    @Rollback(false)
    public void TesInsertAdminUser(){
        AdminUser adminUser = new AdminUser();
        adminUser.setAname("111");
        adminUser.setAage(23);
        adminUserDao.save(adminUser);
    }
}

待补充SpringDataJPA学习笔记

六、Spring Data Redis

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值