Spring Data JPA,基础学习笔记._JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Spring Data JPA,基础学习笔记.

Spring Data JPA,基础学习笔记.

 2013/5/19 14:11:52  suene  程序员俱乐部  我要评论(0)
  • 摘要:P.S.最好先学习JPA方面的知识....在这里使用的是Hibernate.也已经使用了一段时间,看什么都不如看官方文档,我这里也只是写个笔记记录一下,如果能帮助到其他人,很开心.算是个demoshow吧.这里也只写了一些我觉得比较有用的地方.其他一些使用知识,请参见官方文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/1.Spring配置简述.<jpa
  • 标签:笔记 学习 Spring JPA 学习笔记
P.S. 最好先学习 JPA 方面的知识....在这里使用的是 Hibernate .
也已经使用了一段时间,看什么都不如看官方文档,我这里也只是写个笔记记录一下,如果能帮助到其他人,很开心 .算是个 demoshow 吧.这里也只写了一些我觉得比较有用的地方.其他一些使用知识,请参见官方文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/

1. Spring 配置简述.

class="java">
	<jpa:repositories base-package="org.e.test.**.dao" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"  />

        <tx:annotation-driven transaction-manager="transactionManager"  />
	
        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
		<property name="packagesToScan">
			<list>
				<value>org.e.test.**.model</value>
			</list>
		</property>
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">true</prop>
......etc
			</props>
		</property>
	</bean>

	<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
		<property name="databasePlatform" value="${hibernate.dialect}" />
	</bean>
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>


2.DAO


@Transactional 方面基本不变,该怎么用怎么用..

假设已有 Entity 类 User
@Entity
@Table(name = "t_user")
public class User
{
	@Id
	@Column(name = "user_id")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long userId;
	private String username;
	private String password;


2.1. DAO 类.
可以继承的接口有:

CRUD 功能的接口:
CrudRepository : org.springframework.data.repository.CrudRepository<T, ID>
CRUD + 分页的接口:
PagingAndSortingRepository : org.springframework.data.repository.PagingAndSortingRepository<T, ID>

例如:
public interface UserDao extends PagingAndSortingRepository<User, Long>



2.2 DAO 方法

已经定义了 UserDao 接口.不用实现里面的任何方法,spring 会帮你生成对应的代理类.也不用加 @Repository annotation,因为已经继承了 Repository 接口.

对于已有的方法就不做多的说明了,看了方法名就会用的.使用的时候在 Service 层注入对应的 UserDao 代理对象即可.


自定义方法.

例1.
根据命名规则写对应的抽象方法即可.根据 username 查找 user.只需在 UserDao 中 填写如下方法.
public List<User> findByUsername(String username);


例2.
根据两个属性查询.
public List<User> findByUsernameAndPassword(String username,String password);


附方法定义规则表:
http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/
Table 2.2. Supported keywords inside method names 部分.

例3.
锁:
可以使用 @Lock , 里面填入的是 JPA 的 LockModeType
*
	@Lock(LockModeType.PESSIMISTIC_READ)
	public List<User> findByUsername(String username);

对应的 sql 就是:
select * from t_user where username=? lock in share mode


*
	@Lock(LockModeType.PESSIMISTIC_WRITE)
	public List<User> findByUsername(String username);

对应的 sql 就是:
select * from t_user where username=? for update


例4.
分页
public List<User> findByUsername(String username, Pageable pageable);


Pageable 是一个定义分页属性的类.可以创建 Pageable 的实现类 PageRequest对象使用.
PageRequest pr = new PageRequest(int page, int size);
PageRequest pr = new PageRequest(int page, int size, Sort sort);

etc...



例5.
自己定义 query 语句.
@Query
 @Query("select u from User u where u.username= ?1")
  User findByUsername(String username);




3. 应用场景及优点


这个问题就范围太大了,仅仅表达点个人观点.如果拍请轻拍.

1. 为什么用 Hibernate 这框架啊, 多麻烦.封装深,开发成本高.表关联不容易处理等等.
这得根据项目需求来看,比如,表关联少,很多都是增删改差就可以了,报表部分可以用别的技术.或者创建视图.
最最最重要一点的好处,跨数据库,对于现在我要支持 oracle mysql mssql.就很有用了.

2. DAO 层真的代码很少. 分页支持很好用. 对于数据10W以下的项目来说.完全节约开发成本.

3. 向 JPA 看齐,这样在 开发 EJB 项目时, DAO 层的技术一样.也是减少开发成本.其实spring data 也是在上面又封装了一层.但对与某一个表/模块可以有两个 DAO 类,一个是 spring data 提供的 CRUD 功能.另外一个使用 EntityManager 来操作 Entiry.

4. 这个风格个人喜欢.对于做一些小项目,在也没有比这个理由更适合的了.

5. 如果想要一些,性能方面的优缺点.我想这不是 spring data 来决定的,而是看那个实现 JPA 的 Framework 来起决定作用的. hibernate 也出现这么久了.性能方面是个大坑.我自己可填不完,大家自己看着办吧....

发表评论
用户名: 匿名