junit
junit
4.12
test
org.hibernate
hibernate-entitymanager
${project.hibernate.version}
org.hibernate
hibernate-c3p0
${project.hibernate.version}
log4j
log4j
1.2.17
mysql
mysql-connector-java
5.1.6
/***
* 客户的实体类
* 配置映射关系
* 1.实体类和表的映射关系
* @Entity 声明实体类
* @Table 配置实体类和表的映射关联
* name:配置数据库的名称
*
*/
@Entity
@Table(name = "cst_customer")
public class Customer implements Serializable {
/***
* 2.实体类中属性和表中字段的映射关系
* @Id 主键映射配置
* @GeneratedValue:配置主键的生成策略
* strategy
* GenerationType.IDENTITY :自增,mysql
* 底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
* enerationType.SEQUENCE : 序列,oracle
* 底层数据库必须支持序列
* GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
* GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略
* @Column:配置属性和字段的映射关系
* name:数据库表中字段的名称
*/
@Id
@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;
@Override
public String toString() {
return "Customer{" +
"custId=" + custId +
", custName='" + custName + '\'' +
", custSource='" + custSource + '\'' +
", custIndustry='" + custIndustry + '\'' +
", custLevel='" + custLevel + '\'' +
", custAddress='" + custAddress + '\'' +
", custPhone='" + custPhone + '\'' +
'}';
}
public Long getCustId() {
return custId;
}
public void setCustId(Long custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustIndustry() {
return custIndustry;
}
public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustAddress() {
return custAddress;
}
public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
}
3.配置Hibernate工厂,的配置文件,文件名称是固定的:persistence.xml ,配置文件路径也需要在 META-INF 文件夹下
org.hibernate.jpa.HibernatePersistenceProvider
public class JpaUtils {
/***
* 解决实体管理器工厂的浪费资源和耗时问题
* 通过静态代码块的形式,当程序第一次访问工具类是,创建一个公共的实体管理器工厂对象
*第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象
*第二次方法getEntityManager方法:直接通过一个已经创建好的factory对象,创建EntityManager对象
*/
private static EntityManagerFactory factory;
static {
// 1.加载配置工具类的时候,创建EntityManagerFactory 工厂对象
factory = Persistence.createEntityManagerFactory("myJpa");
}
// 调用管理器方法 获取EntityManager管理器对象
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
5.通过单元测试,写增删改查的Jpa 测试类(不需要写sql)
public class JpaTest {
/**
* 测试jpa的保存
* 案例:保存一个客户到数据库中
* jpa的操作步骤
* 1.加载配置文件创建实体工厂对象
* 2.通过实体类获取管理器
* 3.获取事务对象,开启事务
* 4.完成增删改查操作
* 5.提交事务
* 6.释放资源
*/
@Test
public void testsave(){
//// 1.加载配置文件创建实体工厂对象
// EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
//// 2.通过实体类获取管理器
// EntityManager em= factory.createEntityManager();
//注意通过工具类,得到管理器对象
EntityManager em= JpaUtils.getEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();//开启对象
// 4.完成增删改查操作
Customer customer = new Customer();
customer.setCustName("穿天猴");
customer.setCustIndustry("教育1");
//保存
em.persist(customer);//保存操作
//5.提交事务
tx.commit();
//释放资源
em.close();
// factory.close(); 使用工具类后,得到管理器后,工厂对象就关闭了
}
// 单查立即加载方法
@Test
public void fingbyid(){
//注意通过工具类,得到管理器对象
EntityManager em= JpaUtils.getEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();//开启对象
//3.增删改查 -- 根据id查询客户
/**
* find : 根据id查询数据
* class:查询数据的结果需要包装的实体类类型的字节码
* id:查询的主键的取值
*/
Customer customer = em.find(Customer.class, 1L);
System.err.println(customer);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
// 单查延迟加载(懒加载)方法
@Test
public void fingbyidgetReference(){
//注意通过工具类,得到管理器对象
EntityManager em= JpaUtils.getEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();//开启对象
//3.增删改查 -- 根据id查询客户
/**
* getReference : 延迟加载根据id查询数据
* class:查询数据的结果需要包装的实体类类型的字节码
* id:查询的主键的取值
*/
Customer customer = em.getReference(Customer.class, 1L);
System.err.println(customer);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
// 删除方法
@Test
public void remove(){
//注意通过工具类,得到管理器对象
EntityManager em= JpaUtils.getEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();//开启对象
//3.增删改查 -- 根据id查询客户
/**
* remove : 根据对象id 删除数据
* 传实体类进去。
*/
Customer customer = em.find(Customer.class, 2L);
System.out.println(customer);
em.remove(customer);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
// 更新数据方法
@Test
public void update(){
//注意通过工具类,得到管理器对象
EntityManager em= JpaUtils.getEntityManager();
// 3.获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();//开启对象
//3.增删改查 -- 根据id查询客户
/**
* merge : 根据对象,修改数据
* 传实体类进去。
*/
Customer customer = em.find(Customer.class, 3L);
customer.setCustAddress("南来风");
System.out.println(customer);
em.merge(customer);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
}
/**
* 测试jqpl,语句查询
*/
public class JpqlTest {
/**
* 查询全部,from 类路径
* jqpl:from cn.itcast.domain.Customer
* sql:SELECT * FROM cst_customer
*/
@Test
public void testFindAll() {
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
String jpql = " from Customer";
Query query = em.createQuery(jpql);//创建Query查询对象,query对象才是执行jqpl的对象
//发送查询,并封装结果集
List list = query.getResultList();
for (Object obj : list) {
System.out.print(obj);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
/**
* 排序查询: 倒序查询全部客户(根据id倒序)
* sql:SELECT * FROM cst_customer ORDER BY cust_id DESC
* jpql:from Customer order by custId desc
*
* 进行jpql查询
* 1.创建query查询对象
* 2.对参数进行赋值
* 3.查询,并得到返回结果
*/
@Test
public void testOrders() {
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
String jpql = "from Customer order by custId desc";
Query query = em.createQuery(jpql);//创建Query查询对象,query对象才是执行jqpl的对象
//发送查询,并封装结果集
List list = query.getResultList();
for (Object obj : list) {
System.out.println(obj);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
/**
* 使用jpql查询,统计客户的总数
* sql:SELECT COUNT(cust_id) FROM cst_customer
* jpql:select count(custId) from Customer
*/
@Test
public void testCount() {
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
//i.根据jpql语句创建Query查询对象
String jpql = "select count(custId) from Customer";
Query query = em.createQuery(jpql);
//ii.对参数赋值
//iii.发送查询,并封装结果
/**
* getResultList : 直接将查询结果封装为list集合
* getSingleResult : 得到唯一的结果集
*/
Object result = query.getSingleResult();
System.out.println(result);
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
/**
* 分页查询
* sql:select * from cst_customer limit 0,2
* jqpl : from Customer
*/
@Test
public void testPaged() {
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
//i.根据jpql语句创建Query查询对象
String jpql = "from Customer";
Query query = em.createQuery(jpql);
//ii.对参数赋值 -- 分页参数
//起始索引
query.setFirstResult(0);
//每页查询的条数
query.setMaxResults(2);
//iii.发送查询,并封装结果
/**
* getResultList : 直接将查询结果封装为list集合
* getSingleResult : 得到唯一的结果集
*/
List list = query.getResultList();
for (Object obj : list) {
System.out.println(obj);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
/**
* 条件查询
* 案例:查询客户名称以‘传智播客’开头的客户
* sql:SELECT * FROM cst_customer WHERE cust_name LIKE ?
* jpql : from Customer where custName like ?
*/
@Test
public void testCondition() {
//1.获取entityManager对象
EntityManager em = JpaUtils.getEntityManager();
//2.开启事务
EntityTransaction tx = em.getTransaction();
tx.begin();
//3.查询全部
//i.根据jpql语句创建Query查询对象
String jpql = "from Customer where custName like ? ";
Query query = em.createQuery(jpql);
//ii.对参数赋值 -- 占位符参数
//第一个参数:占位符的索引位置(从1开始),第二个参数:取值
query.setParameter(1, "传智播客%");
//iii.发送查询,并封装结果
/**
* getResultList : 直接将查询结果封装为list集合
* getSingleResult : 得到唯一的结果集
*/
List list = query.getResultList();
for (Object obj : list) {
System.out.println(obj);
}
//4.提交事务
tx.commit();
//5.释放资源
em.close();
}
}