使用spring,spring是帮助我们构造对象的。必须在bean中添加无参构造方法,不然会报错
无法init初始化的错误!
Spring Data介绍
Spring 的一个子项目。用于简化数据库访问,支持NoSQL和关系数据库存储。其主要目标是使数据库的访问变得方便快捷。
获取数据源 jdbc
jpa实体管理工厂/数据源/适配器需要使用哪个全自动工具这里时Hibernatejap
设置jpa特有的属性/操作什么数据库
为jpa配置事务/只有事务才能提交数据库
spring date jpa配置dao层/输入要继承CrudRepository<shopBean,String>类的包的全路径
指定事务使用哪个注解管理器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
default-lazy-init="true">
<context:component-scan base-package="com.gesula.shop"></context:component-scan>
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 获得数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="${jdbc_url}"></property>
<property name="username" value="${jdbc_user}"></property>
<property name="driverClassName" value="${jdbc_driver}"></property>
<property name="password" value="${jdbc_password}"></property>
</bean>
<!-- JPA实体管理器工厂 -->
<bean id="manager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.gesula.shop.bean"></property>
<!-- hibernate的适配器 -->
<property name="jpaVendorAdapter" >
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><!-- validate/update/create -->
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${format_sql}</prop>
<!-- 建表的命名规则 DefaultNamingStrategy,ImprovedNamingStrategy,EJB3NamingStrategy-->
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.DefaultNamingStrategy</prop>
</props>
</property>
</bean>
<!-- 设置JPA实现厂商的特定属性 -->
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="${hibernate.dialect}"/>
</bean>
<!-- Jpa 事务配置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="manager"/>
</bean>
<!-- Spring Data Jpa配置DAO层 -->
<jpa:repositories base-package="com.gesula.shop.dao" entity-manager-factory-ref="manager"/>
<!-- 使用annotation定义事务 --> <!---注解事务指定事务使用那个管理器 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
</beans>
配置好以后我们需要在dao层接口类中书写Hql/sql语句/如果使用Hibernate自带方法书写,那么这个接口需要
extends CrudRepository<shopBean,String>类 第一个参数为需要操作的对象,第二个参数为,你Id的类型
//存在于import org.springframework.data.repository.CrudRepository;包下
public interface IShopDao extends CrudRepository<shopBean,String>{
//按照类型查询所有商品/方法中的占位符是从1开始的,如果有多个按顺序依次递增?1/?2....
@Query("from shopBean where genre=?1")
public List<shopBean> findAllGenre(String genre);
//查询所有未上架的商品 这里使用sql
@Query(value = "SELECT * FROM t_shop where status=?1 ",nativeQuery = true)
public List<shopBean> findAllOne(int i);
//按照商品id修改未上架的商品的为上架,并且设定上架时间
//修改时用于原声sql语句不然会出现找不到resultSet
@Modifying(clearAutomatically = true)
@Query(value="update t_shop set startDate=?1 , status=0 where id=?2 and status=1 ",nativeQuery =true)
public int update(Date date,String name);
}
当然Hql和sql书写方式是不一样的,其中查询注解为@Query()是为Hql专用的/如果要在@Query()中写sql原生语句,那么就需要在@Query(value="sql语句",nativeQuery =true);nativeQuery =true声明为当前sql是条原生语句
添加的话直使用save()添加
删除和修改Hql方法中自带的有常规操作;都是以id来操作的。
如果要使用sql更改或删除操作那么必须在@Query(value="sql语句",nativeQuery =true)前加上注解
@Modifying(clearAutomatically = true)不然会报错,找不到 ResultSet/使用该注解是要告诉计算机这是条删除/修改语句
--------------------------------------------------------