jdbc->hibernate(是产品,实现jpa规范)->jpa(是规范,不是产品)。
1.准备lib包
2.jar包引入时,千万注意目录不能有中文或者空格
1.先建表,再编写配置文件和bean-(面向过程,传统的数据库建模思想)
2.先编写配置文件和bean,在建表(oop思想)-要求比较高
事务种类:
1.本地事务:支持对同一个数据库的事务操作——大部分应用
步骤:
第一步:项目结构
2.持久化文件配置:
<?xml version="1.0" encoding="utf-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myjpa" transaction-type="resource_local">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.mysql5dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" /><!--已存在则更新,不存在则创建 -->
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpadb?useunicode=true&characterencoding=utf-8" />
</properties>
</persistence-unit>
</persistence>
3.实体bean
知识点:字段的长度,是否为空,关键字,自增,字段名称的映射修改,表名称的映射修改,字段类型(date类型)-不同格式要求,枚举类的注释(索引,枚举值)-性别,大文本类型数据,二进制数据映射,不想某个字段跟表有映射关系,为了防止某个字段数据量过大而占用内存过大因此对其进行延迟加载(懒惰加载,需要获取数据时才得到数据)。
import java.util.date;
import javax.persistence.basic;
import javax.persistence.column;
import javax.persistence.entity;
import javax.persistence.enumtype;
import javax.persistence.enumerated;
import javax.persistence.fetchtype;
import javax.persistence.generatedvalue;
import javax.persistence.id;
import javax.persistence.lob;
import javax.persistence.table;
import javax.persistence.temporal;
import javax.persistence.temporaltype;
import javax.persistence.transient;
@entity
@table(name="person")
public class person {
private integer id;
private string name;
private date birthday;
private sex sex;
private string info;
private byte[] file;
private string other;
public person() {
super();
}
public person(string name) {
this.name = name;
public person(string name, date birthday) {
this.birthday = birthday;
public person(string name, date birthday, sex sex) {
this.sex = sex;
/**
* 主键并自增
* @return the id
*/
@id @generatedvalue
public integer getid() {
return id;
* @param id the id to set
public void setid(integer id) {
this.id = id;
* @return the name
@column(length=10,nullable=false,name="personname")
public string getname() {
return name;
* @param name the name to set
public void setname(string name) {
* @return the birthday
@temporal(temporaltype.date)
public date getbirthday() {
return birthday;
* @param birthday the birthday to set
public void setbirthday(date birthday) {
* @return the sex
@enumerated(enumtype.string)
public sex getsex() {
return sex;
* @param sex the sex to set
public void setsex(sex sex) {
* @return the info
@lob
public string getinfo() {
return info;
* @param info the info to set
public void setinfo(string info) {
this.info = info;
* @return the file
@lob @basic(fetch=fetchtype.lazy) //当文件很大时,进行懒惰加载
public byte[] getfile() {
return file;
* @param file the file to set
public void setfile(byte[] file) {
this.file = file;
* @return the other
@transient //排除某个字段的映射
public string getother() {
return other;
* @param other the other to set
public void setother(string other) {
this.other = other;
}
枚举类:
public enum sex {
man,worman
4.单元测试类
知识点:
1.把握异常出现的时机。
2.通过id得到实体bean(1.彻底查询 2.用到查询)
3.保存实体bean到数据库
4.更新实体bean到数据库中
涉及到对象的状态:
1.新建
2.托管(设置实体的字段值,并通过提交可以同步到数据库)
3.游离(无法更新到数据库中,除非使用merge方法重新可将其更新到数据库中)
4.删除
public class persontest {
@test
public void save(){
entitymanagerfactory factory=persistence.createentitymanagerfactory("myjpa");
entitymanager em=factory.createentitymanager();
em.gettransaction().begin();
em.persist(new person("techbirds",new date(),sex.man));
em.gettransaction().commit();
em.close();
factory.close();
public void getperson1(){
person p=em.find(person.class, 1);
system.out.println(p.getname());
public void getperson2(){
person p=em.getreference(person.class, 1);
//代理对象,用到才查询
//system.out.println(p.getname());出错,事务已经关闭
public void updateperson1(){
p.setname("bao");
}
public void updateperson2(){
em.clear();//将所有实体管理器中的所有实体变成游离状态,无法跟数据库同步
p.setname("techbirds");
public void updateperson3(){
em.merge(p);//此时又可以进行同步
public void delperson(){
em.remove(p);
5.jpa的(sql)查询
jpasql语句:面向对象的sql语句,jpa标准的sql语法
查询方法:
1.位参数查询 select o from person o where o.id=?1—>query.setparameter(1,2);
2.命名查询 select o from person o where o.id=:id—>query.setparameter("id",2);
查询结果:1.列表 2.唯一值(对象)
查询类型:普通查询,删除查询,更新查询
ps:进行数据的更改必须启动事务。-删除查询和更新查询必须开启事务
@test
public void querysql(){
//面向对象的sql语句
query query=em.createquery("select o from person o where o.id=?");
query.setparameter(1, 2);
person p=(person) query.getsingleresult();
public void deletesql(){
query query=em.createquery("delete from person o where o.id=?");
query.setparameter(1, 3);
query.executeupdate();
public void updatesql(){
query query=em.createquery("update person o set o.sex=? where o.id=?");
query.setparameter(1, sex.worman);
query.setparameter(2, 3);