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);
相关推荐
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
综上所述,这些文档是学习和精通Spring框架、Spring Data JPA以及JPA的宝贵资源,适合Java开发者尤其是从事企业级应用开发的人员参考学习。通过学习和实践,开发者可以更高效地构建和维护数据库驱动的Java应用程序。
在实际应用中,Spring Data JPA可以大大减少开发人员的工作量,提高代码的可维护性和可读性。结合Spring Boot,可以快速搭建数据访问层,让开发者更专注于业务逻辑。 至于压缩包中的“helloworld”文件,可能是一个...
Spring Data JPA 提供了与数据库交互的高级抽象,使得开发人员可以更高效地工作,而无需编写大量的 boilerplate 代码。 在 Spring Data JPA 1.4.3 版本中,主要包含以下关键知识点: 1. **Repository Abstraction*...
Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发效率极高**: - Spring Data JPA通过提供自动化的 Repository 实现,减少了大量手动编写SQL和DAO层代码的...
【标题】"spring data jpa + spring + json demo"揭示了这个项目是关于使用Spring Data JPA、Spring框架以及...通过深入研究和运行这个项目,可以更好地理解Spring MVC、Spring Data JPA以及JSON在实际开发中的应用。
Spring Boot提供了一系列强大的工具,如JPA、Hibernate、Spring Data和JdbcTemplate,来简化这一过程。让我们深入探讨这些技术以及它们在实际项目中的应用。 1. **JPA(Java Persistence API)**: JPA是Java平台...
综上所述,这个实例提供了一个完整的Java Web开发环境,展示了如何使用Spring Data JPA、Spring 4.2、Spring MVC和Hibernate 4.3进行数据操作,以及如何利用Maven进行项目管理,同时借助IntelliJ IDEA提升开发效率。...
总结,Spring Data JPA是一个在Spring框架下实现数据访问层自动化的库,它简化了传统JPA使用过程中复杂和重复的代码编写,提高了开发效率,并为数据操作提供了统一的编程模型。通过深入了解和掌握Spring Data JPA,...
《Spring Data JPA从入门到精通》是一本深入解析Spring Data JPA的书籍,它以Spring Boot框架为核心,旨在帮助读者全面理解并熟练运用Spring Data JPA进行数据库操作。Spring Data JPA是Spring Framework的一个模块...
这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...
Spring Data JPA 简化了 JPA(Java Persistence API)的开发,通过约定优于配置的方式,让开发者能够更加专注于业务逻辑而不是数据访问层的实现细节。使用 Spring Data JPA,可以快速搭建起一个基本的数据访问层,...
总结来说,本项目是一个基础的Web开发框架,结合了SpringMVC的MVC设计模式、Spring Data JPA的数据访问层、Hibernate的ORM能力以及FreeMarker的模板引擎,同时还实现了环境配置的灵活切换,为开发高效、可维护的Web...
Spring Data JPA是Spring框架的一个模块,主要目的是简化Java企业级应用中数据访问层的开发。这个框架构建在JPA(Java Persistence API)之上,提供了一种声明式的方式来操作数据库,使得开发者无需编写大量的SQL...
Spring Data JPA 是 Spring 框架的一个模块,它为使用 JPA(Java Persistence API)提供了强大的支持,简化了数据访问层的开发。通过使用 Spring Data JPA,我们可以避免编写大量重复的 CRUD(创建、读取、更新、...
Spring Data JPA是Java开发中的一个关键框架,它简化了与关系型数据库的交互,特别是基于Java Persistence API (JPA)。这个框架是Spring生态系统的组成部分,为开发者提供了声明式数据访问的方式,允许通过简单的...
Spring Data JPA 是 Spring Data 家族的一员,它的设计目标是进一步减少开发人员在数据访问层的工作量。通过 Spring Data JPA,开发者几乎无需编写任何 DAO(数据访问对象)实现,即可完成常见的 CRUD(创建、读取、...