JPA入门

1.什么是JPA
(1) 1. JPA是Java Persistence API的简称
(2) 2. JPA是java持久化规范 【jpa就是一个规范】
(3) 3. ORM Object Relational Mapping【对象关系映射】
2.Hibernate和JPA的关系
Hibernate 是对JPA规范的实现,是一个轻量级的框架
3.JPA优点与缺点

 优点
1.	程序员操作很简单,代码简单 entityManager.persist(employee);	
2.	直接面向持久对象操作
3.	提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate)
		  一级缓存,二级缓存,查询缓存(空间换速度)
4.	数据库移植性很强,很少的修改(通过配置方言搞定)
		把各种数据库抽取了一个方言接口
		不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。
缺点
1.不能干预sql语句的生成
2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA(不过可以使用JPA对原生sql的支持来解决)
3.如果一张表中有上亿级别的数据量,也不适合用JPA,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。
4.创建第一个JPA项目
	重点
	(1)pom.xml文件的配置【重点配置依赖文件】
</dependency>
<!-- hibernate对于jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</finalName>
<plugins>
<plugin>
<!-- Maven的编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
	注意:	配置结束以后检查相应的包是否出现,没有相应的jar包就刷新并联网
(2)persistance.xml  【核心配置文件】
<persistence-unit name="cn.itsource.jpa" transaction-type="RESOURCE_LOCAL">
		<properties>
			<!-- 必须配置4个连接数据库属性 -->
			<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="admin" />

			<!-- 必须配置1个方言属性 -->
			<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

			<!-- 可选配置 -->
			<!-- 是否自动生成表 -->
			<property name="hibernate.hbm2ddl.auto" value="create" />
			<!-- 是否显示sql -->
			<property name="hibernate.show_sql" value="true" />
			<!-- 格式化sql -->
			<!-- <property name="hibernate.format_sql" value="true" /> -->
		</properties>
	</persistence-unit>

5.CRUD功能的实现
(1)save

这里首先抽取工具类
public class JpaUtil {
    private static EntityManagerFactory entityManagerFactory;
    /*将实体管理工厂在类加载的时候就创建
     *
     * 这样可以更方便的获取实体对象
     * */
    static {
        try{
            entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
        }catch(Exception e){
            throw new RuntimeException("读取文件异常");
        }
    }
    public static EntityManager get(){
        return entityManagerFactory.createEntityManager();
    }
}
save功能     【 .persist(T) 】
  User u = new User();
        u.setName("二狗");

        //获得事务对象
        EntityTransaction transaction = entityManager.getTransaction();
        //开启事务
        transaction.begin();
        //调用添加方法
        entityManager.persist(u);
        //提交事务
        transaction.commit();
        //关闭实体对象
        entityManager.close();
update     【 merge(T)  】
 User u = new User();
        u.setId(1);
        u.setName("老弟");
        //获取事务
        EntityTransaction transaction = entityManager.getTransaction();
        //开启事物
        transaction.begin();
        //调用方法实现修改功能  merge(T)
        entityManager.merge(u);
        //提交事务
        transaction.commit();
        //关闭实体
        entityManager.close();
delete     【 remove(T)  】
 //注意,删除操作前需要与 xx 发生关系  所以需要先find
        //获取实体,事务,开启事务
        User u = new User();
        u.setId(1);
        entityManager.getTransaction().begin();
        //先查询
        User user = entityManager.find(User.class, 1);
        //如果能插寻到数据  在删除   remove
        if(user!=null){
            entityManager.remove(user);
        }
        entityManager.getTransaction().commit();
        entityManager.close();
findall     【 createQuery(jpql,User.class);  】
  /*需求,查询所有表中的 数据*/
	     jpql:JPA的查询语言,类似于sql
	    1.里面不能出现表名,列名,只能出现java的类名,属性名
	    2.出现的sql关键字是一样的意思,
	    3.不能写select * 要写select 别名
	    String jpql = "select u from User u";
	    //调用查询全部的方法  createQuery(jpql);
	    Query query = entityManager.createQuery(jpql,User.class);
	    List<User>list =   query.getResultList();
	    //遍历list获取表中的每一条数据
	    for (User user : list) {
	        System.out.println(user);
	    }
queryone     【  .find(User.class, 3);   】 
 /*需求,通过主键获取一条数据*/
        User user = entityManager.find(User.class, 3);
        System.out.println(user);
        entityManager.close();

6.持久类映射配置

  @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id; //要求:主键,使用数据库的自动生成策略
    @Column(length = 20,nullable=false,unique = true,name = "username")
    private String name;  //要求:varchar(20),数据库名称为username,不能为空,唯一
    private String password;
    @Column(insertable = false,columnDefinition = "int(11) default'25'")
    private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)
    private Boolean sex;// 数据库没有布尔类型,bit对象
    @Column(columnDefinition = "decimal(19,2) ")
    private BigDecimal salary;// 19,2
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;//包含年月日时分秒,不允许修改
    @Temporal(TemporalType.DATE)
    private Date birthday;//包含年月日
    @Temporal(TemporalType.TIME)
    private Date time;//包含时分秒
    @Lob
    private String text;//这是一个大文本
    @Transient
    private String temp;//这一个字段不要同步到数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值