Hibernate 映射文件使用方式案例
本案例使用的hibernate版本为 hibernate-release-5.2.10.Final
为了测试,本案例在mysql数据库中创建了一个db数据库。
创建一个java项目:项目的结构如下:(lib文件夹用于存放jar包)
lib目录下则是hibernate5需要的jar包(注需要将jar加载到项目中:选中jar包右键 --》BuildPath--》Add to Build Path)
log4j.properties为日志配置文件(需要加载配置junit),此项目可以不需要日志,使用日志只是为了观察方便。
注:junit配置可以参考 http://blog.csdn.net/benxiaohai888/article/details/78231911
由于在主配置文件配置了字段创建数据表的配置,所以第一次加载时就会自动创建数据表
配置的代码:
<!-- 自动生成数据表(数据表的生成方式) -->
<property name="hbm2ddl.auto">update</property>
接下来是示例代码:
1、主配置文件 hibernate.cfg.xml
<?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>
<!--配置一:数据库连接信息 -->
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db?characterEncoding=utf8</property>
<!--数据库用户名, -->
<property name="hibernate.connection.username">root</property>
<!--数据库密码 -->
<property name="hibernate.connection.password"></property>
<!--配置二:数据库方言配置,配置数据库方言的作用是屏蔽数据库的差异,换句话说是使hibernate框架知道 要与哪种数据库取得联系 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--配置三:其它配置 (这些配置可选) -->
<!-- 是否在控制台显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!--是否格式化删除sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动生成数据表(数据表的生成方式) -->
<property name="hbm2ddl.auto">update</property>
<!-- 将session绑定到当前线程 -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 设置事务的隔离级别 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置四:映射配置 -->
<mapping resource="cn/sz/entity/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
2、工具类(获取Session)HibernateUtil.java
package cn.sz.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
public static Session getSession() {
Session session = null;
// 创建一个读取主配置文件的对象
Configuration cfg = new Configuration();
// 读取主配置文件
cfg.configure();
// 创建Session工厂
SessionFactory factory = cfg.buildSessionFactory();
// 打开Session
// session = factory.openSession();
// 如果在主配置文件将session绑定到线程中,所以可以从线程中取出session
session = factory.getCurrentSession();
return session;
}
}
3、日志文件 log4j.properties
log4j.rootLogger=DEBUG,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.maxBackupIndex=100
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=c:/error1.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=1MB
4、实体类 User.java
package cn.sz.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class User implements Serializable {
// 适应数值形式的主键值
private Integer uid;
private String uname;
private Date udate;
private String content;
// 使用字节数组存储图片
private byte[] photo;
// 集合类型的属性
// Set集合
private Set<String> setAddress;
// List集合
private List<String> listAddress;
// 对应映射文件bag
private List<String> bagListAddress;
// Map集合
private Map<String, String> mapAddress;
// 数组属性
private String[] arrayAddress;
public User() {
}
public Set<String> getSetAddress() {
return setAddress;
}
public void setSetAddress(Set<String> setAddress) {
this.setAddress = setAddress;
}
public List<String> getListAddress() {
return listAddress;
}
public void setListAddress(List<String> listAddress) {
this.listAddress = listAddress;
}
public List<String> getBagListAddress() {
return bagListAddress;
}
public void setBagListAddress(List<String> bagListAddress) {
this.bagListAddress = bagListAddress;
}
public Map<String, String> getMapAddress() {
return mapAddress;
}
public void setMapAddress(Map<String, String> mapAddress) {
this.mapAddress = mapAddress;
}
public String[] getArrayAddress() {
return arrayAddress;
}
public void setArrayAddress(String[] arrayAddress) {
this.arrayAddress = arrayAddress;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public byte[] getPhoto() {
return photo;
}
public void setPhoto(byte[] photo) {
this.photo = photo;
}
public Date getUdate() {
return udate;
}
public void setUdate(Date udate) {
this.udate = udate;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
5、User实体映射文件User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package为实体类所在的包 -->
<hibernate-mapping package="cn.sz.entity">
<!-- 实体类和哪个表对应 ;table用于配置实体类和表的对应;name用于配置哪个实体类和表对应 -->
<class table="q_user" name="User">
<!-- id用于配置主属性和主键字段对应;id的name用于配置属性名 -->
<id name="uid">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- property用于配置普通属性和字段的对应 -->
<!-- type用于设置字段的类型,值的选择可以选hibernate类型,也可以选择Java类型; type可以省略,在省略的情况下hibernate自适应;length为长度 -->
<property name="uname" length="30"></property>
<property name="udate" type="date"></property>
<property name="content" type="text" length="10000"></property>
<property name="photo" type="byte[]" length="1024000"></property>
<!-- 使用set标签对应实体类中的set属性,name用于配制属性名, table用于配制所生成的第二张表格名称的;set对应无序特点 -->
<set name="setAddress" table="q_set">
<!-- key用于配制第二张表中外键字段 -->
<key column="userid"></key>
<element column="address" type="string"></element>
</set>
<!-- list标签 -->
<list name="listAddress" table="q_list">
<key column="userid"></key>
<list-index column="index_"></list-index>
<element column="address" type="string"></element>
</list>
<!-- 在实体类中通过list集合,在映射中通过bag标签定义一类属性和表的 对应关系,此bag特点是set和list两个特点结合到一起(无序,能重复) -->
<bag name="bagListAddress" table="q_bag">
<key column="userid"></key>
<element column="address" type="string"></element>
</bag>
<!-- 对应数组属性成员 -->
<array name="arrayAddress" table="q_arr">
<key column="userid"></key>
<index column="index_"></index>
<element column="address" type="string"></element>
</array>
<!-- 对应map类型的属性的配置 -->
<map name="mapAddress" table="q_map">
<key column="userid"></key>
<!-- 对应映射集合中的key -->
<map-key column="key_" type="string"></map-key>
<element column="address" type="string"></element>
</map>
</class>
</hibernate-mapping>
6、测试类
package cn.sz.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.hibernate.Session;
import org.junit.Test;
import cn.sz.entity.User;
import cn.sz.utils.HibernateUtil;
public class UserTest {
@Test
public void testSave() throws IOException {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 创建一个用户
User u = new User();
u.setUname("张三");
u.setContent("张三的个人简介");
u.setUdate(new Date());
// 读取图片
InputStream is = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\test.jpg"));
byte[] photo = new byte[is.available()];
is.read(photo);
u.setPhoto(photo);
// 创建Map集合
Map<String, String> map = new HashMap<>();
map.put("a1", "北京");
map.put("a2", "上海");
// 将map集合绑定到用户
u.setMapAddress(map);
// 创建List集合
List<String> list = new ArrayList<>();
list.add("南京");
list.add("昆明");
// 将List集合绑定到用户
u.setListAddress(list);
// 测试List集合和Set的结合体bag
List<String> list2 = new ArrayList<>();
list2.add("南京");
list2.add("昆明");
// 将List集合绑定到用户
u.setBagListAddress(list2);
// 创建Set集合
Set<String> set = new HashSet<>();
set.add("西藏");
set.add("深圳");
// 将set集合绑定到用户
u.setSetAddress(set);
// 创建数组
String[] arr = new String[2];
arr[0] = "龙华";
arr[1] = "澳门";
// 将数组绑定到用户
u.setArrayAddress(arr);
session.save(u);
session.getTransaction().commit();
is.close();
session.close();
}
@Test
public void testQuery() throws IOException {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 查询id为1的用户姓名
User user = session.get(User.class, 1);
System.out.println(user.getUname());
// set集合查询
Set<String> set = user.getSetAddress();
for (String string : set) {
System.out.println(string);
}
// list集合查询
List<String> listAddress = user.getListAddress();
for (String string : listAddress) {
System.out.println(string);
}
// map集合查询
Map<String, String> mapAddress = user.getMapAddress();
Set<String> keySet = mapAddress.keySet();
for (String string : keySet) {
System.out.println(mapAddress.get(string));
}
// 数组查询
String[] arrayAddress = user.getArrayAddress();
for (String string : arrayAddress) {
System.out.println(string);
}
// bag
List<String> bagListAddress = user.getBagListAddress();
for (String string : bagListAddress) {
System.out.println(string);
}
// 将图片写出去
OutputStream os = new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\测试.jpg"));
byte[] photo = user.getPhoto();
os.write(photo);
os.close();
session.getTransaction().commit();
session.close();
}
}