spring整合dataJPA

该文介绍了如何使用SpringJPA与Druid数据源连接MySQL数据库,包括创建数据库表、添加依赖、配置文件设置、POJO对象定义、持久层接口实现以及单元测试。还展示了Repository接口的使用,如基于方法名的查询规则。
摘要由CSDN通过智能技术生成

1.入门案例

1.1 项目整体结构

表:sql

DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( user_id int(0) NOT NULL AUTO_INCREMENT, user_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, real_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, PRIMARY KEY (user_id) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 35 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

1.2 添加依赖包

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.6.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.1.8</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</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.1.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.9.0.RELEASE</version>
    </dependency>
</dependencies>

1.3 添加配置文件

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"
       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
       http://www.springframework.org/schema/data/jpa/spring-jpa.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对象 id必须得是 : entityManagerFactory -->
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          id="entityManagerFactory">
        <!-- 关联数据源 -->
        <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.bobo.pojo</value>
            </list>
        </property>
    </bean>


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

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

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

    <!--  Spring Data Jpa 配置-->
    <!-- 配置Dao的扫描 -->
    <jpa:repositories base-package="com.bobo.dao" />
</beans>

 db.properties

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

1.4 创建POJO对象

package com.bobo.pojo;

/**
 * @Auther: cuitao
 * @Date: 2023/7/14 - 07 - 14 - 8:58
 * @Description: com.bobo.dao
 */

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 + '\'' +
                '}';
    }
}

1.5 创建持久层

import com.bobo.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserDao extends JpaRepository<Users,Integer> {

}

 1.6 单元测试

package com.bobo.test;

import com.bobo.dao.UserDao;
import com.bobo.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;

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

    @Autowired
    private UserDao dao;


    @Test
    @Transactional
    @Rollback(false)
    public void test1(){
        Users user = new Users();
        user.setUserName("admin-jpa");
        user.setRealName("测试");
        dao.save(user);
    }
}

2. Repository接口

public interface Repository<T, ID extends Serializable> {
}

Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持 1)基于方法名称命名规则查询 2)基于@Query 注解查询

2.1 基于方法名称命名规则查询

 

 代码示例:

package com.bobo.dao;

import com.bobo.pojo.Users;
import org.springframework.data.repository.Repository;

import java.util.List;

/**
 * Repository接口的使用
 */
public interface UserDaoRepository extends Repository<Users, Integer> {
    //后缀Is表示 ==
    List<Users> findByUserNameIs(String string);


    List<Users> findByUserNameAndRealNameIs(String name, String realName);

    List<Users> findByRealNameIs(String name);

    Users findByUserNameAndUserId(String userName, Integer userId);

    List<Users> findByUserNameOrUserIdIs(String userName, Integer userId);

    List<Users> findUsersByRealNameOrAndUserIdIn(String realName, List<Integer> userIdList);

    Users findUsersByUserIdEquals(Integer userId);

    Users findByUserId(Integer userId);

    //    List<Users>findByUserIdBetween(List<Integer>userIds);
    List<Users> findByUserIdLessThan(Integer userId);

    List<Users> findByUserIdLessThanEqual(Integer userId);

    List<Users> findByUserIdGreaterThanEqual(Integer userId);

    List<Users> findByRealNameIsNull();

    List<Users> findByUserNameIsNotNull();

    List<Users> findByUserNameLike(String userName);

    List<Users> findByRealNameContaining(String userName);

    List<Users> findByUserNameStartingWith(String userName);

    List<Users> findByRealNameContainingOrderByUserIdDesc(String realName);
}
package com.bobo.dao;

import com.bobo.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.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class 基于方法名称命名规则查询 {

    @Autowired
    private UserDaoRepository dao;

    @Test
    @Transactional
    @Rollback(false)
    public void query1() {
        Users user = this.dao.findByUserNameAndUserId("测试", 1);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_name=? and users0_.user_id=?

        Users usersByUserIdEquals = this.dao.findUsersByUserIdEquals(1);//Equals ==sql中的  ==
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_id=?

        List<Users> usersList = this.dao.findByRealNameIs("成龙1"); //后缀Is 对应着 sql中的 ==
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.real_name=?

        List<Users> usersList1 = this.dao.findByUserNameOrUserIdIs("admin-jpa", 2);
        //select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
        // from t_user users0_ where users0_.user_name=? or users0_.user_id=?

        List<Users> usersList2 = this.dao.findUsersByRealNameOrAndUserIdIn("测试", Arrays.asList(1, 2));
        //select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
        // from t_user users0_ where users0_.real_name=? or users0_.user_id in (? , ?)

        Users byUserId = this.dao.findByUserId(1);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_id=?

        List<Users> byUserIdLessThan = this.dao.findByUserIdLessThan(10);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_id<?

        List<Users> byUserIdLessThanEqual = this.dao.findByUserIdLessThanEqual(10);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_id<=?

        List<Users> byUserIdGreaterThanEqual = dao.findByUserIdGreaterThanEqual(10);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_id>=?

        List<Users> byRealNameIsNull = dao.findByRealNameIsNull();
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.real_name is null

        List<Users> byUserNameIsNotNull = dao.findByUserNameIsNotNull();
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_name is not null

        dao.findByUserNameLike("测");
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_name like ?
        List<Users> byRealNameContaining = dao.findByRealNameContaining("龙");
        System.out.println("byRealNameContaining = " + byRealNameContaining);
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.real_name like ?
//        byRealNameContaining = [Users{userId=3, userName='chengnong0', realName='王龙'}, Users{userId=4,
//        userName='chengnong1', realName='李龙'}, Users{userId=5, userName='chengnong2', realName='成龙'},
//        Users{userId=6, userName='chengnong3', realName='成龙3'}, Users{userId=7, userName='chengnong4',
//        realName='成龙4'},

        dao.findByUserNameStartingWith("admin");
//        select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//        from t_user users0_ where users0_.user_name like ?%

        List<Users> 成龙 = dao.findByRealNameContainingOrderByUserIdDesc("成龙");
        System.out.println("成龙 = " + 成龙);
//       select users0_.user_id as user_id1_0_, users0_.real_name as real_nam2_0_, users0_.user_name as user_nam3_0_
//       from t_user users0_ where users0_.real_name like ? order by users0_.user_id desc



    }

   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值