dao层几种配法
1.优先使用内置接口方法
2.按方法命名规范定义接口
3.手动定制sql或hql方式
4.手动提供接口实现类
第一种UserRepository
package dao;
import model.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
/**
* JPA接口
*/
//@RepositoryDefinition(domainClass =User.class ,idClass = Integer.class)
public interface UserRepository extends Repository<User, Integer> {
//1.只声明接口方式(使用方法命名规范)
User getUserById(int id);
//2.声明hql方式
@Query(value = "from User where username=?1 and password=?2")
User selectByHql(String username,String password);
//3.声明Sql方式
@Query(value = "select * from User where username=? and password=?",nativeQuery = true)
User selectBySql(String username,String password);
//4.可以手动定制增删改操作
@Query(value = "insert into user(username,password) values(?,?)",nativeQuery = true)
@Modifying
void insert(String username,String password);
}
第二种UserRepository2
package dao;
import model.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository2 extends JpaRepository<User,Integer> {
//只支持查询和删除(后面可以拼接丰富的条件)
List<User> findUserByIdBetween(int begining, int ending, Pageable pageable);
}
第三种多继承扩容型(自定义实现类)
BaseRepository(自定义实现接口)
package dao;
/**
* 自定义接口,并提代其实现
*/
public interface BaseRepository {
Long sum();
}
BaseRepositoryImpl(最好以Impl结尾,因为这是框架约定)
如果要重新定制规则
就要配置接口实现后缀名自定义
package dao;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
public class BaseRepositoryImpl implements BaseRepository {
//@Autowired
@PersistenceContext
private EntityManager entityManager;
/**
* 查询总记录数
* @return
*/
@Override
public Long sum() {
String hql = "select count(*) from User";
Query query = entityManager.createQuery(hql);
Long count = (Long)query.getSingleResult();
return count;
}
}
SubRepository
package dao;
import model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SubRepository extends BaseRepository,JpaRepository<User,Integer> {
}
pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sy</groupId>
<artifactId>0415_springdatajpa_day01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--Spring相关包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<!--Spring JPA-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!--JPA:Java Pesistence API-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<!--JPA实现-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.0.Final</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
</project>
spring.xml配置
<?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:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--1.加载properties文件 -->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--2.创建dataSource实例-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${db_driver}"></property>
<property name="url" value="${db_url}"></property>
<property name="username" value="${db_user}"></property>
<property name="password" value="${db_password}"></property>
</bean>
<!--3.扫描Dao层接口,生成代理对像-->
<jpa:repositories base-package="dao"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="txManager"
repository-impl-postfix="Impl"></jpa:repositories>
<!--4.entityManagerFactory相当于hibernate中SessionFactory
EntityManager相当hibernate的Session-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--指定hibernate实现-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="false"></property>
</bean>
</property>
<!--扫描hibernate注解-->
<property name="packagesToScan" value="model"></property>
<property name="jpaProperties">
<props>
<!--把数据库表的列映射成对像属性,如USER_ID映射成属性userId-->
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop>
</props>
</property>
</bean>
<!--5.事务管理器-->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!--6.事务驱动-->
<tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>
<!--7.开启DI扫描-->
<context:component-scan base-package="service"></context:component-scan>
</beans>
db.properties
db_driver=com.mysql.jdbc.Driver
db_url=jdbc:mysql:///javaee
db_user=root
db_password=tiger
model包
package model;
import javax.persistence.*;
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
方法一Service
package service;
import dao.UserRepository;
import model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional(readOnly = true)
public class UserService {
@Autowired
private UserRepository repository;
public User findById(int id){
return repository.getUserById(id);
}
public User findByHql(String username,String password){
return repository.selectByHql(username, password);
}
public User findBySql(String username,String password){
return repository.selectBySql(username, password);
}
@Transactional(propagation = Propagation.REQUIRED)
public void save(User user){
repository.insert(user.getUsername(),user.getPassword());
}
}
方法二对应Service
package service;
import com.sun.prism.shader.DrawSemiRoundRect_Color_AlphaTest_Loader;
import dao.UserRepository2;
import model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Service
@Transactional(readOnly = true)
public class UserService2 {
@Autowired
private UserRepository2 repository2;
@Transactional(propagation = Propagation.REQUIRED)
public void save(User user){
repository2.save(user);
}
@Transactional(propagation = Propagation.REQUIRED)
public void remove(User user){
repository2.delete(user);
}
@Transactional(propagation = Propagation.REQUIRED)
public void modify(User user){
repository2.save(user);
}
public User findById(int id){
Optional<User> optionalUser = repository2.findById(id);
User user = optionalUser.get();
return user;
}
public List<User> findAll(){
return repository2.findAll();
}
public List<User> findWithSort(Sort sort){
return repository2.findAll(sort);
}
public Page<User> findWithPage(Pageable pageable){
return repository2.findAll(pageable);
}
public List<User> findUserByIdBetweenAnd(int begin,int end,Pageable pageable){
return repository2.findUserByIdBetween(begin, end, pageable);
}
}
方法3对应Service
package service;
import com.sun.xml.internal.ws.client.sei.ResponseBuilder;
import dao.SubRepository;
import dao.UserRepository;
import dao.UserRepository2;
import model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Service
@Transactional(readOnly = true)
public class UserService3 {
@Autowired
private SubRepository repository;
/**
* 使用JPA接口中的方法
* @param id
* @return
*/
public User findById(int id){;
Optional<User> optionalUser = repository.findById(id);
return optionalUser.get();
}
/**
* 使用自定义父接口中方法
* @return
*/
public Long sum(){
return repository.sum();
}
}