EntityManager的基本方法

1.Persistence
主要用来获取EntityManagerFactory的实例;
通过静态方法:createEntityManagerFactory 来实现;
该方法有两个重载版本;
    带有一个参数:指定persistence.xml中的持久化单元名为参数;
    两个参数:    除了上一个参数外,还可添加一个map做参数;map里存放persistence.xml中的properties标签中的属性;可覆盖配置文件的设置;
 
2.EntityManagerFactory
用来创建EntityManager的实例;
主要方法:
    createEntityManager()    ->创建实体管理器对象的实例;
    createEntityManager(Map map)    ->和前一个一样作用,多了个map用来指定EntityManager属性;
    isOpen()    ->确定工厂实例是否打开;
    close()    ->关闭工厂实例,释放资源; 
 
3.EntityManager的基本方法
新建一个junit测试类;
在类中创建工厂方法、类管理器、事物的属性;
建一个初始化方法并加上@Before注解,在每次执行测试方法时会自动调用;
见一个释放资源的方法,加上@After注解;
代码:
     private EntityManagerFactory factory;
     private EntityManager manager;
     private EntityTransaction transaction;
     
     //初始化,在每个方法开始之前调用加@Before
     @Before
     public void init(){
           factory=Persistence.createEntityManagerFactory("jpa_emp");
           manager=factory.createEntityManager();
           transaction=manager.getTransaction();
           transaction.begin();
     }
     
     //释放资源,在每个方法调用之后调用加@After
     @After
     public void destory(){
           transaction.commit();
           manager.close();
           factory.close();
     }
 
1)find()方法
代码:
     //测试EntityManager的find()方法
     @Test
     public void testFind() {
           //参数为实体类的class对象和主键id
           Emp emp=manager.find(Emp.class, 1);
           System.out.println("------------------------");
           System.out.println(emp);
     }
结果:
Hibernate:
    select
        emp0_.id as id1_0_0_,
        emp0_.birthday as birthday2_0_0_,
        emp0_.name as name3_0_0_,
        emp0_.salary as salary4_0_0_
    from
        tb_emp emp0_
    where
        emp0_.id=?
------------------------
Emp [id=1, name=诸葛村夫, birthday=2019-03-17, salary=2000]
 
2)getReference方法
代码:
     //测试getReference;相当于hibernate的Session的load()方法
     @Test
     public void testGetReference(){
           Emp emp=manager.getReference(Emp.class, 1);
           System.out.println("------------------------");
           System.out.println(emp);
     }
结果:
------------------------
Hibernate:
    select
        emp0_.id as id1_0_0_,
        emp0_.birthday as birthday2_0_0_,
        emp0_.name as name3_0_0_,
        emp0_.salary as salary4_0_0_
    from
        tb_emp emp0_
    where
        emp0_.id=?
Emp [id=1, name=诸葛孔明, birthday=2019-03-17, salary=2000]
 
3)persistence()方法
代码:
     //persistence()类似hibernate的save(),将临时对象变为持久化对象;
     //和save()方法的不同:如果对象有设置id则会抛出异常
     @Test
     public void testPersistence(){
           Emp emp=new Emp();
           emp.setBirthday(new Date());
           emp.setName("小懿子");
           emp.setSalary(2500);
           
           manager.persist(emp);
           System.out.println(emp.getId());
     }
结果:
Hibernate:
    insert
    into
        tb_emp
        (birthday, name, salary)
    values
        (?, ?, ?)
24
 
4)remove()方法
代码:
     //remove()
     //类似hibernate的delete()方法;从数据库中移除对象;
     //该方法只能移除持久化对象;而hibernate的delete方法能移除游离对象
     @Test
     public void testRemove(){
           //不可用来移除游离对象
           //Emp emp=new Emp();
           //emp.setId(22);
           //获取持久化对象
           Emp emp=manager.find(Emp.class, 22);
           manager.remove(emp);
     }
结果:
Hibernate:
    select
        emp0_.id as id1_0_0_,
        emp0_.birthday as birthday2_0_0_,
        emp0_.name as name3_0_0_,
        emp0_.salary as salary4_0_0_
    from
        tb_emp emp0_
    where
        emp0_.id=?
Hibernate:
    delete
    from
        tb_emp
    where
        id=?
 
5)几种方法的详解
 
4.实体的状态
在jpa规范中,EntityManager对象被用来持久化操作;
实体作为普通java对象,只有在调用EntityManager将其持久化后才能变成持久化对象;
实体的几种状态:
    新建    ->新创建的对象,尚未拥有持久性主键;
    持久化状态    ->已经拥有了持久化主键,并和持久化建立了上下文环境;
    游离    ->拥有持久化主键,但没有和持久建立上下文环境;
    删除    ->拥有持久化主键,和持久化建立了上下文环境,但是从数据库中删除;
 

转载于:https://www.cnblogs.com/ShiningArmor/p/10548801.html

第一次写博客,那是因为我想与大家分享.Net世界.我原来是ASP程序员,与.Net结缘那是在两年多前.第一次接触它,就喜欢上了.哈哈 接着我给大家分享一下我在项目中用到的数据访问层,这个是我用微软网站上得到的DBHepler数据库访问层的一次改编,让它支持实体类和用表达 式的方式生成SQL,而且更关键的是,他是采用参数的方式传值的,这样就避免了SQL的注入啦.. 以下是这个项目的结构 [SuperDAL] ---DbHelper.cs(来自MSDN的数据访问层) ---EntityManager.cs(实体类管理) ---Expressions.cs(实体类表达式查询) ---Expression.cs(实体类表达式) ---OrderByExpressions.cs(排序表达式查询) ---OrderByExpression.cs(排序表达式) ---ObjectValues -------OrderBy.cs(排序枚举类) ---DBManager.cs(数据访问类管理) ---DbParams.cs(数据库访问类参数) ---DataTableExtensions.cs(这个就是顾名思义啦,DataTable传实体类) 在这里最主要介绍的就是EntityManager这个啦,使用方法如下: 有数据库DB的一张表Customs CREATE TABLE [Customs] ( [Name] [varchar] (20) , [Password] [varchar] (20) , [Email] [varchar] (50) , [Phone] [varchar] (11) NULL , [Old] [int] , [Birthday] [DateTime] ) 有个实体类Customs.cs,结构如下: public class Customs { public string Name {get;set;} public string Password {get;set;} public string Email {get;set;} public string Phone {get;set;} public int Old{get;set} public DateTime Brithday {get;set;} } 数据库表与实体Customs结构是一一对应的.有了实体类CUstoms,下面就可以操作实体类跟操作数据库一样的啦,我们新建一个实体类管理类 CustomsManager.cs public class CustomsManager:EntityManager { public Customs GetByName(string name) { //创建表达式Expressions Expressions exps=new Expressions(); //向表达式添加条件 exps.Eq("name",name); //根据条件查询返回实体类 return EM_GetUnique(exps); } public List SearchByName(string name) { //同样像上面一样建立表达式类 Expressions exps=new Expressions(); exps.Like("name",name);//当然,有年朋友会说如果我要姓为"陈"的,那有些人的名字带陈的怎么办,没关系,可以改为 exps.LeftLike ("name",name); //根据条件查询返回实体类 return EM_GetEntity(exps); } /// /// 登录 /// /// 用户名 /// 密码 public List Login(string name,string password) { Expressions exps=new Expressions(); exps.Eq("name",name); exps.Eq("password",password); return EM_GetEntity(exps); } /// /// 选择年龄大于指定岁数的,并按年龄从小到大排序 /// /// 年龄 public List SelectOlder(int old) { Expressions exps=new Expressions(); exps.Gt("old",old); exp.OrderBys.Add("old", OrderBy.Asc); return EM_GetEntity(exps); } /// /// 选择年龄大于小于指定岁数段的,并按年龄从小到大,姓名从字母升序排序 /// /// 年龄 public List SelectByOld(int oldStart,int oldend) { Expressions exps=new Expressions(); exps.Between("old",oldStart,oldEnd); exp.OrderBys.Add("old", OrderBy.Asc); exp.OrderBys.Add("name",OrderBy.Asc); return EM_GetEntity(exps); } #region 增删改 操作 /// /// 更新操作 /// /// 实体类 public int Update(Customs customs) { return EM_Save(customs);//返回更新的记录数,当然,一般成功执行就会返回1;也可以改上面为public void Update(Customs customs) } /// /// 删除操作 /// /// public int DeleteByName(string name) { Expressions exps=new Expressions(); exps.Eq("name",name); return EM_Delete(exps); } /// /// 删除操作 /// /// 实体类 public int Save(Customs custom) { return EM_Save(custom); } #endregion } 当然还有更多的也就不一一贴出来了 Expressions支持的表达式有 1. Eq (等于)[name=value] 2. NotEq (不等于)[not name = value] 3. Ge (大于等于)[name >=value] 4. Gt (大于)[name>value] 5. Le (小于等于)[name<=value] 6. Lt (小于)[name<value] 7. In (包括)[name in (value)] 8. NotIn (不包括)[not name in (value) 9. IsNotNull (不为NULL)[not name is null] 10. IsNull (等于NULL)[name is null] 11. Between (之间)[name between valueStart and valueEnd] 12. Like (模糊) [name like ‘%value%’ ] 13. LeftLike (左模糊) [name like ‘%value’] 14. RightLike (右模糊) [name like ‘value%’] 其它功能待与Net爱好者探讨啦,希望你有更好的思路
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值