01.SpringDataJPA——前置内容:整合Hibernate以及整合HibernateJPA

一、整合Hibernate

1.创建项目

在这里插入图片描述

2.添加相关的依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.7.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
    </dependencies>

3.添加相关的配置文件

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 引入db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 创建druid 的数据源 -->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 配置Hibernate的SessionFactory对象 -->
    <bean class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" id="sessionFactory">
        <!--关联数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置Hibernate的属性信息 -->
        <property name="hibernateProperties">
            <props>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!--扫描路径-->
        <property name="packagesToScan">
            <list>
                <value>com.biao.pojo</value>
            </list>
        </property>
    </bean>
    
    <!-- 配置HibernateTemplate对象 -->
    <bean class="org.springframework.orm.hibernate5.HibernateTemplate" id="hibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
    <!-- 配置事务管理 -->
    <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" id="transactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
    <!-- 配置开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <!-- 配置扫描路径 -->
    <context:component-scan base-package="com.biao"/>

</beans>

4.创建POJO

和表结构中的t_user表对应即可

4.1 接口

package com.biao.pojo;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "t_user")
public class Users implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Integer userId;
    
    @Column(name = "user_name")
    private String userName;
    
    @Column(name = "real_name")
    private String realName;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }
}

4.2 接口实现类

package com.biao.dao.impl;

import com.biao.dao.IUserDao;
import com.biao.pojo.Users;
import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
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 UserDaoImpl implements IUserDao {

    @Autowired
    private HibernateTemplate template;

    public void insertUsers(Users users) {
        this.template.save(users);
    }

    public void updateUsers(Users users) {
        this.template.update(users);
    }

    public void deleteUsers(Users users) {
        this.template.delete(users);
    }

    public Users selectUsersById(Integer userId) {
        return this.template.get(Users.class,userId);
    }

    public List<Users> selectUsersByName(String userName) {
        // 我们要执行特殊的查询操作 我们需要获取对应的Session对象
        Session session = this.template.getSessionFactory().getCurrentSession();
        // 通过Session对象创建Query对象 HQL 语句
        Query query = session.createQuery(" from Users where userName = :abc");
        Query queryTemp = query.setString("abc", userName);
        return queryTemp.list();
    }

    public List<Users> selectUsersByNameUseSQL(String userName) {
        // 我们要执行特殊的查询操作 我们需要获取对应的Session对象
        Session session = this.template.getSessionFactory().getCurrentSession();
        // 通过Session对象创建Query对象 SQL 语句
        Query query = session.createSQLQuery("select * from t_user where user_name = ?")
                .addEntity(Users.class)
                .setString(0, userName);
        return query.list();
    }

    public List<Users> selectUsersByNameUseCriteria(String userName) {
        Session session = this.template.getSessionFactory().getCurrentSession();
        Criteria criteria = session.createCriteria(BIConversion.User.class);
        criteria.add(Restrictions.eq("userName",userName));
        return criteria.list();
    }
}

5.测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {

    @Autowired
    private IUserDao dao;

    @Test
    @Transactional
    // 操作失败是否回滚
    @Rollback(false)
    public void testInsertUser(){
        Users user = new Users();
        user.setUserName("Tom");
        user.setRealName("张三丰");
        dao.insertUsers(user);
    }
}

在这里插入图片描述

测试查询用户

    @Test
    @Transactional
    public void testQuery1(){
        Users users = this.dao.selectUsersById(22);
        System.out.println(users);
    }

测试查询用户名称

    @Test
    @Transactional
    public void testQuery2(){
        List<Users> list = this.dao.selectUsersByName("Tom");
        for (Users u :
                list) {
            System.out.println(u);
        }
    }

二、Spring整合HibernateJPA

ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式。

现如今的ORM框架还是有比较多的,比如:Hibernate,TopLink以及OpenJPA等等,为了简化ORM框架的使用,JPA随之产生。

JPA是Java Persistent API的简称,中文名Java持久层API,由Sun公司提供了一对对于持久层操作的标准(接口+文档),说白了就是在各种ORM框架上封装了一套API实现统一操作。同时又依赖各种ORM框架去实现。

1.创建项目

创建一个普通的Maven项目
在这里插入图片描述

2.添加相关的依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.7.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.13.RELEASE</version>
        </dependency>
    </dependencies>

3.添加相关的配置文件

3.1db.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/logistics?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

3.2 Spring的配置文件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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 引入db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 创建druid 的数据源 -->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 配置Hibernate的SessionFactory对象 -->
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="sessionFactory">
        <!--关联数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!-- 配置Hibernate的属性信息 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="MYSQL"/>
                <property name="generateDdl" value="true"/>
                <property name="showSql" value="true"/>
            </bean>
<!--            <props>-->
<!--                <prop key="show_sql">true</prop>-->
<!--                <prop key="hibernate.hbm2ddl.auto">update</prop>-->
<!--            </props>-->
        </property>
        <!--扫描路径-->
        <property name="packagesToScan">
            <list>
                <value>com.biao.pojo</value>
            </list>
        </property>
    </bean>

    <!-- 配置事务管理 -->
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="sessionFactory"/>
    </bean>

    <!-- 配置开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- 配置扫描路径 -->
    <context:component-scan base-package="com.biao"/>

</beans>

4.创建pojo

package com.biao.pojo;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "t_user")
public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Integer userId;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "real_name")
    private String realName;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", realName='" + realName + '\'' +
                '}';
    }
}

5.创建持久层

5.1 接口

package com.biao.dao;

import com.biao.pojo.Users;

import java.util.List;

public interface IUserDao {

    void insertUsers(Users users);

    void updateUsers(Users users);

    void deleteUsers(Users users);

    Users selectUsersById(Integer userId);

    List<Users> selectUsersByName(String userName);

    List<Users> selectUsersByNameUseSQL(String userName);

    List<Users> selectUsersByNameUseCriteria(String userName);

}

5.2 接口实现类

package com.biao.dao.impl;

import com.biao.dao.IUserDao;
import com.biao.pojo.Users;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

@Repository
public class UserDaoImpl implements IUserDao {

    @PersistenceContext(name = "entityManagerFactory")
    private EntityManager manager;


    public void insertUsers(Users users) {
        manager.persist(users);
    }

    public void updateUsers(Users users) {
        manager.merge(users);
    }

    public void deleteUsers(Users users) {
        users = this.selectUsersById(users.getUserId());
        manager.refresh(users);
    }

    public Users selectUsersById(Integer userId) {
        return manager.find(Users.class,userId);
    }

    public List<Users> selectUsersByName(String userName) {
        return manager.createQuery(" from Users where userName = :abc")
                .setParameter("abc",userName)
                .getResultList();
    }

    public List<Users> selectUsersByNameUseSQL(String userName) {
        return manager.createQuery("select * from t_user where user_name = ?",Users.class)
                .setParameter(1,userName)
                .getResultList();
    }

    public List<Users> selectUsersByNameUseCriteria(String userName) {
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<Users> query = builder.createQuery(Users.class);
        Root<Users> root = query.from(Users.class);
        Predicate cate = builder.equal(root.get("userName"), userName);
        query.where(cate);
        TypedQuery<Users> typedQuery = manager.createQuery(query);
        return typedQuery.getResultList();
    }
}

6.测试

package com.biao.test;

import com.biao.dao.IUserDao;
import com.biao.pojo.Users;
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 org.springframework.transaction.annotation.Transactional;

import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test1 {

    @Autowired
    private IUserDao dao;

    @Test
    @Transactional
    // 操作失败是否回滚
    @Rollback(false)
    public void testInsertUser(){
        Users user = new Users();
        user.setUserName("Tom");
        user.setRealName("张三丰");
        dao.insertUsers(user);
    }

    @Test
    @Transactional
    public void testQuery1(){
        Users users = this.dao.selectUsersById(22);
        System.out.println(users);
    }

    @Test
    @Transactional
    public void testQuery2(){
        List<Users> list = this.dao.selectUsersByName("Tom");
        for (Users u :
                list) {
            System.out.println(u);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码报错<?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:comtext="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 1 准备目标类 --> <bean id="personDao" class="com.sc.spring.dao.impl.PersonDaoImpl"></bean> <!-- 2 准备增强类 --> <bean id="myAdvice" class="com.sc.spring.utils.MyAdvice"></bean> <!-- 3 织入 将增强类的增强方法应用到目标类的目标方法前后 --> <aop:config> <!-- pointcut标签声明切入点表达式 切入点表达式就是一种规则 spring aop根据规则找到满足规则的目标方法 然后对目标方法前后进行指定增强 --> <aop:pointcut id="pc" expression="execution(public boolean com.sc.spring.dao.impl.PersonDaoImpl.getPersonByUsernameAndPwd(java.lang.String,java.lang.String))"></aop:pointcut> <aop:aspect ref="myAdvice"> <!-- aop:before标签代表配置前置通知 method属性是配置增强类中哪个方法作为前置通知执行 --> <aop:before method="before" pointcut-ref="pc"></aop:before> </aop:aspect> </aop:config> </beans>报错问题是org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 22 in XML document from class path resource [aop.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 22; columnNumber: 17; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'aop:config' 的声明。
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值