Hibernate_4.1

1、Hibernate 单表配置

1、实体类(Student.java)
public class Student{
    private Integer id;
    private String username;
    private String password;
    //setters and getters
    //tostring
}
2、映射文件(Student.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">
<hibernate-mapping>
    <class name="com.qf.entity.Students" table="student">
        <id name="id" column="id">
			<!-- native:生成表id值就是主键自动增长 -->
            <generator class="native"></generator>
        </id>
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
    </class>
</hibernate-mapping>
3、核心配置文件(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>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<!-- 第二部分: 配置hibernate信息  可选的-->
		<property name="hibernate.show_sql">true</property>				<!-- 输出底层sql语句 -->
		<property name="hibernate.format_sql">true</property>			<!-- 输出底层sql语句格式 -->
		<property name="hibernate.hbm2ddl.auto">update</property>  		<!-- update:有表,更新;没有,创建-->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>	<!-- 方言 -->
		
		<!-- 第三部分: 把映射文件放到核心配置文件中 必须的-->
		<mapping resource="cn/itcast/entity/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
4、工具类(HibernateUtils.Java)
public class HibernateUtils {
    //创建本地线程
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<>();
    private static Configuration cfg = new Configuration();
    private static SessionFactory factory;
    private static Session session;

    static {
        //加载配文件
        cfg.configure();
        //创建工厂
        factory = cfg.buildSessionFactory();
    }

    private CRUDUtil() {}	//私有构造使工具类单例

    //加载工厂
    public static Session getSession() {
        Session session = threadLocal.get();
        if (session == null || !session.isOpen()) {
            if (session == null) {  
                rebuildSessionFactory();	//重新创建工厂
            }
            session = factory.openSession();	//加载工厂
        }
        return session;
    }

    //重新创建工厂
    public static void rebuildSessionFactory() {
        cfg.configure();	//加载配置文件
        factory = cfg.buildSessionFactory();	//创建工厂
    }

    //关闭工厂
    public static void closeSession(Closeable... sessions) {
            for (Closeable session : sessions) {
                if (session != null) {
                    session.close();
                }
            }
    }
}

2、Hibernate CRUD操作

1、添加
Student student=new Student();	//实例化实体类
student.setId(2);
student.setUsername("张三");
student.setPassword("1234");
session.save(student);	//保存数据

//瞬时态添加---new对象跟id无关----也不能添加id
session.saveOrUpdate(student);	//保存数据
2、删除(根据Id删除)
Student student=session.get(Student.class,2);	//获取实体类的Id
session.delete(student);	//删除数据
3、修改(根据Id的修改)
Student student=session.get(Student.class,3);	//获取实体类的Id
student.setUsername("李四");
student.setPassword("123");
session.update(student);	//更新数据
//持久态修改----new对象跟id有关
session.saveOrUpdate(student);	//更新数据

//托管态修改----new对象跟id无关
Student student=new Student();	//获取实体类的Id
student.setId(2);
student.setUsername("李四");
student.setPassword("123");
session.saveOrUpdate(student);	//更新数据
4、查询
(1)、OID查询(根据Id查询 - - - - - - 对象 )
Student studernt=session.get(Student.class,1)
(2)、HQL查询
/***  所有查询 / 分页查询  ***/
String hql="from Student";
Query query=session.createQuery(hql);	//所有查询
//分页查询
query.setFirstResult(0);	//起始位置
query.setMaxResults(3);		//页面条数	

/***  条件查询 / 模糊查询 ***/
String hql="from Student where username=? and password=?";
Query query=session.createuery(hql);
query.setParameter(0,"王%_");		// 模糊查询 %:0或多个 	_:1个
query.setParameter(1,"1234");	//条件查询

/***  排序查询  ***/
String hql="from Student order by id asc";	// desc降序  asc升序
Query query=session.createQuery(hql);

/****  返回lIst集合  ****/
List<Student> list=query.list();


/***************  统计查询  *****************/
String hql="select count(1) from student [where username=? and password=?]";
Query query=session.createQuery(hql);
Object obj=query.uniqueResult();	//返回Object型
Long lobj=(Long)obj;
int count=lobj.intValue();	//将Long型转化为int型

(3)、QBC查询
/***  所有查询 / 分页查询  ***/
Criteria criteria=session.createCriteria(Student.class);	//查询所有
//分页查询
criteria.setFirstResult(0);		//起始位置
criteria.setMaxResults(3);		//页面条数	

/***  条件查询  ***/
Criteria criteria=session.createCriteria(Student.class);
criteria.add(Restrictions.eq("username","张三"));
criteria.add(Restrictions.eq("password","1234"))

/***  排序查询  ***/
Criteria criteria=session.createCriteria(Student.class);
criteria.addOrder(Order.asc("id"));

/****  返回lIst集合  ****/
List<Student> list=criteria.list();


/***************  统计查询  *****************/
Criteria criteria=session.createCriteria(Student.class);
//可加条件查询
criteria.add(Restrictions.eq("username","张三"));
criteria.add(Restrictions.eq("password","1234"))
 
Object obj=criteria.uniqueResult();	//返回Object型
Long lobj=(Long)obj;
int count=lobj.intValue();	//将Long型转化为int型

(4)、SQL查询(了解)
/***所有查询/分页查询***/
String sql="select * from Student";		//所有查询
String sql="select * from Student limit ?,?";	//分页查询
SQLQuery query=session.createSQLQuery(sql);	
//分页查询
query.setParameter(0,0);	//起始位置
query.setParameter(0,3);		//页面条数	

/***条件查询/模糊查询***/
String hql="select * from Student where username=? and password=?";
SQLQuery query=session.createSQLQuery(sql);
query.setParameter(0,"王%_");	// 模糊查询 %:0或多个 	_:1个
query.setParameter(1,"1234");	//条件查询

/***排序查询***/
String hql="select * from Student order by id asc";	// desc降序  asc升序
SQLQuery query=session.createSQLQuery(sql);	

/****返回lIst集合****/
query.addEntity(Student.class);
List<Student> list=query.list();

/***************统计查询*****************/
String hql="select count(1) from student [where username=? and password=?]";
SQLQuery query=session.createSQLQuery(sql);	
Object obj=query.uniqueResult();	//返回Object型
Long lobj=(Long)obj;
int count=lobj.intValue();	//将Long型转化为int型

3、Hibernate 一对多配置

1、实体类
(1)、客户类(一对多)Customer.java
public class Customer {
	private Integer cid;	//客户id
	private String custName;	//客户名称
	private String custLevel;	//客户级别
	private String custSource;	//客户来源
	private String custPhone;	//联系电话
	private String custMobile;	//手机
	private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();	//使用集合表示多的数据,使用set集合
	//setters and getters
}

(2)、联系人类(多对一)LinkMan.java
public class LinkMan {
	private Integer lkm_id; // 联系人编号(主键)
	private String lkm_name;// 联系人姓名
	private String lkm_gender;// 联系人性别
	private String lkm_phone;// 联系人办公电话
	private Customer customer;	// 在联系人实体类里面表示所属客户,一个联系人只能属于一个客户
	//setters and getters
}

2、映射文件
(1)、客户(一对多)Customer.hbm.xml
<hibernate-mapping>
	<class name="cn.itcast.entity.Customer" table="t_customer">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="custName" column="custName"></property>
		<property name="custLevel" column="custLevel"></property>
		<property name="custSource" column="custSource"></property>
		<property name="custPhone" column="custPhone"></property>
		<property name="custMobile" column="custMobile"></property>
		
		<!-- inverse属性默认值:false不放弃关系维护
			                   true表示放弃关系维护	-->
		<set name="setLinkMan" inverse="true">
			<!-- 一对多建表,有外键
				hibernate机制:双向维护外键,在一和多那一方都配置外键	
				column属性值:外键名称
			 -->
			<key column="clid"></key>	<!-- 给Customer类添加外键id -->
			<one-to-many class="cn.itcast.entity.LinkMan"/>
		</set>
	</class>
</hibernate-mapping>

(2)、联系人(多对一)LinkMan.hbm.xml
<hibernate-mapping>
	<class name="cn.itcast.entity.LinkMan" table="t_linkman">
		<id name="lkm_id" column="lkm_id">
			<generator class="native"></generator>
		</id>
		<property name="lkm_name" column="lkm_name"></property>
		<property name="lkm_gender" column="lkm_gender"></property>
		<property name="lkm_phone" column="lkm_phone"></property>
		
		<!-- 表示联系人所属客户 
			name属性:因为在联系人实体类使用customer对象表示,写customer名称
			class属性:customer全路径
			column属性:外键名称
		-->
		<many-to-one name="customer" class="cn.itcast.entity.Customer" column="clid"></many-to-one>
	</class>
</hibernate-mapping>

3、核心配置文件(hibernate.cfg.xml)
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day03</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<mapping resource="cn/itcast/entity/Customer.hbm.xml"/>
		<mapping resource="cn/itcast/entity/LinkMan.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4、Hibernate 一对多CRUD

1、添加
1、第一步(给Customer配置文件)
<set name="setLinkMan" cascade="save-update"></set>		<!-- cascade: 只对ustomer表执行操作即可 -->

2、第二步
Customer customer = new Customer();
customer.setCustName("百度");
.....
                
LinkMan linkman = new LinkMan();
linkman.setLkm_name("小宏");
......
    
//2 把联系人放到客户里面
customer.getSetLinkMan().add(linkman);
//3 保存客户
session.save(customer);

2、删除(根据Id修改)
1、第一步(给Customer配置文件)
<set name="setLinkMan" cascade="save-update,delete"></set>

2、第二步(根据Id添加)
Customer customer=session.get(Customer.class,2);	// 先查询
session.delete(customer);		//再删除

3、Hibernate 多对多配置

1、实体类
(1)、教师类(多对多)Teacher.java
public class Teacher {
	private Integer tea_id;		//教师id
	private String tea_name;	//教师姓名
	private String tea_phone;	//教师电话

	private Set<Student> student= new HashSet<Student>();	//使用集合表示多的数据,使用set集合
	//setters and getters
}

(2)、学生类(多对多)Student.java
public class Student{
	private Integer stu_id;		 	// 学生id
	private String  stu_name;		// 学生姓名
	private String  stu_gender;		// 学生性别
	private String  stu_phone;		// 学生电话
	
	private Set<Teacher> student= new HashSet<Teacher>();	//使用集合表示多的数据,使用set集合
	//setters and getters
}

2、映射文件
(1)、教师(多对多)Teacher.hbm.xml
<hibernate-mapping>
	<class name="cn.itcast.entity.Teacher" table="t_teacher">
		<id name="tea_id" column="tea_id">
			<generator class="native"></generator>
		</id>
		<property name="tea_name" column="tea_name"></property>
		<property name="tea_phone" column="tea_phone"></property>
	
		
		<!-- table: 第三张表名 -->
		<set name="setLinkMan"  table="three_tables">
			<!-- 一对多建表,有外键
				hibernate机制:双向维护外键,在一和多那一方都配置外键	
				column属性值:外键名称
			 -->
			<key column="clid"></key>	<!-- 给Customer类添加外键id -->
			<many-to-many class="cn.itcast.entity.Student" column="user_id"/>
		</set>
	</class>
</hibernate-mapping>

(2)、学生人(多对多)Student.hbm.xml
<hibernate-mapping>
	<class name="cn.itcast.entity.Student" table="t_student">
		<id name="stu_id" column="stu_id">
			<generator class="native"></generator>
		</id>
		<property name="stu_name" column="stu_name"></property>
		<property name="stu_gender" column="stu_gender"></property>
		<property name="stu_phone" column="stu_phone"></property>
		
		<!-- table: 第三张表名 -->
		<set name="setLinkMan"  table="three_tables">
			<!-- 一对多建表,有外键
				hibernate机制:双向维护外键,在一和多那一方都配置外键	
				column属性值:外键名称
			 -->
			<key column="clid"></key>	<!-- 给Customer类添加外键id -->
			<many-to-many class="cn.itcast.entity.Teacher" column="user_id"/>
		</set>

	</class>
</hibernate-mapping>

3、核心配置文件(hibernate.cfg.xml)
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day03</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<mapping resource="cn/itcast/entity/Teacher.hbm.xml"/>
		<mapping resource="cn/itcast/entity/Student.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4、Hibernate 一对多CRUD

1、添加
1、第一步(给Teacher配置文件)
<set name="setLinkMan" table="three_tables" cascade="save-update"></set>		<!-- cascade: 只对teacher表执行操作即可 -->

2、第二步
Teacher teacher = new Teacher();
teacher.setTeaName("百度");
.....
                
Student student = new Student();
student.setStuName("小宏");
......
    
Teacher.getSetTeacher().add(student);
Student.getSetStudent().add(teacher);
session.save(Teacher);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值