spring data jpa的简单使用
1、首先引入pom依赖
<!--spring data jpa的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2、application.yml的配置
server:
port: 9002
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
username: ******
password: ******
jpa:
show-sql: true #控制台显示sql
hibernate:
ddl-auto: update # 处理DDL语句的策略,update不存在创建,存在更新
3、代码实现
1、创建实体类
jpa是通过注解将实体类与数据库对应起来,不用编写xml文件进行映射,直接使用注解
@Table(name = "tb_user")
@Entity
@Data
@ToString
public class User {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String userName;
@Column(name = "password")
private String password;
@Column(name = "phone")
private String phone;
@Column(name = "del")
private Integer del;
@Column(name = "create_time")
private Date createTime;
@Column(name = "update_time")
private Date updateTime;
}
2、dao层编写,基本的crud方法可以不用写,直接使用
public interface UserRepository extends JpaRepository<User, Integer>{
/**
* findBy系列,后面跟属性名进行查询
* @param userName
* @return
*/
List<User> findByUserName(String userName);
/**
* nativeQuery 表示是否是本地查询 默认就是false,表示是jpql查询,true表示是sql查询
* @param phone 下面这个是jpql查询,使用的是对象和属性,User userName/phone
* @return
*/
@Query(value = "from User where userName=?1 and phone=?2")
List<User> findObj(String userName,String phone);
/**
* nativeQuery = true表示下面使用的是原生的sql查询,使用表名称和字段名查询,直接写sql语句查询
* @param userName tb_user name/phone
* @return
*/
@Query(value = "select * from tb_user where name=?1 and phone=?2" ,nativeQuery = true)
List<User> findObject(String userName,String phone);
}
上面是我自定义的三个方法,三种方式:
- findBy系列,可以使用AND,Or,OrderBy等来多个条件查询,这种是jpql查询语句
- @Query注解两种用法,既可以写原生的sql也可以拼接jpql查询语句,根据nativeQuery的值控制
3、service层
这层其实可以直接省略,因为是直接调用dao层的接口,下面随便写几个
# service层接口
public interface UserService {
void save(User user);
void upate(User user);
User findOne(Integer id);
List<User> findAll();
void delete(Integer id);
}
# service层实现类型
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRrpository;
@Override
public void save(User user) {
//插入有问题不是动态sql,如果是null值插入的就是null,不会使用默认值
userRrpository.save(user);
}
@Override
public void upate(User user) {
userRrpository.saveAndFlush(user);
}
@Override
public User findOne(Integer id) {
return userRrpository.findById(id).get();
}
@Override
public List<User> findAll() {
return userRrpository.findAll();
}
@Override
public void delete(Integer id) {
userRrpository.deleteById(id);
}
}
4、单元测试的编写
@SpringBootTest
@RunWith(SpringRunner.class)
class UserServiceTest {
@Autowired
private UserService userService;
@Autowired
UserRepository userRepository;
@Test
void save() {
User user = new User();
user.setUserName("lqq");
user.setPassword("123456");
user.setPhone("13254155411");
userService.save(user);
}
@Test
void findOne() {
User user = userService.findOne(1);
System.err.println(user);
}
@Test
void findAll() {
List<User> users = userService.findAll();
System.err.println(users);
}
@Test
void select(){
List<User> users = userRepository.findByUserName("lqq");
System.err.println(users);
List<User> user = userRepository.findObj("lqq", "13294119010");
System.out.println(user);
List<User> users1 = userRepository.findObject("lqq", "13294119010");
System.out.println(users1);
}
}
上面的单元测试只是随便测试了几个,因为自定义的方法没有在service层中定义,所以直接使用的是dao层进行单元测试