原文地址:https://lierabbit.cn/articles/5
添加依赖新建项目选择web,JPA,MySQL三个依赖
对于已存在的项目可以在bulid.gradle加入,spring boot将会帮你自动配置好
compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.springframework.boot:spring-boot-starter-web') runtime('mysql:mysql-connector-java') 配置基本信息然后在src/main/resources/application.properties下添加基本配置
#数据库连接地址 spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=false #数据库账号 spring.datasource.username=root #数据库密码 spring.datasource.password=123456zxc #数据库驱动 spring.datasource.driver-class-name=com.mysql.jdbc.Driver #jpa设置 spring.jpa.hibernate.ddl-auto=create #是否在控制台显示数据库语句 spring.jpa.show-sql=truespring.jpa.properties.hibernate.hbm2ddl.auto 其作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
none:什么都不做
至此基本配置完成
创建实体创建一个User实体,包含id(主键)、name(姓名)、age(年龄)属性,通过ORM框架其会被映射到数据库表中,由于配置了hibernate.hbm2ddl.auto,在应用启动的时候框架会自动去数据库中创建对应的表。
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity//这是一个和数据库表相关联的类 public class User { @Id//主键 @GeneratedValue//自增长 private Long id;//id @Column(length = 30)//长度30 private String name;//名称 @Column(nullable = false)//不可空 private Integer age;//年龄 public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } 创建数据访问接口创建一个userRepository接口,进行数据库操作
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface UserRepository extends JpaRepository<User, Long>//JpaRepository<实体类型,主键类型> { // 通过名称找到用户 User findByName(String name); // 通过名称和年龄找到用户 User findByNameAndAge(String name, Integer age); // 通过名称模糊查询 List<User> findByNameLike(String name); // 使用hql查询 @Query("from User u where u.name=:name")//:name对应@Param里的name User findByHQL(@Param("name") String name); // 使用sql查询 @Query(value = "select * from user where name = ?1 and age = ?2", nativeQuery = true)//?1表示第一个参数,?2表示第二个参数 User findBySQL(String name, Integer age); } 单元测试在src/test/java/你的包名/你的项目名ApplicationTests编写对应的单元测试来验证编写的内容是否正确
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class JpaLearnApplicationTests { // 注入userRepository @Autowired private UserRepository userRepository; @Test public void contextLoads() { // 添加10个测试用例 userRepository.save(new User("QQQ",1)); userRepository.save(new User("WWW",2)); userRepository.save(new User("EEE",3)); userRepository.save(new User("AAA",4)); userRepository.save(new User("SSS",5)); userRepository.save(new User("DDD",6)); userRepository.save(new User("ZZZ",7)); userRepository.save(new User("XXX",8)); userRepository.save(new User("CCC",9)); userRepository.save(new User("QQQ2",10)); // 测试findAll, 查询所有记录 Assert.assertEquals(10, userRepository.findAll().size()); // 测试findByName, 查询姓名为AAA的User Assert.assertEquals(4, userRepository.findByName("AAA").getAge().longValue()); // 测试findByHQL, 查询姓名为AAA的User Assert.assertEquals(4, userRepository.findByHQL("AAA").getAge().longValue()); // 测试findByNameAndAge, 查询姓名为SSS并且年龄为5的User Assert.assertEquals("SSS", userRepository.findByNameAndAge("SSS", 5).getName()); // 测试findBySQL, 查询姓名为SSS并且年龄为5的User Assert.assertEquals("SSS", userRepository.findBySQL("SSS", 5).getName()); // 测试删除姓名为AAA的User userRepository.delete(userRepository.findByName("AAA")); // 测试findAll, 查询所有记录, 验证上面的删除是否成功 Assert.assertEquals(9, userRepository.findAll().size()); // 测试findAll, 查询名字有Q的有几个 Assert.assertEquals(2,userRepository.findByNameLike("%Q%").size()); } }