鬼混后的知识点整理 ,第一节,简单的建一个,数据库是mysql,项目是maven的,说明也注释在代码里头,结构如下
主要知识点(简单例子,HQL操作,SQL操作)
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ywj</groupId>
<artifactId>TestHibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>TestHibernate</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<!-- 加载Hibernate的jar -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.21.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- 加载Mysql的驱动jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</project>
hibernate.cfg.xml:(hiberante配置文件,主要作用是配置数据库)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- DB连接四要素 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate?rewriteBatchedStatements=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 显示SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 批量插入50条释放内存 -->
<property name="hibernate.jdbc.batch_size">50</property>
<!-- 注册映射文件 -->
<mapping resource="com/ywj/TestHibernate/e/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
log4j.properties:(日志)
log4j.rootLogger = INFO,STDOUT,WARN
log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Target = System.out
log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern = %d %p [%c] - %m %n %l
log4j.appender.WARN = org.apache.log4j.DailyRollingFileAppender
log4j.appender.WARN.File = D:/logs/log.log
log4j.appender.WARN.layout = org.apache.log4j.PatternLayout
log4j.appender.WARN.layout.ConversionPattern = %d %p [%c] - %m %n %l
log4j.appender.INFO = org.apache.log4j.DailyRollingFileAppender
log4j.appender.INFO.File = D:/logs/log.log
log4j.appender.INFO.layout = org.apache.log4j.PatternLayout
log4j.appender.INFO.layout.ConversionPattern = %d %p [%c] - %m %n %l
User.java:(一个对象,也就是一个表,对象的属性(id,name...)也就是表的字段来着)
package com.ywj.TestHibernate.e;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 6277707106263340356L;
public User() {}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
private Long id;
private String name;
private Integer age;
private Date birthday;
private String idNumber;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
}
User.hbm.xml:(对象配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ywj.TestHibernate.e">
<class name="User" table="User" >
<id name="id" column="id">
<generator class="identity" />
</id>
<property name="name" column="name" type="java.lang.String"/><!-- name:对应对象User的属性name column:对应数据库的列 type:对应对象User.name的类型(JAVA的类型) 下面的一样-->
<property name="age" column="age" type="java.lang.Integer"/>
<property name="birthday" column="birthday" type="java.util.Date"/>
<property name="idNumber" column="idNumber" type="java.lang.String"/>
<!-- 如果字段名和数据库的关键字一样的话,要在column中加入[]如下面
<property name="type" column="[type]" type="java.lang.Integer"/> -->
</class>
</hibernate-mapping>
HibernateUtils.java:
package com.ywj.TestHibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
// 工具类,只在是创建session, sessionFactory太重了,一开始就创建了,单例模式不用每次都创建,这里用的是hibernate4
public class HibernateUtils {
private static SessionFactory sessionFactory = null;
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
static {
Configuration config = new Configuration().configure();
ServiceRegistry resgistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory = config.buildSessionFactory(resgistry);
}
// 创建session
public static Session openSession() {
return sessionFactory.openSession();
}
// 获取session
public static Session getCurrentSession() {
Session session = threadLocal.get();
if (session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
}
Test.java:(基本操作)
package com.ywj.TestHibernate.test;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ywj.TestHibernate.e.User;
public class Test {
public static void main(String[] args) {
// 添加
Session session = HibernateUtils.getCurrentSession();
Transaction ts = session.beginTransaction();
/*try {
User user = new User();
user.setName("ywj3");
user.setAge(1);
user.setBirthday(new Date());
user.setIdNumber("IN12345");
session.save(user);
ts.commit();// 提交事务
} catch (Exception e) {
e.printStackTrace();
// 异常回滚
ts.rollback();
} finally {
session.close();
}*/
// 批量添加,修改也可以这个样子
/*try {
User user = null;
for(int i = 0;i<50;i++) {
user = new User();
user.setName("ywj"+i);
user.setAge(1);
user.setBirthday(new Date());
user.setIdNumber("ID"+i);
session.save(user);
if (i/20 == 0) {// 第20个就清空一下缓存
session.flush();
session.clear();
}
}
// 清空最后的缓存
session.flush();
session.clear();
ts.commit();// 提交事务
} catch (Exception e) {
e.printStackTrace();
// 异常回滚
ts.rollback();
} finally {
session.close();
}*/
// 查询
/*Session session = HibernateUtil.getSession();
Transaction ts = session.beginTransaction();
try {
* load获取对象 在没有调用对象任何属性时, 是不是会查询数据库的 比如只执行User user = (User) session.load(User.class, 2L);这行代码时,控制台是不会有输出查询SQL的 也就是没有去查询
* 当执行了 System.out.println("name:"+user.getName()); 时,用到了user.name属性时,才去查询的
User user = (User) session.load(User.class, 2L);// 2L是数据库里对应的ID
System.out.println("name:"+user.getName());
// get获取对象 直接到数库里去查询
User user2 = (User) session.get(User.class, 2L);
System.out.println("name:"+user2.getName());
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}*/
// 修改
/*Session session = HibernateUtil.getSession();
Transaction ts = session.beginTransaction();
try {
User user = (User) session.get(User.class, 2L);
user.setName("ywj2");
session.update(user);
ts.commit();// 提交事务
} catch (Exception e) {
e.printStackTrace();
// 异常回滚
ts.rollback();
} finally {
session.close();
}*/
// 删除
/*Session session = HibernateUtil.getSession();
Transaction ts = session.beginTransaction();
try {
User user = new User();
user.setId(2L);
session.delete(user);
ts.commit();// 提交事务
} catch (Exception e) {
e.printStackTrace();
// 异常回滚
ts.rollback();
} finally {
session.close();
}*/
}
}
TestHQL.java(HQL操作)
package com.ywj.TestHibernate.test;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ywj.TestHibernate.e.User;
public class TestHQL {
/**
* @param args
*/
public static void main(String[] args) {
// HQL 查询全部
String HQL = " from User ";// 注意 这里的User就类名 不是数据库表名
Session session = null;
Transaction ts = null;
try {
session = HibernateUtils.getCurrentSession();
ts = session.beginTransaction();
List<User> list = new ArrayList<User>();
/*Query query = session.createQuery(HQL);
list = query.list();
if(!list.isEmpty()) {
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName());
}
}*/
// 带参数查询
/*HQL = " from User where id = ? and name = ? ";// User是类名 这里的id和name写法和数据字段名一样(对比1)
HQL = " from User user where user.id = ? and user.name = ? ";// User是类名 这里用了别名 user,注意这里的id和name写法和 User属性id,name一样而不是数据库字段名(对比1)
query = session.createQuery(HQL);
query.setParameter(0, 1L);// 第一个?
query.setParameter(1, "ywj3");// 第二个?
list = query.list();
if(!list.isEmpty()) {
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName());
}
}*/
// 带参数查询2
/*HQL = " from User where id = :id and name = :name ";
query = session.createQuery(HQL);
query.setParameter("id", 1L);// 对应:id
query.setParameter("name", "ywj3");// 对应:name
list = query.list();
if(!list.isEmpty()) {
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName());
}
}*/
// 带参数查询 (in)
/*List<Object> ids = new ArrayList<Object>();
ids.add(1L);
ids.add(2L);
HQL = " from User where id in (:id) ";
query = session.createQuery(HQL);
query.setParameterList("id", ids);
list = query.list();
if(!list.isEmpty()) {
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName());
}
}*/
// 查询部分属性 前提是要有这个构造方法User(id,name)
/*HQL = " select new com.ywj.TestHibernate.e.User(id,name) from User ";
query = session.createQuery(HQL);
list = query.list();
if(!list.isEmpty()) {
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName()+"..."+user.getIdNumber());
}
}*/
// 分页
/*HQL = " from User";
Query query = session.createQuery(HQL);
query.setFirstResult(2);// 从第几个开始查起,这里是从第2+1条记录开始查起
query.setMaxResults(5);// 要查多少条
list = query.list();
for(User user : list) {
System.out.println("..."+user.getId()+" "+user.getName()+"..."+user.getIdNumber());
}*/
// 返回唯一
/*HQL = " from User where id = 3";
Query query = session.createQuery(HQL);
User user = (User) query.uniqueResult();
System.out.println("..."+user.getId()+" "+user.getName()+"..."+user.getIdNumber());*/
// 返回数量
/*HQL = "select count(*) from User";
Query query = session.createQuery(HQL);
List<Object> ob = query.list();
System.out.println(Long.valueOf(ob.get(0).toString()));*/
// 更新
/*HQL = "update User set name = 'name' where id = 1 ";
query = session.createQuery(HQL);
query.executeUpdate();
ts.commit();// 单个执行要加上
*/
// 删除
/*HQL = "delete from User where id = 1 ";
query = session.createQuery(HQL);
query.executeUpdate();
ts.commit();
*/
} catch (Exception e) {
e.printStackTrace();
ts.rollback();
} finally {
if(session != null) {
session.close();
}
}
}
}
TestSQL.java:(SQL操作)
package com.ywj.TestHibernate.test;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.ywj.TestHibernate.e.User;
public class TestSQL {
/**
* @param args
*/
public static void main(String[] args) {
Session session = null;
Transaction ts = null;
try {
session = HibernateUtils.getCurrentSession();
ts = session.beginTransaction();
// 查询返回对象
/*String sql = "select * from user";
SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(User.class);// 对象
List<User> list = sqlQuery.list();
if(!list.isEmpty()){// 后面代码就不做判断了 省点事 实际是要判断的
for(User u : list) {
System.out.println(u.getName());
}
}*/
// 查询返回带参数
/*String sql = "select * from user where id = ?";
SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(User.class);// 对象
sqlQuery.setParameter(0, 3);
List<User> list = sqlQuery.list();
for(User u : list) {
System.out.println(u.getName());
}*/
// 查询返回List<Map>
/*String sql = "select name,age from user";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> list = sqlQuery.list();
*/
// 查询返回部分字段
/*String sql = "select name,age from user";
SQLQuery sqlQuery = session.createSQLQuery(sql);// 不加 addEntity(User.class) 返回的是list<Object[]>格式
List<Object[]> list = sqlQuery.list();
for(Object[] obj : list) {
System.out.println(obj[0]+":"+obj[1]);
}*/
// 查询返回一个字段
/*String sql = "select name from user";
SQLQuery sqlQuery = session.createSQLQuery(sql);// 单个字段返回的是List<Object>
List<Object> list = sqlQuery.list();
for(Object obj : list) {
System.out.println(obj);
}*/
// 返回数量
/*String sql = "select count(*) from user";
SQLQuery sqlQuery = session.createSQLQuery(sql);// 单个字段返回的是List<Object>
List<Object> list = sqlQuery.list();
System.out.println(list.get(0));*/
// 添加
/*
String sql = "insert into user (name,age,birthday,idNumber) values (?,?,?,?)";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, "name");// 第一个问号
sqlQuery.setParameter(1, 1);// 第二个问号
sqlQuery.setParameter(2, new Date());// 第三个问号
sqlQuery.setParameter(3, "123");// 第四个问号
sqlQuery.executeUpdate();
ts.commit();*/
//修改
/*String sql = "update user set name = ? where id = ? ";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, "nameup");// 第一个问号
sqlQuery.setParameter(1, 2);// 第一个问号
sqlQuery.executeUpdate();
ts.commit();*/
// 删除
/*String sql = "delete from user where id = ?";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, 4);// 第一个问号
sqlQuery.executeUpdate();
ts.commit();*/
} catch (Exception e) {
e.printStackTrace();
ts.rollback();
} finally {
if(session != null) {
session.close();
}
}
}
}