**************** 写在前面的话,笔者小白一枚,只会一些基础的入门 ***********
1. 使用spring-data个人感觉十分的顺手,也许是不习惯繁琐的配置,所以当有新技术时,大多先看看有没有可以 使用注解这一特性
个人觉得spring-data已经算是一个 比较完美的东西,
首先用搜spring 将 使用spring-data 的包 放入扫描 ,还有事务 和注解扫描
<bean id="entityMagFacoty" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="jpaVendorAdapter" >
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="packagesToScan" value="com.Reposity"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming,strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<!--事务管理器-->
<bean id="transactionaMang" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityMagFacoty" />
</bean>
<!--支持注解的事务-->
<tx:annotation-driven transaction-manager="transactionaMang" />
<!--配置data-->
<jpa:repositories base-package="com.Reposity" entity-manager-factory-ref="entityMagFacoty"/>
<context:component-scan base-package="com"/>
2. 配置好spring-data的包扫描后 :它有四个可供继承的接口
Repository(底层JDBC) JpaRepository CrudRepository PagingAndSortingRepository(高级Hibernate)
***********************推荐 第二个和第三个************************
毕竟 大部分东西都是 半自动的好 看看如今 的Mybatis 和 Hibernate 和 JDBC
封装太好的东西意味着性能的损耗(Hibernate),
完全不封装的东西意味着繁琐(JDBC)
所以慢慢 Mybatis这种东西大行于世,
类似的还有 全自动步枪(M4A1)和半自动步枪(AK47)和 燧发枪-------当然是Ak47好用,耐用
2.1 Repository :(也可以这样 public interface EmpReposity extends Repository<Student,Integer>{}
)
一个接口 继承Repository ,把需要映射的 实体类(pojo)和他的主键的类型写上就行了
@RepositoryDefinition(domainClass = Student.class,idClass = Integer.class)
public interface empTReposty {
@Query(" select a from Student a where a.name like %?1% ")
public List<Student> getListS(String name);
@Query(" select a from Student a where a.name like %:name% ")
public List<Student> getListSparam(@Param("name") String name);
@Query(" select a from Student a where a.name=:name ")
public List<Student> getListSparams(@Param("name") String name);
// 原生的sql语句
@Query(nativeQuery = true, value = " update Student a set a.U_id=?1 ")
public void updateLIstYUansheng(Integer age );
//控制事务
@Modifying
@Query(" update Student a set a.age=?1 where a.name=?2 ")
public void updateLIst(Integer age,String name);
}
******spring-data支持根据 方法名生成sql语句*************
- 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();
******spring-data支持原生的sql语句********
// 原生的sql语句
@Query(nativeQuery = true, value = " update Student a set a.U_id=?1 ")
public void updateLIstYUansheng(Integer age );
***********************以上所写的继承方法适用于其他三个类***************************
主要介绍特殊的 PagingAndSortingRepository(自带分页和排序的接口)
使用中需要注意的是:
Pageable pageable=new PageRequest(0,12) ;//分页帮助类spring-data自带的,0是页数第一页,12 是 一页多少行 Page<Student> pageStu= empPageRespoty.findAll(pageable);// 同样是自带的Page, findAll pageStu.getTotalElements();// 获取所有的元素 pageStu.getTotalPages();// 所有的页数 //当前页面的一些信息 List<Student> students=pageStu.getContent(); pageStu.getNumber(); // 排序的同样是 spring-data自带的 排序方式 根据什么排序
Sort.Order order=new Sort.Order(Sort.Direction.DESC,"id"); Sort sort1=new Sort(order); Pageable pageables=new PageRequest(0,12,sort1) ; Page<Student> pastus= empPageRespoty.findAll(pageable);
***********************生产中的用法************************************
@Transactional
public interface EMPRepository extends JpaRepository<EMPModel, Integer>, JpaSpecificationExecutor<EMPModel> {}
**********同一个包下的有不想继承 以上四个的 必须注明*****8
@NoRepositoryBean
public interface AfterMarketRepository { 你自己写的方法 }