Hibernate 映射文件使用方式案例

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();
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值