SpringDataJPA
一、ORM思想
主要目的:操作实体类就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
不再重点关注:sql语句
二、整合SpringDataJpa与Spring
<!--spring和spring data jpa的配置--> <!-- 1.创建entityManageFactory对象交给spring管理--> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--自动扫描实体类的包,注入spring--> <property name="packagesToScan" value="com.li.domain"/> <!--jpa实现厂家--> <property name="persistenceProvider"> <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/> </property> <!--供应商适配器--> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!--是否自动创建数据库表--> <property name="generateDdl" value="false"/> <!--指定数据库类型--> <property name="database" value="MYSQL"/> <!--数据库方言:支持特有的语法--> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/> <!--是否显示sql语句--> <property name="showSql" value="true"/> </bean> </property> <!--jpa方言:高级特性--> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> </property> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///mbase"/> <property name="user" value="root"/> <property name="password" value="123"/> </bean> <!--整合spring data jpa--> <jpa:repositories base-package="com.li.dao" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"> </jpa:repositories> <!--配置事务管理器--> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!--包扫描--> <context:component-scan base-package="com.li"/> </beans>
三、编写实体类,使用Jpa注解配置映射关系
/** * 配置映射关系: * 1.实体类和表的映射关系 * 2.实体类中的属性和表中的字段的映射关系 * @Entity : 声明为实体类 * @Table : 配置实体类和表的映射关系 * name:配置数据库表的名称 * */ @Entity @Table(name="cst_customer") public class Customer implements Serializable { /** * @Id: 声明主键的配置 * @GeneratedValue :主键生成策略 * GenerationType.IDENTITY:自增 Mysql * GenerationType.SEQUENCE:序列 oracle *@Column : 配置属性和字段的映射关系 * name: 数据库表中字段名称 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="cust_id") private Long custId; @Column(name="cust_name") private String custName; @Column(name="cust_source") private String custSource; @Column(name="cust_industry") private String custIndustry; @Column(name="cust_level") private String custLevel; @Column(name="cust_address") private String custAddress; @Column(name="cust_phone") private String custPhone;
四、编写一个符合springDataJpa的dao层接口
* 只需要编写dao层接口,不需要编写dao层接口的实现类
* dao层接口规范
1.需要继承两个接口(JpaRepository,JpaSpecificationExecutor)
2.需要提供响应的泛型
/** * 符合springDataJpa的dao层接口的规范 * JpaRepository<实体类的类型,实体类中主键属性的类型> * 封装了CRUD操作 * JpaSpecificationExecutor<实体类类型> * 封装复杂分页查询 */ public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> { }
五、测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class CustomerTest { @Autowired private CustomerDao customerDao; /** * 立即加载 */ @Test public void findOne(){ Customer one = customerDao.findOne(1l); System.out.println(one); } }