jpa 及spring data jpa开发

jpa 及spring data jpa开发

//jpa生成代码

单表查询的直接用需要规范的接口

@Repository

@Transactional

public interface BasSpsxValueDao extends JpaRepository<BasSpsxValueBean, Long>,IBasSpsxValueDao {}这个接口的实现类是自动生成的

决定能不能用jpa原生内置的sql操作,关键在于JpaRepository<BasSpsxValueBean, Long(主键类型)>

多表的时候可以另起一个原生接口,这个时候就要自己写实现类,为了框架结构上能清晰明白的表示自定义的原生接口和单表的接口的关系,让接口继承下

但是在接口注入的时候应该注入BasSpsxValueDao,而不是IBasSpsxValueDao

<jpa:repositories base-package="com.esteel.web.dao"></jpa:repositories>//扫描dao的路劲及其子包,自动生成impl,新增的时候要符合这个目录

public interface IBasSpsxValueDao {

 

/**

* 根据valueKey和parentValue查询唯一的典型值

* @param valueKey

* @param parentValue

* @return

*/

public String getDefaultValue(String valueKey,String parentValue);

 

/**

* 查询所有的典型值的valueKey 

* 用于查询是否有典型值

* @return

*/

public List<String> getAllDxzValueKey();

 

public List<BasSpsxValueBeanVo> spsxPartKeycdpzzzMap();

public List<BasSpsxValueBeanVo> spsxKeycdpzzzMap();

public List<BasSpsxValueBeanVo> rltnPartKeypmcjzzMap();

}

 

public class BasSpsxValueDaoImpl implements IBasSpsxValueDao {

 

@PersistenceContext

private EntityManager em;

 

@Autowired

public ESteelSqlSessionTemplate sqlSessionTemplate;

 

/**

* 查询默认值

*/

@Override

@Cacheable("BasSpsxValueDaoImpl.getDefaultValue")

public String getDefaultValue(String valueKey, String parentValue) {

 

Query query;

if (StringUtils.isEmpty(parentValue)) {

String sql = "select valuetype||defaultValue from tb_bas_dxz where valueKey=:valueKey and parentValue is null";

query = em.createNativeQuery(sql);

query.setParameter("valueKey", valueKey);

} else {

String sql = "select valuetype||defaultValue from tb_bas_dxz where valueKey=:valueKey and parentValue=:parentValue";

query = em.createNativeQuery(sql);

query.setParameter("valueKey", valueKey);

query.setParameter("parentValue", parentValue);

}

@SuppressWarnings("unchecked")

List<String> list = query.getResultList();

 

if (list.isEmpty()) {

return "";

} else {

return list.get(0);

}

 

}

 

@Override

@Cacheable("BasSpsxValueDaoImpl")

public List<String> getAllDxzValueKey() {

String sql = "select valuekey from tb_bas_dxz";

Query query = em.createNativeQuery(sql);

 

@SuppressWarnings("unchecked")

List<String> list = query.getResultList();

return list;

}

 

@Override

public List<BasSpsxValueBeanVo> spsxPartKeycdpzzzMap() {

return sqlSessionTemplate.selectList("basSpsxValue.spsxPartKeycdpzzzMap");

}

 

@Override

public List<BasSpsxValueBeanVo> spsxKeycdpzzzMap() {

return sqlSessionTemplate.selectList("basSpsxValue.spsxKeycdpzzzMap");

}

 

@Override

public List<BasSpsxValueBeanVo> rltnPartKeypmcjzzMap() {

return sqlSessionTemplate.selectList("basSpsxValue.rltnPartKeypmcjzzMap");

}

 

}

 

 

///hibernate

以下都是基于jpa的

 

@PersistenceContext

private EntityManager em;注入下面这个工厂类,然后使用操作数据库(dao中用)

 

<bean id="entityManagerFactory"//hibernate

class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="jpaVendorAdapter" ref="jpaVendorAdapter"></property>

<property name="persistenceUnitName" value="esteel"></property>

<property name="packagesToScan" value="com.esteel.web.entity"></property>//扫描实体的路径,不包括他的子包,新增的时候要符合这个目录

</bean>

 

 

<!-- Jpa 事务管理器  -->自动就是注解

  <bean id="transactionManager"  class="org.springframework.orm.jpa.JpaTransactionManager">

    <property name="entityManagerFactory" ref="entityManagerFactory" />

  </bean>

 

 

 

目前我用的是

 <!-- 设定transactionManager -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource" />

    </bean>

 

    <!-- 使用annotation定义事务 -->

    <tx:annotation-driven transaction-manager="transactionManager" />

 

@Repository  //如果是jdk代理放到impl,dao层都可以

@Transactional

public interface BasAffixDao extends JpaRepository<BasAffixBean, Long>

 

 

@Repository

@Transactional

public class AffixDaoImpl implements AffixDao {

 

    @Autowired

    public ESteelSqlSessionTemplate sqlSessionTemplate;

 

    public interface ITbCusUserDao {

    public List<TbCusUserBean> warePartKeyzzMap();这种自定义的接口,如果不是用的@Query,那么需要这个bean对应的mapper.xml中有相应的sql

}

 

<select id="warePartKeyzzMap" resultMap="basBedMap">

SELECT T.WARE_KEY,T.WAREKIND_KEY,T.WARE_ID,T.WARE_NAME,T.SPEC_FORMULA,

T.DATA_MEM_TABLE,T.PICTURE_ADDRESS,T.IS_SHOW,T.ORDER_NUM,T.EN,T.ENSHORT,T.BZ,'N' SELECTED

FROM TB_BAS_BED T WHERE T.IS_SHOW='Y' order by WAREKIND_KEY,WARE_KEY, ORDER_NUM

</select>

 

@Repository

@Transactional

public interface TbCusUserDao extends JpaRepository<TbCusUserBean, Long>,ITbCusUserDao{

 

public void deleteByObjKey(Integer objKey);//接口中的方法By后面的字段需要bean有,否则出错(继承了这个的接口的情况下extends JpaRepository)

}

 

///mybatis(这个框架中只有hibernate是用了事务的)

1,这个框架的mapper.xml不是扫描的是配置的方式

 

2,<bean id="sqlSessionTemplate" class="com.esteel.web.utils.ESteelSqlSessionTemplate" c:sqlSessionFactory-ref="sqlSessionFactory"></bean>//mybatis

  public class ESteelSqlSessionTemplate extends SqlSessionTemplate

public ESteelSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

super(sqlSessionFactory);

}

直接用这个模板也可调用mybatis的内置方法(在不继承mapper通用接口下,通过扫描生成实现类的情况下),只不过是手动写实现类(dao中用)

 

 

是实现类的要么是mybatis,要么是需要多表查询的hibernate

 

 

 

修改Eclipse项目使之支持JPA工具 

http://blog.sina.com.cn/s/blog_484d87770100u4nm.html

用Eclipse建立了一个Web项目,想通过eclipse的JPA Tools为项目生成数据库实体Bean,但右键菜单里看不到JPA Tools选项。

于是招到一个类似的项目(能够右键看到JPA Tools),查看其工程路径下.setting/org.eclipse.wst.common.project.facet.core.xml文件,

发现<faceted-prject>标签内有这样一句“<installed facet="jpt.jpa" version="1.0"/>”于是copy这句到了新建项目的对应文件中。刷新一下项目,

再右键后,于是就看到了希望见到的JPA Tools。

http://my.oschina.net/hcliu/blog/401262//使用 jpa tool

 

 

无论自己定义还是jpa代理的dao,注入方式掉用

@Autowired

private BasAffixDao basAffixDao; 

 

 

 

//接下来就是jpa注解了,可以用

 

TbCusUserBean

 

 

jpa规范:

http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/   spring data jpa(dao层上的注解,@query,方法名解析成sql)org.springframework.data.jpa

http://java-zone.org/1287.html   jpa(实体上的注解)javax.persistence

And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);

Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);

Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);

LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);

GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);

IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();

IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();

NotNull --- 与 IsNotNull 等价;

Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);

NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);

OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);

Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);

In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

 

public BasAffixBean findFirstByTableNameAndTableKey(String tableName,String tableKey);//表的主键

 

        //这种按照规范自动生成sql(只是单表)

public void deleteByTableNameAndTableKey(String tableName,String tableKey);

public void deleteByTableKeyAndAffixType(String tableKey,String affixType);

public List<BasAffixBean>  findByTableNameAndTableKeyOrderByAffixKey(String tableName,String tableKey);

@Cacheable("findByAreaLevel")

public List<BasAreaBean> findByAreaLevel(String areaLevel);

@Cacheable("BasBedDao.findByWarekindKey")

public List<BasBedBean> findByWarekindKeyOrderByWareKey(long warekindKey);

        //一些直接的save等不带具体字段的不用写,service中直接调用

 

        //这种类似xml中sql,合适复杂sql

@Cacheable("BasBedSrtBean")

@Query("SELECT b FROM BasBedSrtBean b")

public List<BasBedSrtBean> findAllSrt();

 

@Cacheable("BasBedSrtBean")

@Query("SELECT b FROM BasBedSrtBean b WHERE b.bz LIKE %:bz%")//适合多表查询

public List<BasBedSrtBean> findByBz(@Param("bz")String bz);

 

猜你喜欢

转载自yuhuiblog6338999322098842.iteye.com/blog/2315288