jpa基础入门

将数据库交给jpa管理


```java
 <persistence-unit name="jpa_day01" transaction-type="RESOURCE_LOCAL">
        <properties>
            <!-- JDBC四大金刚 -->
            <property name="hibernate.connection.driver_class"
                      value="com.mysql.jdbc.Driver" />
            <property name="hibernate.connection.url"
                      value="jdbc:mysql:///JPA" />
            <property name="hibernate.connection.username" value="root" />
            <property name="hibernate.connection.password" value="123456" />
            <!--
            方言:有一个父类Dialect,每一款数据库对应都有一个子类去继承这个父类,然后重
            写了父类的方法,利用父类类型的变量去指向子类的对象,利用java的多态效果来实现跨数据库产品兼容。
            所以要切换数据库,只需要将这个方言类改成你要用的数据库产品对应的那个方言类即
            可,当然上面的四大金刚也要改
            -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <!-- 可选配置 -->
            <!-- 建表策略 -->
            <!--建表策略-->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <!--是否显示SQL-->
            <property name="hibernate.show_sql" value="true"/>
            <!--格式化SQL-->
            <property name="hibernate.format_sql" value="true"/>

        </properties>
    </persistence-unit>

建表策略:

create-drop:先创建表,在删除表
create:创建表
update:修改数据库的时候用
validate:将尸体类跟数据库进行对比,没有就会报错

主键生成策略:

GenerationType.auot表示自动检测数据库产品类型
Generationtype.identity表示主键自动递增
GenerationType.sequence表示使用序列化来实现主键递增,使用与Oracle。
GenerationType.TABLE 使用单独的一张表来保存当前数据库中其他所有表的当前主键最大值

JPA会默认吧当前实体类名称当做表名称,然后自动建表,我们也可以使用@Table注解来指定一个表名称

mysql中使用 auto_increment 实现主键自动递增
SQL Server中使用 identity 实现主键自动递增
Oracle 使用序列 + 触发器实现主键自动递增
SQLite 中使用 autoincrement 实现主键自动递增
@Entity
//表名
@Table(name = "tb_employee")
public class Employee {
//主键
@Id
//主键自动递增
@GeneratedValue
private Long id;
private String name;
private Integer gender;
private String email;
private String phone;
private BigDecimal salary;
private Long department_id


通过jpa实现数据库的crud

@Test
public void testSave() throws Exception{
//传入一个persistence-unit标签的name属性,创建一个工厂对象
这里的"jpa_day01"跟上面的persistence-unit name名字必须相同
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("jpa_day01");
//通过工厂对象创建一个EntityManager对象,这是JPA的核心对象,JPA的所有操作都要依赖
于EntityManager对象
EntityManager entityManager = factory.createEntityManager();
//创建一个Employee对象,准备数据(今后这里就换成SpringMVC的方法参数来接收前端请求参
数)
Employee employee = new Employee("张三丰", 1, "[email protected]",
"12332112321", new BigDecimal(3000), 1L);
//开启事务
entityManager.getTransaction().begin();
//保存数据
entityManager.persist(employee);
//提交事务
entityManager.getTransaction().commit();
//关闭资源
entityManager.close();
factory.close();
}

查询策略:

persist:永久保存数据
merge:修改数据
remove:删除数据
find:查询数据
createQuery 传入一个jpql语句创建一个Query对象
getResultList 执行查询,将查询结果集每一行封装一个实体类对象,放入List集合中返回
getSingleResult 执行查询,将查询的单行单列结果直接获取出来
setFirstResult 分页查询:从哪一行开始查询数据 公式 (pageNo-1) * pageSize
setMaxResults 分页查询:每页要查询多少行数据 pageSize

jpa的核心api

persistence:
是一个工具类,类中全是静态方法,主要调用用createEntityManagerFactory来读取xml中的配置,创建一个EntityManagerFactory工厂对象,其中含有二级缓存
entitymanagerfactory:
是一个重量级的对象,最好保证项目中只有一个,内部有一级缓存,{
EntityTransaction:
JPA的事务管理工具对象,主要负责开启事务、提交事务、回滚事务
Query:
是JPA的查询工具对象
}

对象的四个状态

临时状态:
Transient 又叫瞬时状态,使用new、或者反射创建出来的对象就是临时状态,此时对象还没有跟JPA
产生关系
持久状态:
Persistent 又叫托管状态,当一个临时状态对象,调用了entityManager的persist或者merge方法
后,变成持久状态,此时对象已经与JPA产生了关系
游离状态:
Detached 又叫脱管状态,当你事务提交后,对象状态变成游离状态,这个时候内存中的对象数据与
数据库表中的一行数据完全匹配
删除状态:
Removed 预删除,当调用了remove方法后变成删除状态,此时数据还没有被删除,而是要等到事务
提交的时候才会执行delete语句去删除数据

对象状态的切换
在这里插入图片描述
① new出来或者反射创建的对象,都是临时状态
② 调用persist方法后,临时状态变成持久状态
③ 事务提交后,持久状态变成游离状态
④ 调用merge方法,游离状态变成持久状态

发布了17 篇原创文章 · 获赞 1 · 访问量 182

猜你喜欢

转载自blog.csdn.net/weixin_43404554/article/details/105575158
今日推荐