代码改变世界

Spring Data jpa 的几种方法

2018-06-20 16:00  那么像你  阅读(70)  评论(0)    收藏  举报

1.直接继承JpaRepository或JPA定义的其他接口,可以直接调用其接口中定义的方法,只需要我们继承接口不需要我们实现接口中的方法,jpa在注入时会自动实现 EmpRepository

package com.exmple.Repository;

import com.exmple.Entity.Emp;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmpRepository  extends JpaRepository<Emp,Long> {

}

 

2.根据Jpa 的规则在 EmpRepository,增加符合规则名字的方法

 

@Repository
public interface EmpRepository  extends JpaRepository<Emp,Long> {

    /*
    根据名字查询。
    findEmpByName   find为固定
    By为查询条件的固定符,其后跟条件
    Name为Emp中的一个属性
    返回值为一个Emp的数组集合
     */
    List<Emp> findEmpByName(String name);

    /*
        根据年龄查询
        同Name的写法好条件
        返回值为单个对象,如果查出多条则异常
     */
    Emp findEmpByAge(Integer gae);

    /**
     * 根据Name and Age查询.查出同时符合条件的返回值
     * @param Name
     * @param age
     * @return  如果查出多条则异常
     */
    Emp findByNameAndAge(String Name,Integer age);
}

对于规则 

 

3.使用 @Query ,即自定义sql语句

   

/**
     *用HQL去查询,?1表示第一个参数.可以有其他的参数。 Emp为实体类名
     * @param id
     * @return
     */
    @Query(value = "select e from Emp e where e.id=?1")
    Emp EMPhql( long id);

    /**
     * 用HQL去查询,用@Param注解参数名,在 语句中 “:参数名”用于使用参数值
     * @param id
     * @param age
     * @return
     */
    @Query(value = "select e from Emp e where e.id= :id and age=:age")
    Emp empGhsql(@Param("id") long id, @Param("age") int age);

    /**
     * 用纯sql语句去查询,参数使用同HQL.
     * @param id
     * @return
     */
    @Query(value = "select * from emp where employee_id=?1",nativeQuery = true)
    Emp EMPsql( long id);

4. EntityManager,可实现复杂的自写sql语句

package com.exmple.Repository;

import com.exmple.Entity.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

@Service
public class EmpRepositoryEntityManager {

    @Autowired
    private EntityManager entityManager;

    public List<Emp> allemps(){
        String sql= "select * from emp";
        Query query= entityManager.createNativeQuery(sql,Emp.class);
        return query.getResultList();
    }
}

5.JdbcTemplate,可实现复杂查询

package com.exmple.Repository;

import com.exmple.Entity.Emp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * JdbcDaoSupport 中有JdbcTemplate的注入
 */
@Service
public class EmpRepositoryJdbc  extends JdbcDaoSupport {

    @Autowired
    public EmpRepositoryJdbc(DataSource dataSource) {
        setDataSource(dataSource);

    }
    public List<Emp> myCustomBatchOperation() {
        String COMPLICATED_SQL="select * from emp";
        return getJdbcTemplate().query(COMPLICATED_SQL, new UserRowMapper());
    }

    private static class UserRowMapper implements RowMapper<Emp> {

        /*
         * (non-Javadoc)
         * @see org.springframework.jdbc.core.RowMapper#mapRow(java.sql.ResultSet, int)
         */
        public Emp mapRow(ResultSet rs, int rowNum) throws SQLException {

            Emp user = new Emp();
            user.setAge(rs.getInt("aga"));
            user.setId(rs.getLong("employee_id"));
            user.setName(rs.getString("employee_ename"));
            user.setStatus(rs.getString("employee_status"));
            user.setSex(rs.getString("sex"));
            return user;
        }
    }
}

6.多表连查

  从关系上分为OneToOne、OneToMany/ManyToOne、ManyToMany,从方向上分为 单向和双向。

  在数据库设计上  OneToOne和OneToMany/ManyToOne可在Many的一方(OneToOne,可根据情况在任意一方)增加外键与One方相关联,也可增加第三表相关联。ManyToMany 只能通过第三表相关联

  

  

 

对于EntityManager和JdbcTemplate还未深入

连表还未学习