基礎學習筆記.
1. Spring 配置簡述.
- <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);