Springdatajpa-day1

配置applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!-- 扫描service部分的包 -->
<context:component-scan base-package="cn.itsource.pss.service" />
<context:property-placeholder location="classpath:jdbc.properties" />

<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <!--连接数据4个属性 -->
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <!--maxActive: 最大连接数量 -->
    <property name="maxActive" value="150" />
    <!--minIdle: 最小空闲连接 -->
    <property name="minIdle" value="5" />
    <!--maxIdle: 最大空闲连接 -->
    <property name="maxIdle" value="20" />
    <!--initialSize: 初始化连接 -->
    <property name="initialSize" value="30" />
    <!-- 用来配置数据库断开后自动连接的 -->
    <!-- 连接被泄露时是否打印 -->
    <property name="logAbandoned" value="true" />
    <!--removeAbandoned: 是否自动回收超时连接 -->
    <property name="removeAbandoned" value="true" />
    <!--removeAbandonedTimeout: 超时时间(以秒数为单位) -->
    <property name="removeAbandonedTimeout" value="10" />
    <!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒 -->
    <property name="maxWait" value="1000" />
    <!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
    <property name="timeBetweenEvictionRunsMillis" value="10000" />
    <!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
    <property name="numTestsPerEvictionRun" value="10" />
    <!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程 -->
    <property name="minEvictableIdleTimeMillis" value="10000" />
    <property name="validationQuery" value="SELECT NOW() FROM DUAL" />
</bean>

<!-- 集成hibernate的jpa功能 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!--待扫描的实体类包,不再需要persistence.xml了 -->
    <property name="packagesToScan" value="cn.itsource.aisell.domain" />
    <!-- 3.配置JPA的实现 -->
    <!-- private JpaVendorAdapter jpaVendorAdapter; -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <!-- org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter -->
            <!-- private boolean showSql = false;是否显示sql语句 -->
            <property name="showSql" value="true" />
            <!-- private boolean generateDdl = false;是否建表 -->
            <property name="generateDdl" value="false" />
            <!-- private String databasePlatform;原来方言 -->
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
        </bean>
    </property>
</bean>

<!-- Jpa 事务配置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 注解声明式事务管理 -->
<tx:annotation-driven />

<!-- Spring Data Jpa配置 ********************************************-->
<!-- base-package:扫描的包 dao层 -->
<jpa:repositories base-package="cn.itsource.pss.repository" transaction-manager-ref="transactionManager"
                  entity-manager-factory-ref="entityManagerFactory" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

准备一个父类domain(提取公共id,避免每次重复创id)

import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

//不用保存到数据库
@MappedSuperclass
//抽取一个公共类,创建id字段,避免多次创建
public class BaseDomain {
@Id
@GeneratedValue
private Long id;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

子类继承(之后的管理者,菜单,员工各种属性直接写自己独有的字段+继承父类domain id属性)

@Entity
public class Employee extends BaseDomain {
private String username;

private String password;

private String email;

private Integer age;

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Override
public String toString() {
    return "Employee{" +
            "username='" + username + '\'' +
            ", password='" + password + '\'' +
            ", email='" + email + '\'' +
            ", age=" + age +
            '}';
}

SpringDataJpa:

它是JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL的查询语句 ,是属于Spring的生成体系中的一部分。减少开发的工作量,大大提高了开发效率

JpaRepository的CRUD

package cn.itsource.aisell;


import cn.itsource.aisell.domain.Employee;
import cn.itsource.aisell.repository.EmployeeRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.List;

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

    @Autowired
    private EmployeeRepository employeeRepository;

    //查询所有
    @Test
    public void testfindAll()throws Exception{
        for (Employee employee : employeeRepository.findAll()) {
            System.out.println(employee);

        }
    }
    //保存
    @Test
    public void testSave()throws Exception{
        Employee employee = new Employee();
        employee.setUsername("玉帝");
        employee.setPassword("123");
        employee.setAge(9999);

        employeeRepository.save(employee);
    }
    //修改
    @Test
    public void testName()throws Exception{
        Employee employee = new Employee();
        employee.setId(274L);
        employee.setUsername("玉皇大帝");
        employee.setEmail("scy@qq.com");

        employeeRepository.save(employee);
    }

    //删除
    @Test
    public void testdelete()throws Exception{
        employeeRepository.delete(274L);
    }

    //删除多条
    @Test
    public void testdelete2()throws Exception{
        List<Employee> list = new ArrayList<>();
        Employee employee = new Employee();
        employee.setId(275L);
        Employee employee1 = new Employee();
        employee1.setId(273L);
        list.add(employee);
        list.add(employee1);

        employeeRepository.deleteInBatch(list);

    }
    //查询表里面总的记录数
    @Test
    public void testConut()throws Exception{
        long count = employeeRepository.count();
        System.out.println(count);

    }

    //分页
    @Test
    public void testPage()throws Exception{
        Pageable pageable = new PageRequest(1, 10);
        Page<Employee> page = employeeRepository.findAll(pageable);
        //总条数
        long totalElements = page.getTotalElements();
        System.out.println(totalElements);

        //总共的页数
        int totalPages = page.getTotalPages();
        System.out.println(totalPages);

        //每页的数据,一共10条
        List<Employee> content = page.getContent();
        for (Employee employee : content) {
            System.out.println(employee);
        }

        //当前页
        int number = page.getNumber();
        System.out.println(number);

        //每页多少条数据
        int numberOfElements = page.getNumberOfElements();
        System.out.println(numberOfElements);
    }

    //排序 按照 age 升序或降序排序
    @Test
    public void testSort()throws Exception{
        //按照年龄升序排序
        Sort sort = new Sort(Sort.Direction.ASC,"age");
        List<Employee> list = employeeRepository.findAll(sort);
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    //分页和排序 结合起来使用
    @Test
    public void testPageAndSort()throws Exception{
        Sort sort = new Sort(Sort.Direction.ASC,"age");
        Pageable pageable = new PageRequest(0, 10,sort);
        Page<Employee> page = employeeRepository.findAll(pageable);
        List<Employee> content = page.getContent();
        for (Employee employee : content) {
            System.out.println(employee);
        }

    }
    //按照条件规则查询 适合简单sql 或者条件比较少的sql
    @Test
    public void testfindByUsernameLike()throws Exception{
        List<Employee> byUsernameLike = employeeRepository.findByUsernameLike("%s%");
        for (Employee employee : byUsernameLike) {
            System.out.println(employee);

        }
    }
    //查询指定的名称
    @Test
    public void testName1()throws Exception{
        List<Employee> list = employeeRepository.findByUsername("玉帝");
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    //年龄小于<20
    @Test
    public void testName2()throws Exception{
        List<Employee> list = employeeRepository.findByAgeLessThan(20);
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    //注解查询
    @Test
    public void testName3()throws Exception{
        Employee employee = employeeRepository.queryEmployee();
        System.out.println(employee);
    }
    //根据员工用户名和密码模糊查询
    @Test
    public void testName4()throws Exception{
        List<Employee> list = employeeRepository.queryEmployee1("%玉%", "%1%");
        for (Employee employee : list) {
            System.out.println(list);
        }
    }
    //根据员工用户名和年龄具体查询
    @Test
    public void testName5()throws Exception{
        List<Employee> list = employeeRepository.queryEmployee2("admin", 34);
        for (Employee employee : list) {
            System.out.println(employee);

        }
    }
    //查询员工的平均年龄
    @Test
    public void testName6()throws Exception{
        Integer integer = employeeRepository.queryEmployee3();
        System.out.println(integer);

    }
}

规则查询

package cn.itsource.aisell.repository;

import cn.itsource.aisell.domain.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface EmployeeRepository extends JpaRepository<Employee,Long> {
    //模糊查询
    public List<Employee> findByUsernameLike(String username);
    //根据名称查询
    public List<Employee> findByUsername(String username);
    //age小于
    public List<Employee> findByAgeLessThan(Integer age);

    //注解查询
    @Query("select o from Employee o where o.age = (select min(p.age) from Employee p)")
    public Employee queryEmployee();

    //根据员工用户名和密码模糊查询
    @Query("select o from Employee o where o.username like ?1 and o.password like ?2")
    public List<Employee> queryEmployee1(String username,String password);

    //根据员工用户名和年龄具体查询
    @Query("select o from Employee o where o.username like :username and o.age like :age")
    public List<Employee> queryEmployee2(@Param("username") String username,@Param("age") Integer age);

    //原生sql的支持
    @Query(value = "select avg(e.age) from  Employee e",nativeQuery = true)
    public Integer queryEmployee3();
}

注解式

 //查询指定的名称
    @Test
    public void testName1()throws Exception{
        List<Employee> list = employeeRepository.findByUsername("玉帝");
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    //年龄小于<20
    @Test
    public void testName2()throws Exception{
        List<Employee> list = employeeRepository.findByAgeLessThan(20);
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    //注解查询
    @Test
    public void testName3()throws Exception{
        Employee employee = employeeRepository.queryEmployee();
        System.out.println(employee);
    }
    //根据员工用户名和密码模糊查询
    @Test
    public void testName4()throws Exception{
        List<Employee> list = employeeRepository.queryEmployee1("%玉%", "%1%");
        for (Employee employee : list) {
            System.out.println(list);
        }
    }
    //根据员工用户名和年龄具体查询
    @Test
    public void testName5()throws Exception{
        List<Employee> list = employeeRepository.queryEmployee2("admin", 34);
        for (Employee employee : list) {
            System.out.println(employee);

        }
    }
    //查询员工的平均年龄
    @Test
    public void testName6()throws Exception{
        Integer integer = employeeRepository.queryEmployee3();
        System.out.println(integer);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值