SpringDataJPA_day01

JPA
jpa的概念:
	Java Persistence API,即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
ORM思想:
	对象关系映射,Object Relational Mapping,将数据库中的字段名与实体类中的属性名对应起来,从而可以通过操作实体类的属性来操作数据库中的字段的效果
Hiberate:
	JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
pom.xml
<dependencies>
		<!-- junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- hibernate对jpa的支持包 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${project.hibernate.version}</version>
		</dependency>
		<!-- c3p0 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-c3p0</artifactId>
			<version>${project.hibernate.version}</version>
		</dependency>
		<!-- log日志 -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<!-- Mysql and MariaDB -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
		</dependency>
	</dependencies>
实体类Entity:
import javax.persistence.*;
@Entity		//指定当前类是一个实体类
@Table(name="cst_customer")		//指定实体类所映射的数据库表的表名
public class Customer {
    @Id		//指定当前属性是主键IDENTITY,oracle就用SEQUENCE
    //配置主键的生成策略,mysql就用
    @GeneratedValue(strategy = GenerationType.IDENTITY)	
    @Column(name="cust_id")		//指定当前属性对应的数据库字段
    private Long custId;
    @Column(name="cust_name")
    private String custName;
    @Column(name="cust_source")
    private String custSource;
    @Column(name="cust_industry")
    private String custIndustry;
    @Column(name="cust_level")
    private String custLevel;
    @Column(name="cust_address")
    private String custAddress;
    @Column(name="cust_phone")
    private String custPhone;
    	getter/setter...
}
API
 在类路径resources下,创建META-INF文件夹,指定配置文件名为: persistence.xml (固定写法 )	
	@Test
    public void testInsert(){
        //自动加载配置文件,创建实体管理器工厂对象
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myjpa");
        //生成实体管理器对象
        EntityManager entityManager = factory.createEntityManager();
        //开启事务
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        Customer customer = new Customer();
        customer.setCustIndustry("你好");
        customer.setCustName("张三");
        entityManager.persist(customer);
        transaction.commit();
        //释放资源
        entityManager.close();
        factory.close();

    }

getTransaction : 获取事务对象
	EntityTransaction transaction = entityManager.getTransaction();
		transaction.begin();	//开启事务
		transaction.commit();	//提交事务
		transaction.rollback();	//回滚事务
persist : 保存操作
		Customer customer = new Customer();
		customer.set....
         //注意:不能设置id属性,id属性必须由实体类中的策略生成,sql中没有id
		entityManager.persist(customer);
merge : 更新操作
        //注意:如果没有id就会执行为insert;
        //底层先执行select,再执行update,将customer参数更新到查询的对象中
		entityManager.merge(customer);	nnnii
remove : 删除操作
		//删除必须先查再删,直接new的对象不行
		Consumer consumer = entityManager.find(Consumer.class,1);
		entityManager.remove(consumer);
find/getReference : 根据id查询
		Consumer consumer1 = entityManager.find(Consumer.class,1);	//立即加载
		Consumer consumer2 = entityManager.getReference(Consumer.class,1);	//延迟加载,得到的是动态代理对象
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!--配置持久层单元,
		name表示给当前持久层单元起一个名字,创建实体管理器工厂的时候使用,
		transaction-type指定事务的类型,RESOURCE_LOCAL本地事务,JTA分布式事务-->
    <persistence-unit name="myjpa" transaction-type="RESOURCE_LOCAL">
        <!--配置持久层提供者-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!--配置数据库连接环境-->
        <properties>
            <!--必须-->
            <property name="javax.persistence.jdbc.user" value="root"></property>
            <property name="javax.persistence.jdbc.password" value="root"></property>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver">					</property>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa">				</property>
            <!--可选,
				hibernate.show_sql在控制台输出执行的具体的sql
				hibernate.hbm2ddl.auto取值:
						create,每次执行sql前,先删除表,再创建表
						update,有表就不创建,每表就创建
						none,有没有表都不管,如果没有表就报错-->
            <property name="hibernate.show_sql" value="true"></property>
            <property name="hibernate.hbm2ddl.auto" value="none"></property>
        </properties>
    </persistence-unit>
</persistence>
JPQL
JPQL 全称Java Persistence Query Language
	Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
	注意:通过实体类的类名和属性名访问数据库,而不是表名和表的字段

//查询所有,不需要select,不能使用通配符*, from 实体类类名
	String jpql = "from Consumer";
	Query query = entityManager.createQuery(jpql);
	List list = query.getResultList();
//分页查询,完全遵循limit
	String jpql = "from Consumer";
	Query query = entityManager.createQuery(jpql);
	query.setFirstResult(0);	//开始的索引
	query.setMaxResults(10);	//每页显示条数
//条件查询
	String jpql = "from Consumer where name = ? ";	//name是实体类的属性名
	Query query = entityManager.createQuery(jpql);
	query.setParameter(1,"张三");
	Object obj = query.getSingleResult();	//获取单个结果,底层assert期望值为1,必须是一个结果
//排序查询
	String jpql = "from Consumer order by id desc";
	Query query = entityManager.createQuery(jpql);
	List list = query.getResultList();
//聚合函数查询
	String jpql = "select count(id) from Consumer";
	Query query = entityManager.createEntityManager(jpql);
	Object obj = query.getSingleResult();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值