SpringDataJPA快速使用.docx
- 文档编号:3785413
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:100.49KB
SpringDataJPA快速使用.docx
《SpringDataJPA快速使用.docx》由会员分享,可在线阅读,更多相关《SpringDataJPA快速使用.docx(17页珍藏版)》请在冰豆网上搜索。
SpringDataJPA快速使用
SpringDataJPA快速启动
1概述
SpringDataJPA是SpringData家族的提供的一个持久层框架,可以自动创建dao实现类和自定义查询,简化了持久层代码。
2SpringDataJPA使用
使用SpringDataJPA只需要3个步骤:
(1)声明持久层的接口,该接口继承Repository,Repository是一个标记型接口,它不包含任何方法,当然如果有需要,SpringData也提供了若干Repository子接口,其中定义了一些常用的增删改查,以及分页相关的方法。
(2)在接口中声明需要的业务方法。
SpringData将根据给定的策略来为其生成实现代码。
(3)在Spring配置文件中增加一行声明,让Spring为声明的接口创建代理对象。
配置了 repositories>后,Spring初始化容器时将会扫描base-package指定的包目录及其子目录,为继承Repository或其子接口的接口创建代理对象,并将代理对象注册为SpringBean,业务层便可以通过Spring自动封装的特性来直接使用该对象。 此外, repository>还提供了一些属性和子标签,便于做更细粒度的控制。 可以在 repository>部使用 include-filter>、 exclude-filter>来过滤掉一些不希望被扫描到的接口。 2.1实体类规: 实体类均使用注解进行配置,常用注解描述如下,其他请参考JPA配置规: Entity: 在bean的最上面使用,使实体bean映射到数据库中. Table(name="tableName"): 指定实体bean映射到数据库中的表名. IdGeneratedValue(strategy=GenerationType.AUTO) Id: 指定实体bean在数据库表的实体标识属性 Strategy: id的生成策略. GenerationType.AUTO: 自动(默认值,可以不设定) GenerationType.IDENTITY: 数据库的id自增长(Oracle不支持) GenerationType.SEQUENCE: 序列化(Mysql不支持) GenerationType.TABLE: 表生成 Column(length=20,nullable=false,name=""): 字段属性注释 Length: 指定字段的长度 Nullable: 是否为空.false: 不为空;true: 空 Name: 指定字段映射到表的列名 Temporal(TemporalType.DATE): 指定类型为时间的字段属性的映射 DATE: 日期,不包括时间.1985-09-09 TIME: 时间,没有日期.23: 44: 00 TIMESTAMP: 时间戳,包括日期和时间1985-09-0923: 44: 00 Enumerated(EnumType.STRING): 枚举类型属性的映射 EnumType.STRING: 保存枚举类型数据的字符类型数据到数据库 EnumType.ORDINAL: 保存枚举类型数据的索引值到数据库 Lob: 大文本字段(String)和二进制数组类型字段(Byte[])使用它,对应数据库的大文本类型. Transient: 属性不跟数据库表进行映射使用Transient注解 Basic(fetch=FetchType.LAZY): 延时加载数据使用Basic注解中的 FatchType: LAZY懒加载;EAGER立即 2.2Dao接口规: Dao接口需要继承BaseDao e.g: publicinterfacePersonDaoextendsBaseDao Person: Dao对应实体类类型 Long: Dao对应实体类主键ID类型 importjava.io.Serializable; importjava.util.List; importorg.springframework.data.domain.Page; importorg.springframework.data.domain.Pageable; importorg.springframework.data.domain.Sort; importorg.springframework.data.repository.Repository; publicinterfaceBaseDao } BaseDao中提供了若干默认方法,可以直接进行调用,描述如下: 1、public 2、publicTsave(Tentity);//保存或更新 2、publicTdelete(Tentity);//根据ID删除 3、publicTfindOne(IDid);//根据ID查询 4、publicbooleanexists(IDid);//根据ID查找是否存在 5、publicList 6、publicList 7、publiclongcount();//查询记录总数 8、publicPage 参数pageable: 可以传递newPageRequest(0,10) 0表示第一页 10表示每页10条数据 返回值Page对象使用: 当前页: getNumber(); 每页显示条目数: getSize(); 总页数: getTotalPages(); 结果集总数量: getTotalElements(); 是否是首页: isFirstPage(); 是否是末页: isLastPage(); 是否有上一页: hasPreviousPage(); 是否是下一页: hasNextPage(); 查询结果集: getContent(); 9、publicList 参数sort可以传递: newSort(newOrder(Direction.DESC,"personId"),newOrder(Direction.ASC,"age")) Direction.DESC: 降序排列 Direction.ASC: 生序排列 personId和age: 列名 其他方法可以进行自定义,方式参考代码例 2.3自定义查询 支持两种模式的自定义查询: (1)使用Query创建查询 Query注解的使用非常简单,只需在声明的方法上面标注该注解,同时提供一个JPQL查询语句即可,如下所示: Query支持命名参数示例 publicinterfaceUserDaoextendsBaseDao publicAccountInfosave(AccountInfoaccountInfo); //与参数的顺序无关 Query("fromAccountInfoawherea.accountId=: id") publicAccountInfofindByAccountId(Param("id")LongaccountId); //与参数的顺序相关 Query("fromAccountInfoawherea.accountId=? 1") publicAccountInfofindById(LongaccountId); } 此外,也可以通过使用Query来执行一个更新操作,为此,我们需要在使用Query的同时,用Modifying来将该操作标识为修改查询,这样框架最终会生成一个更新的操作,而非查询。 如下所示: 使用Modifying将查询标识为修改查询 Modifying Query("updateAccountInfoaseta.salary=? 1wherea.salary 2") publicintincreaseSalary(intafter,intbefore); 方法中的参数顺序与Query中的变量顺序保持一致。 (2)通过解析方法名创建查询 例1. 根据命名规则写对应的抽象方法即可.根据username查找user.只需在UserDao中填写如下方法. Java代码 1.public List 例2. 根据两个属性查询. Java代码 1.public List 框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。 并且如果方法的最后一个参数是Sort或者Pageable类型,也会提取相关的信息,以便按规则进行排序或者分页查询。 在创建查询时,我们通过在方法名中使用属性名称来表达,比如findByUserAddressZip()。 框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为AccountInfo类型): ∙先判断userAddressZip(根据POJO规,首字母变为小写,下同)是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步; ∙从右往左截取第一个大写字母开头的字符串(此处为Zip),然后检查剩下的字符串是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user为AccountInfo的一个属性; ∙接着处理剩下部分(AddressZip),先判断user所对应的类型是否有addressZip属性,如果有,则表示该方法最终是根据"AccountInfo.user.addressZip"的取值进行查询;否则继续按照步骤2的规则从右往左截取,最终表示根据"AccountInfo.user.address.zip"的值进行查询。 可能会存在一种特殊情况,比如AccountInfo包含一个user的属性,也有一个userAddress属性,此时会存在混淆。 读者可以明确在属性之间加上"_"以显式表达意图,比如"findByUser_AddressZip()"或者"findByUserAddress_Zip()"。 在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个围等等),SpringDataJPA为此提供了一些表达条件查询的关键字,大致如下: ∙And---等价于SQL中的and关键字,比如findByUsernameAndPassword(Stringuser,Striangpwd); ∙Or---等价于SQL中的or关键字,比如findByUsernameOrAddress(Stringuser,Stringaddr); ∙Between---等价于SQL中的between关键字,比如findBySalaryBetween(intmax,intmin); ∙LessThan---等价于SQL中的"<",比如findBySalaryLessThan(intmax); ∙GreaterThan---等价于SQL中的">",比如findBySalaryGreaterThan(intmin); ∙IsNull---等价于SQL中的"isnull",比如findByUsernameIsNull(); ∙IsNotNull---等价于SQL中的"isnotnull",比如findByUsernameIsNotNull(); ∙NotNull---与IsNotNull等价; ∙Like---等价于SQL中的"like",比如findByUsernameLike(Stringuser); ∙NotLike---等价于SQL中的"notlike",比如findByUsernameNotLike(Stringuser); ∙OrderBy---等价于SQL中的"orderby",比如findByUsernameOrderBySalaryAsc(Stringuser); ∙Not---等价于SQL中的"! =",比如findByUsernameNot(Stringuser); ∙In---等价于SQL中的"in",比如findByUsernameIn(Collection ∙NotIn---等价于SQL中的"notin",比如findByUsernameNotIn(Collection 创建查询的顺序 SpringDataJPA在为接口创建代理对象时,如果发现同时存在多种上述情况可用,它该优先采用哪种策略呢? 为此, repositories>提供了query-lookup-strategy属性,用以指定查找的顺序。 它有如下三个取值: ∙create---通过解析方法名字来创建查询。 即使有符合的命名查询,或者方法通过Query指定的查询语句,都将会被忽略。 ∙create-if-not-found---如果方法通过Query指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则通过解析方法名字来创建查询。 这是query-lookup-strategy属性的默认值。 ∙use-declared-query---如果方法通过Query指定了查询语句,则使用该语句实现查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该命名查询;如果两者都没有找到,则抛出异常。 2.4配置文件规 persistence.xml 路径: classpath——》META-INF——》persistence.xml 容: xmlversion="1.0"encoding="UTF-8"? > version="2.0"> --Name属性用于定义持久化单元的名字(name必选,空值也合法);transaction-type(RESOURCE_LOCAL : 本地事物,针对一个数据库;JTA: 全局事物,跨数据库)--> --用于指定持久化实现厂商类--> --配置数据库类型mysql: "java: /MySqlDS";oradle: "java: /OracleDS"--> /MySqlDS --可选--> --配置是否自动创建数据库表create: 加载时,根据实体类重新创建表结构create-drop: 加载时,根据实体类重新创建表结构,退出时,删除表结构 update: 运行时根据实体类生成表结构,如果实体类和表结构不同,会更新表结构validate: 加载时验证实体类和表结构是否相同,不同报异常--> applicationContext.xml xmlversion="1.0"encoding="UTF-8"? > xmlns: xsi=".w3.org/2001/XMLSchema-instance"xmlns: context=".springframework.org/schema/context" xmlns: tx=".springframework.org/schema/tx"xmlns: jpa=".springframework.org/schema/data/jpa" xsi: schemaLocation=".springframework.org/schema/beans.springframework.org/schema/beans/spring-beans.xsd.springframework.org/schema/context.springframework.org/schema/context/spring-context.xsd.springframework.org/schema/tx.springframework.org/schema/tx/spring-tx-2.5.xsd.springframework.org/schema/data/jpa.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd"> --spring组件扫描--> component-scanbase-package="cn.damai"/> --数据源--> destroy-method="close"> mysql: //192.168.66.10: 3306/new_schema"/> --JPA实体管理器工厂--> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> META-INF/persistence.xml"/>save(Iterableentities)//批量新增或编辑
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SpringDataJPA 快速 使用
![提示](https://static.bdocx.com/images/bang_tan.gif)