java中如何操作数据库(增删改查)
EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext 注释由EJB 容器动态注入,例:
[java] view plaincopy
@PersistenceContext(unitName="foshanshop")
EntityManager em;
[java] view plaincopy
// 得到实体管理器
private EntityManager getEntityManager() {
return EntityManagerHelper.getEntityManager();
}
[java] view plain copy
// 得到实体管理器
private EntityManager getEntityManager() {
return EntityManagerHelper.getEntityManager();
}
EntityManager常用方法:
[java] view plaincopy
find(*.class,ID) :若实体Bean不存在,则返回null
getReference(*,class,ID) :
若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证实体Bean 已被初始化
[java] view plain copy
find(*.class,ID) :若实体Bean不存在,则返回null
getReference(*,class,ID) :
若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证实体Bean 已被初始化
1.Entity的获取:
注意:若*.class不是Entity Bean的话,都会引发IllegalArgumentException
2.persist() :
添加实体Bean
[java] view plaincopy
// 新增数据
public void save(Role entity) {
try {
EntityManagerHelper.beginTransaction();
getEntityManager().persist(entity);
EntityManagerHelper.commit();
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
[java] view plain copy
// 新增数据
public void save(Role entity) {
try {
EntityManagerHelper.beginTransaction();
getEntityManager().persist(entity);
EntityManagerHelper.commit();
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
3.更新实体Bean :
当实体正在被容器管理时,你可以调用实体的set 方法对数据进行修改,在容器决定flush 时,更新的数据才会同步到数据库。如果你希望修改后的数据实时同步到数据库,你可以执行EntityManager.flush()方法。
4.merge () :
是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定flush 时,数据将会同步到数据库中,执行em.merge(Object obj)方法时,容器的工作规则:
(1).如果此时容器中已经存在一个受容器管理的具有相同ID 的Object实例,容器将会把参数obj的内容拷贝进这个受管理的实例,merge()方法返回受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。
(2).容器中不存在具有相同ID 的Object实例。容器根据传进的obj参数Copy 出一个受容器管理的Object实例,同时merge()方法会返回出这个受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把 实例同步到数据库中。如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException
[java] view plaincopy
// 修改数据
public Role update(Role entity) {
try {
EntityManagerHelper.beginTransaction();
Role result = getEntityManager().merge(entity);
EntityManagerHelper.commit();
return result;
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
[java] view plain copy
// 修改数据
public Role update(Role entity) {
try {
EntityManagerHelper.beginTransaction();
Role result = getEntityManager().merge(entity);
EntityManagerHelper.commit();
return result;
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
5.Remove() :
删除对象
[java] view plaincopy
// 删除数据
public void delete(Role entity) {
try {
EntityManagerHelper.beginTransaction();
entity = getEntityManager()
.getReference(Role.class, entity.getId());
getEntityManager().remove(entity);
EntityManagerHelper.commit();
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
[java] view plain copy
// 删除数据
public void delete(Role entity) {
try {
EntityManagerHelper.beginTransaction();
entity = getEntityManager()
.getReference(Role.class, entity.getId());
getEntityManager().remove(entity);
EntityManagerHelper.commit();
} catch (RuntimeException re) {
EntityManagerHelper.rollback();
throw re;
}
}
6.createQuery()
返回Query对象,以执行JPQL语句
7.createNativeQuery()
返回Query对象,以执行SQL语句
8.refresh()
刷新实体Bean,以得到对新对象 (幽雅的获取最新对象方法)
9.contains()
检测实体当前是否被管理中该方法使用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回值为true,否则为false
10.clear()
分离所有当前正在被管理的实体在处理大量实体的时候,如果你不把已经处理过的实体从EntityManager 中分离出来,将会消耗你大量的内存。调用EntityManager 的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。
有一点需要说明下,在事务没有提交前(事务默认在调用堆栈的最后提交,如:方法的返回),如果调用clear()方法,之前对实体所作的任何改变将会掉失,所以建议你在调用clear()方法之前先调用flush()方法保存更改
11. flush()
将实体的改变立刻刷新到数据库中
当实体管理器对象在一个session bean 中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时提交并且同步它的内容。在一个session bean 中,服务器的事务默认地会在调用堆栈的最后提交(如:方法的返回)
12.javax.persistence.FlushModeType 实体Bean管理器的Flush模式
FlushModeType.COMMIT :刷新只有在事务提交时才发生,使用场合:在大量更新数据的过程中存在查询语句(除了find()和getreference()查询)的执行
FlushModeType.AUTO :(默认模式)刷新在查询语句执行前(除了find()和getreference()查询)或事务提交时才发 生,使用场合:在大量更新数据的过程中没有任何查询语句(除了find()和getreference()查询)的执行。
JDBC 驱动跟数据库交互的次数。JDBC 性能最大的增进是减少JDBC 驱动与数据库之间的网络通讯FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互(触发了多少次Flush 就产生了多少次网络交互)
设置:entityManager.setFlushMode(FlushModeType.COMMIT);
13.getDelegate( )
获取持久化实现者的引用
用过getDelegate( )方法,你可以获取EntityManager 持久化实现者的引用,如Jboss EJB3 的持久化产品采用Hibernate,可以通过getDelegate( ) 方法获取对他的访问,如:
@PersistenceContext
protected EntityManager em;
HibernateEntityManager manager = (HibernateEntityManager)em.getDelegate();
获得对Hibernate 的引用后,可以直接面对Hibernate 进行编码,不过这种方法并不可取,强烈建议不要使用.在Weblogic 中,你也可以通过此方法获取对Kodo 的访问
另:映射的表名或列名与数据库保留字同名时的处理
将表名加标式符,例如:在Mysql下,用'order',或在sqlserver下用[TableName],但这样做不适合程序移植
[java] view plaincopy
// 通过id查询数据
public Role findById(Integer id) {
try {
Role instance = getEntityManager().find(Role.class, id);
return instance;
} catch (RuntimeException re) {
throw re;
}
}
// 查询所有数据
@SuppressWarnings("unchecked")
public List<Role> findAll() {
try {
final String queryString = "select model from Role model";
Query query = getEntityManager().createQuery(queryString).setHint(
"toplink.refresh", true);
return query.getResultList();
} catch (RuntimeException re) {
throw re;
}
}
[java] view plain copy
// 通过id查询数据
public Role findById(Integer id) {
try {
Role instance = getEntityManager().find(Role.class, id);
return instance;
} catch (RuntimeException re) {
throw re;
}
}
// 查询所有数据
@SuppressWarnings("unchecked")
public List<Role> findAll() {
try {
final String queryString = "select model from Role model";
Query query = getEntityManager().createQuery(queryString).setHint(
"toplink.refresh", true);
return query.getResultList();
} catch (RuntimeException re) {
throw re;
}
}
[java] view plaincopy
public class EntityManagerHelper {
// 实体化私有静态实体管理器变量emf
private static final EntityManagerFactory emf;
// 实体化私有静态本地线程变量threadLocal
private static final ThreadLocal<EntityManager> threadLocal;
// 用来给两个变量赋初值的静态块
static {
emf = Persistence.createEntityManagerFactory("lamsPU");
threadLocal = new ThreadLocal<EntityManager>();
}
// 得到实体管理器的方法
public static EntityManager getEntityManager() {
EntityManager manager = threadLocal.get();
if (manager == null || !manager.isOpen()) {
manager = emf.createEntityManager();
threadLocal.set(manager);
}
return manager;
}
// 关闭实体管理器的方法
public static void closeEntityManager() {
EntityManager em = threadLocal.get();
threadLocal.set(null);
if (em != null)
em.close();
}
// 开始事务的方法
public static void beginTransaction() {
getEntityManager().getTransaction().begin();
}
// 提交事务的方法
public static void commit() {
getEntityManager().getTransaction().commit();
}
// 回滚事务的方法
public static void rollback() {
getEntityManager().getTransaction().rollback();
}
// 生成查找的方法
public static Query createQuery(String query) {
return getEntityManager().createQuery(query);
}
public static void log(String string, Level info, Object object)
{
// TODO Auto-generated method stub
}
}
java中如何操作数据库(增删改查)的更多相关文章
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- Django-Model操作数据库(增删改查、连表结构)
一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models class userinfo(models.M ...
- phpcms 操作数据库 增删改查
数据库的其他类继承的都是libs/class/model.class.php 这里面有写好的操作数据库的常用方法 1.增 insert($data, $return_insert_id = false ...
- MongoDB学习day04--NodeJs操作数据库增删改查
一.在Nodejs中使用Mongodb Nodejs需要引入的包 npm install mongodb --save -dev 或者使用镜像 cnpm install mongodb --save ...
- java操作数据库增删改查的小工具1--TxQueryRunner
在java程序中,一般使用jdbc连接数据库,比较麻烦,在看传智教程时学了一个工具类,用于简化与数据库之间的操作步骤,就是TxQueryRunner,他是QueryRunner的子类,用起来和他是一样 ...
- java操作数据库增删改查的小工具2--TxQueryRunner
当涉及到多表查询时,如数据库中有两张表分别为t_person和t_address,表结构如下: 其中t_person的外键为t-address的主键aid, 新建两个javaBean类,Person ...
- Java通过jedis操作redis(增删改查)
package sgh.main.powersite; import java.util.ArrayList; import java.util.HashMap; import java.util.I ...
- JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能
一.分页工具类 package blank.util;import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; ...
- 前端web通过flask操作数据库-增删改查
后端python代码: #coding:utf8 from flask import Flask,request,render_template import pymysql as mysql imp ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
随机推荐
- 阿里云如何添加多个网站 for Linux(绑定域名)
我们可以通过.htaccess文件来达到一个空间帮顶多个域名的效果,即域名1访问空间上webroot下的目录1(即二级目录),域名2访问空间上webroot下的目录2,等等.二级目录名为fuli,需要 ...
- h2 database
java -cp h2-1.4.187.jar org.h2.tools.Shell -url jdbc:h2:file:~/.h2/hzhssh -user sa 如果有个数据库的文件名为:hzhs ...
- [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)
前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系: <1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) : 函数实现代码: #inclu ...
- MySQL注入总结
SELECT first_name, last_name FROM users WHERE user_id = '$id' 1.id=1' or 1=1 -- 这个可以查询所有的信息,其中“- ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- DevExpress控件 GridControl 单元格编辑 回车
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【设计模式 - 6】之桥接模式(Bridge)
1 模式简介 举个例子,人.车和公路是三个维度,人开着车在公路上行驶,就是将这三个维度进行了关联.人分男人(Man)和女人(Woman),车分小轿车(Car)和公共汽车(Bus),公路分市区 ...
- Vim 程序编辑器 经常使用操作
按下 i 进入编辑模式 wq! 强制保存并退出 q! 不保存,强制退出 !有强制的意思 方向键位: k h j l Ctrl + f 向下移动一页 Ctrl + b 向上移动一页 0 一行的开头 ...
- 检查Oracle 中死事务的语句
SQL> SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */ 2 KTUXESTA Status, KTUXECFL Flags ...
- Dubbo框架中的应用(两)--服务治理
Dubbo服务治理了看法 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaGVoZQ==/font/5a6L5L2T/fontsize/400/fi ...