免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
簡単な紹介
JPAは、Hibernateとの違いで春データJPAの外観を使用する前に、春データJPA 3
JPA(Javaの永続性API)はJPA自体が、それは本質的にJavaオブジェクトの永続データのORM(オブジェクトリレーショナルマッピング)仕様で指定され、データベース内の管理テーブルを読み出します。
Hibernateは JPA仕様の実装を追跡するために属しているが、JPA仕様は従うことにHibernateの一つであり、その他の仕様は実装を休止状態があります。関係インターフェースと実装クラスに似ています
春データJPAが実現リポジトリJPA仕様に基づいて層を提供するために、再カプセル化は、ORMの実装としてHibernateをJPAのデフォルトの使用に見ることができます
春データJPAの使用について学ぶために基本的な状況を学習した後
統合されました
私は春のブーツは、ポンポンファイルに追加された環境を使用しました
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
それとも、春のブートSQL→JPAプロジェクトを作成するときに確認してください
使用
レディ
データベース接続の構成
#通用数据源配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useSSL=FALSE&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
# JPA 相关配置
# 自动建表时切换默认存储引擎 当前切换为InnoDB
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#配置在日志中打印出执行的 SQL 语句信息
spring.jpa.show-sql=true
# 每次运行项目删除重建表
#spring.jpa.hibernate.ddl-auto=create
# hibernate懒加载相关,配置之后单元测试读取数据时不会报错
spring.jpa.open-in-view=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
クラスを作成します
@Data //lombok
@Entity //必选注解
@Table(name = "user")//可选注解 如果不写name那么表明和类名一致
public class User {
@Id //声明实体唯一标识的属性
@GeneratedValue(strategy = GenerationType.IDENTITY) //sql自动生成主键
private Long id;
@Column(length = 50)//声明是一个字段, length声明字段长度
private String name;
@Column(length = 50)
private String account;
@Column(length = 50)
private String password;
}
//JpaRepository是Repository的子接口 两个泛型分别为表的实体和主键
@Repository
public interface UserDao extends JpaRepository<User, Long> {
}
私たちは、限り、あなたは作成UserDao後のデータベースにアクセスできるようエンティティクラスを作成したとき、最初の時間は、私は非常に使いやすい感じ
開始
ここでは、単純なCRUDの使用であります
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserTest {
@Autowired
private UserDao userDao;
/**
* 新增
*/
@Test
public void addUser() {
User user = new User();
user.setName("王二");
user.setAccount("123");
user.setPassword("1234256");
userDao.save(user);
}
/**
* 删除
*/
@Test
public void delete() {
userDao.deleteById(3L);
}
/**
* 修改
* 修改使用的也是save,jpa判断是新增还是更新的方式主要是判断主键
* 如果主键被赋值就会去数据库中查询是否有这条数据,如果存在就是更新,不存在就是创建
* 更新时是全部字段的更新,如果有字段没有设置将会被赋值为null
*/
@Test
public void update() {
User user = new User();
user.setId(1L);
user.setName("张三");
user.setPassword("1221");
userDao.save(user);
}
/**
* 查询
*/
@Test
public void select() {
User firstUser = userDao.getOne(1L);
System.out.println(firstUser);
Optional<User> s = userDao.findById(1L);
s.ifPresent(System.out::println);
User user = new User();
user.setAccount("123"); //相当于查询 account 为123 的所有数据
Example<User> userExample = Example.of(user);
userDao.findAll(userExample);
//排序按照id 倒序排序
List<User> list = userDao.findAll(new Sort(Sort.Direction.DESC, "id"));
for (User u : list) {
System.out.println(u);
}
}
}
これらのシステムは、実際には、我々はまた、UserDaoのメソッドで定義されたルールに従うことができますされている上記の方法を提供します
@Repository
public interface UserDao extends JpaRepository<User, Long> {
List<User> findByAccountEquals(String account);
}
我々はルールに従うようなJPAが実装されます
アイデアエディタは、適切な方法を求めるメッセージが表示されます
カスタムSQLステートメント
/**
* nativeQuery默认是false,nativeQuery为false是使用不知道是JPQL还是HQL (+﹏+)~晕
* nativeQuery为true时是使用原生的sql语句,根据数据库的不同,sql语句可能有所区别
*/
@Query(nativeQuery = true, value = "select * from user where id in :idList")
List<User> findIdIn(@Param("idList") List<Long> idList);
/**
* 如果是删除或者是更新操作需要加上@Modifying注解以通知这是一个delete或update操作
*/
@Modifying
@Query(nativeQuery = true, value = "delete from user where id =:id")
void deleteById(@Param("id") Long id);
/**
* 执行insert 需要加上@Transactional和@Modifying两个注解
*/
@Transactional
@Modifying
@Query(nativeQuery = true, value = "insert into jpa.user (name) values (:name)")
void insert(@Param("name") String name);