Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作

1.maven 项目导入以下jar坐标


        
        5.0.2.RELEASE
        5.0.7.Final
        1.6.6
        1.2.12
        0.9.1.2
        5.1.6
    

    
        
        
            junit
            junit
            4.12
            test
        

        
        
            org.aspectj
            aspectjweaver
            1.6.8
        

        
            org.springframework
            spring-aop
            ${spring.version}
        

        
            org.springframework
            spring-context
            ${spring.version}
        

        
            org.springframework
            spring-context-support
            ${spring.version}
        

        
        
            org.springframework
            spring-orm
            ${spring.version}
        

        
            org.springframework
            spring-beans
            ${spring.version}
        

        
            org.springframework
            spring-core
            ${spring.version}
        

        

        
        
            org.hibernate
            hibernate-core
            ${hibernate.version}
        
        
            org.hibernate
            hibernate-entitymanager
            ${hibernate.version}
        
        
            org.hibernate
            hibernate-validator
            5.2.1.Final
        
        

        
        
            c3p0
            c3p0
            ${c3p0.version}
        
        

        
        
            log4j
            log4j
            ${log4j.version}
        

        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        

        
            org.slf4j
            slf4j-log4j12
            ${slf4j.version}
        
        


        
            mysql
            mysql-connector-java
            ${mysql.version}
        

        
        
            org.springframework.data
            spring-data-jpa
            1.9.0.RELEASE
        

        
            org.springframework
            spring-test
            ${spring.version}
        

        
        
            javax.el
            javax.el-api
            2.2.4
        

        
            org.glassfish.web
            javax.el
            2.2.4
        
        
    

2.写映射数据库表的实体类以及注解
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第1张图片

/**
 * 1.实体类和表的映射关系
 *      @Eitity
 *      @Table
 * 2.类中属性和表中字段的映射关系
 *      @Id
 *      @GeneratedValue
 *      @Column
 */
@Entity
@Table(name="cst_customer")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="cust_id")
    private Long custId;
    @Column(name="cust_address")
    private String custAddress;
    @Column(name="cust_industry")
    private String custIndustry;
    @Column(name="cust_level")
    private String custLevel;
    @Column(name="cust_name")
    private String custName;
    @Column(name="cust_phone")
    private String custPhone;
    @Column(name="cust_source")
    private String custSource;

    public Long getCustId() {
        return custId;
    }

    public void setCustId(Long custId) {
        this.custId = custId;
    }

    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    public String getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "custId=" + custId +
                ", custAddress='" + custAddress + '\'' +
                ", custIndustry='" + custIndustry + '\'' +
                ", custLevel='" + custLevel + '\'' +
                ", custName='" + custName + '\'' +
                ", custPhone='" + custPhone + '\'' +
                ", custSource='" + custSource + '\'' +
                '}';
    }

3.写接口,配置2个接口。
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第2张图片
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第3张图片
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第4张图片Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第5张图片

/**
 * 符合SpringDataJpa的dao层接口规范
 *      JpaRepository<操作的实体类类型,实体类中主键属性的类型>
 *          * 封装了基本CRUD操作
 *      JpaSpecificationExecutor<操作的实体类类型>
 *          * 封装了复杂查询(分页)
 */
public interface CustomerDao extends JpaRepository, JpaSpecificationExecutor {
    /**
     * 案例:根据客户名称查询客户
     *      使用jpql的形式查询
     *  jpql:from Customer where custName = ?
     *
     *  配置jpql语句,使用的@Query注解
     */
    @Query(value="from Customer where custName = ? ")
    public Customer findJpql(String custName);


    /**
     * 案例:根据客户名称和客户id查询客户
     *      jpql: from Customer where custName = ? and custId = ?
     *
     *  对于多个占位符参数
     *      赋值的时候,默认的情况下,占位符的位置需要和方法参数中的位置保持一致
     *
     *  可以指定占位符参数的位置
     *      ? 索引的方式,指定此占位的取值来源
     *      例如:custName = ?2(取参数第2个值) and custId = ?1(取参数第1个值)
     */
    @Query(value = "from Customer where custName = ?2 and custId = ?1")
    public Customer findCustNameAndId(Long id,String name);

    /**
     * 使用jpql完成更新操作
     *      案例 : 根据id更新,客户的名称
     *          更新4号客户的名称,将名称改为“黑马程序员”
     *
     *  sql  :update cst_customer set cust_name = ? where cust_id = ?
     *  jpql : update Customer set custName = ? where custId = ?
     *
     *  @Query : 代表的是进行查询
     *      * 声明此方法是用来进行更新操作
     *  @Modifying
     *      * 当前执行的是一个更新操作
     *
     */
    @Query(value = " update Customer set custName = ?2 where custId = ?1 ")
    @Modifying//这个查询是个修改操作
    public void updateCustomer(long custId,String custName);


    /**
     * 使用sql的形式查询:
     *     查询全部的客户
     *  sql : select * from cst_customer;
     *  Query : 配置sql查询
     *      value : sql语句
     *      nativeQuery : 查询方式
     *          true : sql查询
     *          false:jpql查询
     *      模糊查询的参数通配符,需要提前配置好,再传进来
     */
    //@Query(value = " select * from cst_customer" ,nativeQuery = true)
    @Query(value="select * from cst_customer where cust_name like ?",nativeQuery = true)
    public List findSql(String name);


    /**
     * 方法名的约定:
     *      findBy : 查询
     *            对象中的属性名(首字母大写) : 查询的条件
     *            CustName
     *            * 默认情况 : 使用 等于的方式查询
     *                  特殊的查询方式
     *
     *  findByCustName   --   根据客户名称查询
     *
     *  再springdataJpa的运行阶段
     *          会根据方法名称进行解析  findBy    from  xxx(实体类)
     *                                      属性名称      where  custName =
     *
     *      1.findBy  + 属性名称 (根据属性名称进行完成匹配的查询=)
     *      2.findBy  + 属性名称 + “查询方式(Like | isnull)”
     *          findByCustNameLike
     *      3.多条件查询
     *          findBy + 属性名 + “查询方式”   + “多条件的连接符(And|Or)”  + 属性名 + “查询方式”
     *
     *          模糊查询的参数通配符,需要提前配置好,再传进来,并且顺序必须一致
     */

    //根据列名查询的方法名约定
    public Customer findByCustName(String custName);

    //根据列名模糊查询的方法名约定,模糊的参数跟上通配符
    public List findByCustNameLike(String custName);

    //使用客户名称模糊匹配和客户所属行业精准匹配的查询,模糊的参数跟上通配符
    public Customer findByCustNameLikeAndCustIndustry(String custName,String custIndustry);
}
 
  

4.写applicationContext.xml 配置文件
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第6张图片Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第7张图片Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第8张图片




    

    
    
        
        
        
        
        
        
            
        

        
        
            
                
                
                
                
                
                
                
                
            
        

        
        
            
        

    

    
    
        
        
        
        
    

    
    

    
    
        
    

    

    
    

5.测试操作数据库,jpa,基本操作方式
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第9张图片Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第10张图片Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第11张图片

@RunWith(SpringJUnit4ClassRunner.class) //声明spring提供的单元测试环境
@ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring IOC容器的哪个配置信息
public class jpaTest {
    @Autowired //依据接口类型继承的2个jpa规范类,注入生成一个实体增删改查方法的属性
    private CustomerDao customerDao;

    /**
     * 根据id查询
     */
    @Test
    public void testFindOne() {
        Customer customer = customerDao.findOne(3L);
        System.out.println(customer);
    }

    /**
     * save : 保存或者更新
     *      根据传递的对象是否存在主键id,
     *      如果没有id主键属性:保存
     *      存在id主键属性,根据id查询数据,更新数据
     */
    @Test
    public void testSave() {
        Customer customer  = new Customer();
        customer.setCustName("黑马程序员1");
        customer.setCustLevel("vip2");
        customer.setCustIndustry("it教育3");
        customerDao.save(customer);
    }
//更新方法
    @Test
    public void testUpdate() {
        Customer customer  = new Customer();
        customer.setCustId(4l);
        customer.setCustName("黑马程序员很厉害");
        customerDao.save(customer);
    }
//删除方法
    @Test
    public void testDelete () {
        customerDao.delete(3l);
    }


    /**
     * 查询所有
     */
    @Test
    public void testFindAll() {
        List list = customerDao.findAll();
        for(Customer customer : list) {
            System.out.println(customer);
        }
    }

    /**
     * 测试统计查询:查询客户的总数量
     *      count:统计总条数
     */
    @Test
    public void testCount() {
        long count = customerDao.count();//查询全部的客户数量
        System.out.println(count);
    }

    /**
     * 测试:判断id为4的客户是否存在
     *      1. 可以查询以下id为4的客户
     *          如果值为空,代表不存在,如果不为空,代表存在
     *      2. 判断数据库中id为4的客户的数量
     *          如果数量为0,代表不存在,如果大于0,代表存在
     */
    @Test
    public void  testExists() {
        boolean exists = customerDao.exists(4l);
        System.out.println("id为4的客户 是否存在:"+exists);
    }


    /**
     * 根据id从数据库查询
     *      @Transactional : 事务注解的支持。保证getOne正常运行
     *
     *  findOne:
     *      em.find()           :立即加载
     *  getOne:
     *      em.getReference     :延迟加载
     *      * 返回的是一个客户的动态代理对象
     *      * 什么时候用,什么时候查询
     */
    @Test
    @Transactional
    public void  testGetOne() {
        Customer customer = customerDao.getOne(4l);
        System.out.println(customer);
    }

}

6.测试操作数据库,jpql,,sql,方法名,等复杂操作方式
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第12张图片
Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作_第13张图片

@RunWith(SpringJUnit4ClassRunner.class) //声明spring提供的单元测试环境
@ContextConfiguration(locations = "classpath:applicationContext.xml")//指定spring容器的配置信息
public class JpqlTest {
    @Autowired
    private CustomerDao customerDao;

    @Test
    public void  testFindJPQL() {
//        接口中定义的复杂相关方法,通过名称查询
        Customer customer = customerDao.findJpql("传智播客");
        System.out.println(customer);
    }


    @Test
    public void testFindCustNameAndId() {
//        接口中定义的复杂相关方法,通过名称和ID查询
        // Customer customer =  customerDao.findCustNameAndId("传智播客",1l);
        Customer customer =  customerDao.findCustNameAndId(3L,"穿天猴");
        System.out.println(customer);
    }

    /**
     * 测试jpql的更新操作
     *  * springDataJpa中使用jpql完成 更新/删除操作
     *         * 需要手动添加事务的支持
     *         * 默认会执行结束之后,回滚事务
     *   @Rollback : 设置是否自动回滚
     *          false | true
     */
    @Test
    @Transactional //添加事务的支持
    @Rollback(value = false)//不回滚事务,也就是提交
    public void testUpdateCustomer() {
        customerDao.updateCustomer(3L,"穿天猴2225");
    }

    //测试sql查询,模糊查询
    @Test
    public void testFindSql() {
        List list = customerDao.findSql("穿天猴%");
        for(Object [] obj : list) {
            System.out.println(Arrays.toString(obj));
        }
    }


    //测试方法命名规则的列名查询
    @Test
    public void testNaming() {
        Customer customer = customerDao.findByCustName("穿天猴2225");
        System.out.println(customer);
    }


    //测试方法命名规则的模糊查询
    @Test
    public void testFindByCustNameLike() {
        List list = customerDao.findByCustNameLike("传智播客%");
        for (Customer customer : list) {
            System.out.println(customer);
        }
    }

    //测试方法命名规则的查询模糊查询和精准列名查询
    @Test
    public void testFindByCustNameLikeAndCustIndustry() {
        Customer customer = customerDao.findByCustNameLikeAndCustIndustry("传智播客1%", "it教育");
        System.out.println(customer);
    }
}

剩下动态查询章节,先暂时不看。https://www.bilibili.com/video/av53910024/?p=60

你可能感兴趣的:(Spring Data Jpa(2019_idea版),Jpa增删改查,jpql,sql,方法名约定的操作)