批量添加
用hibernate API来做,需要及时清空缓存。
if (i % 10 == 0) { //每处理10条清空缓存
session.flush();
session.clear();
}
public class HibernateDemo2 {
@Test
public void batchInsert() {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Customer customer1 = new Customer("李梅", "网络", "123", "123", "123", "123");
Customer customer2 = new Customer("张无忌", "网络", "123", "123", "123", "123");
Customer customer3 = new Customer("美丽的", "网络", "123", "123", "123", "123");
Customer customer4 = new Customer("漂亮姐", "网络", "123", "123", "123", "123");
List<Customer> list = new ArrayList<Customer>();
list.add(customer1);
list.add(customer2);
list.add(customer3);
list.add(customer4);
if (list != null && list.size() > 0) {
try {
session.beginTransaction();
Customer customer = null;
for (int i = 0; i < list.size(); i++) {
customer = list.get(i);
session.save(customer);
if (i % 10 == 0) { //每处理10条清空缓存
session.flush();
session.clear();
}
}
session.getTransaction().commit(); // 提交事物
} catch (Exception e) {
e.printStackTrace(); // 打印错误信息
session.getTransaction().rollback(); // 出错将回滚事物
} finally {
session.close();
sessionFactory.close(); // 关闭Session
}
}
}
}
批量删除
需要注意的是,hibernate执行查询的语句hql是面向对象的查询,而不是面向数据库表的查询,因此在hql语句中的对象名必须与实体类的类名一致,严格区分大小写。
public void batchDelete() {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int[] a = {2,4,5};
String hql ="";
for(int i =0;i<a.length;i++) {
if(i==0) {
hql = "cust_id="+a[i];
} else {
hql =hql + " or cust_id="+a[i];
}
}
Query q= session.createQuery("delete from Customer where "+hql);//这里Customer是实体名,而不是表名
q.executeUpdate();
transaction.commit();
session.close();
sessionFactory.close();
}
模糊查询
和SQL查询一样,hibernate,HQL使用like关键字进行模糊查询。模糊查询能够比较字符串是否与指定的字符串模式匹配。其中使用通配符表示:如下
%(百分号):匹配任意类型、任意长度的字符串,中文则需要两个百分号"%%"
_(下划线):匹配单个任意字符,一般用来限制字符串表达式的长度。
1.检索姓名以"M"开头的同学:
String queryString="from studentInfo s where s.sname like 'S%'";
2.检索姓名中包含字符串"abc"的学生对象:
String queryString="from studentInfo s where s.sname like '%abc%'";
3.检索以S开头,并且字符串长度为5的学生对象:
String queryString="from studentInfo s where s.sname like 'S____'"; 四个下划线"_"
4.检索学生姓名中含有"王"的所有学生:
String queryString = "from StudentInfo s where s.sname like'%"+sname+"%'";
public void fuzzyQuery() {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
String cname ="张";
String queryString = "from Customer c where c.cust_name like'%"+cname+"%'";
/**
*queryString中的Customer 是实体类,区分大小写。cust_name 是实体类的属性名
*/
Query queryObject = session.createQuery(queryString);
List<Customer> list = queryObject.list();
for(Customer c :list) {
System.out.println(c);
}
transaction.commit();
session.close();
sessionFactory.close();
}