eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发

eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate中的注释

前言

本文参考自https://www.w3cschool.cn/hibernate/zief1iev.html后做的一个实践笔记记录。

项目实践

1、初始化项目及jar包拉取

eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发

2、mysql数据结构

eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发

eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (
  `id` varchar(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `student_number` int(11) DEFAULT NULL,
  `teacher` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES ('1', '三年一班', '30', '老陈');
INSERT INTO `classes` VALUES ('2', '四年二班', '42', '老李');
INSERT INTO `classes` VALUES ('3', '五年一班', '35', '老董');

3、创建hibernate.cfg.xml

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<!--mysql的驱动包 -->
		<property name="connection.driver_class">
			com.mysql.cj.jdbc.Driver
		</property>
		<!--数据库连接地址,这里数据库以参数形式传入,以;分隔不同参数-->
		<property name="connection.url">
			jdbc:mysql://localhost:3306/student?serverTimezone=UTC
		</property>
		<!--数据库账号-->
		<property name="connection.username">
			root
		</property>
		<!--数据库密码-->
		<property name="connection.password">
			root
		</property>
		<!--数据库连接池-->
		<property name="connection.pool_size">
			10
		</property>
		<!--日志文件中是否展示sql-->
		<property name="show_sql">
			true
		</property>
		<!--设置Hibernate SQL方言-->
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
	<!-- 其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。 -->
	<!-- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 -->
	<!-- create-drop : 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。-->
	<!-- update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。 -->
	<!-- validate : 每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。-->
		<property name="hbm2ddl.auto">
			update
		</property>
		
		<mapping class="com.czx.annotations.pojo.Classes"/>
	</session-factory>
</hibernate-configuration>

4、创建实体类Classes,使用注解实现实体类的对应情况。(各个注解的说明请看最后那个点)

Classes

package com.czx.annotations.pojo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "classes")
public class Classes {
	
	@Id 
//	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column
	private String id;
	
	@Column
	private String name;
	
	@Column(name = "student_number")
	private Integer studentNumber;
	
	@Column(name = "teacher")
	private String teacher;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getStudentNumber() {
		return studentNumber;
	}

	public void setStudentNumber(Integer studentNumber) {
		this.studentNumber = studentNumber;
	}

	public String getTeacher() {
		return teacher;
	}

	public void setTeacher(String teacher) {
		this.teacher = teacher;
	}

	public Classes(String id, String name, Integer studentNumber, String teacher) {
		this.id = id;
		this.name = name;
		this.studentNumber = studentNumber;
		this.teacher = teacher;
	}

	public Classes() {
	}

	@Override
	public String toString() {
		return "Classes [id=" + id + ", name=" + name + ", studentNumber=" + studentNumber + ", teacher=" + teacher
				+ "]";
	}

	
}

5、创建ClassesCURD实现简答的增删改查

ClassesCURD

package com.czx.annotations;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.czx.annotations.pojo.Classes;



public class ClassesCURD {
	private static SessionFactory sessionFactory;
	
	
	public static void main(String[] args) {
		try {
			//如果你使用的是hibernate4之前的核心包,那么就用这种方式来获取对应的sessionFactory
//		sessionFactory =new AnnotationConfiguration().
//        configure().
//        //addPackage("com.czx.annotations.pojo") //add package if used.
//        addAnnotatedClass(Classes.class).
//        buildSessionFactory();
		
			
		//在hibernate4之后就移除了AnnotationConfiguration()方法了,Configuration已经包含了注解的方法,所以你可以直接用:
		sessionFactory = new Configuration().configure().buildSessionFactory();
		}catch (Throwable t) {
			System.out.println("初始化sessionFactory失败,异常为:"+t);
			throw new ExceptionInInitializerError(t);
		}
		Classes classes = new Classes("6","某年某班",60,"某班主任");
		ClassesCURD classesCurd = new ClassesCURD();
		//添加测试
		String a6 = classesCurd.addClasses(classes);
		System.out.println("添加结果为"+a6);
		
		//删除测试
		String d1 = classesCurd.deleteClasses("1");
		System.out.println("删除结果为"+d1);
		
		//修改测试
		Classes c2 = new Classes("6","A年B班",40,"X老师");
		String u1 = classesCurd.updateClasses(c2);
		System.out.println("修改测试结果:"+u1);
		
		//查找测试
		List<Classes> classesList = classesCurd.listClasses();
		System.out.println("查询结果为");
		for(int i = 0 ; i < classesList.size() ; i++) {
			System.out.println(classesList.get(i));
		}
		
	}
	
	//增加班级,增加有返回值
	public String addClasses(Classes classes) {
		Session session = sessionFactory.openSession();
		Transaction transaction = null;
		String flag = null;
		try {
			transaction = session.beginTransaction();
			//这里返回的其实是主键id的值
			flag = (String)session.save(classes);
			//记得提交事务不然你加不上去哦
			transaction.commit();
		}catch(HibernateException he) {
			if(null != transaction) {
				transaction.rollback();
			}
			flag = null;
			he.printStackTrace();
		}finally {
			session.close();
		}
		return flag;
	}
	
	//删除班级
	public String deleteClasses(String classId) {
		Session session = sessionFactory.openSession();
		Transaction transaction = null;
		String flag = null;
		try {
			transaction = session.beginTransaction();
			Classes classes = session.get(Classes.class, classId);
			session.delete(classes);
			transaction.commit();
			flag = "success";
		}catch(HibernateException he) {
			if(null != transaction) {
				transaction.rollback();
			}
			flag = "fail";
			he.printStackTrace();
		}finally {
			session.close();
		}
		
		return flag;
	}
	
	//修改班级
	public String updateClasses(Classes classes) {
		Session session = sessionFactory.openSession();
		Transaction transaction = null;
		String flag = null;
		try {
			transaction = session.beginTransaction();
			session.update(classes);
			transaction.commit();
			flag = "success";
		}catch (HibernateException he) {
			if(null != transaction) {
				transaction.rollback();
			}
			flag = "fail";
			he.printStackTrace();
		}finally {
			session.close();
		}
		return flag;
	}

	//查询班级
	public List<Classes> listClasses(){
		Session session = sessionFactory.openSession();
		Transaction transaction = null;
		List<Classes> classesList = null;
		try {
			transaction = session.beginTransaction();
			//执行查询,hql语句中的对象名必须与实体类的类名一致,严格区分大小写,FROM 实体类名称
			List c = session.createQuery("from Classes").list();
			Iterator it = c.iterator();
			while(it.hasNext()) {
				Classes classes = (Classes)it.next();
				if(null == classesList && null != classes ) {
					classesList = new ArrayList<Classes>();
				}
				classesList.add(classes);
			}
			transaction.commit();
		}catch (HibernateException he) {
			if(null != transaction) {
				transaction.rollback();
			}
			classesList = null;
			he.printStackTrace();
		}finally {
			session.close();
		}
		return classesList;
	}
	
}

测试

自己断点测试一下就好了,正常的输出结果如下。
eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发

值得注意的地方

hibernate.cfg.xml这里的mapping如果是Teacher.hbm.xml文件,那么是这样的

<mapping resource="com/czx/demo/pojo/Teacher.hbm.xml"/>

如果你直接使用注释映射的话,那么是这样的

<mapping class="com.czx.annotations.pojo.Classes"/>

各种注解说明

@Entity 注释

  • EJB 3 标准的注释包含在 javax.persistence 包,我这里截这个项目用到的包来看eclipse学习(第三章:ssh中的Hibernate)——7.Hibernate使用注释开发。所以我们第一步需要导入这个包。第二步我们对 Employee 类使用 @Entity 注释,标志着这个类为一个实体 bean,所以它必须含有一个没有参数的构造函数并且在可保护范围是可见的。

@Table 注释

  • @table 注释允许您明确表的详细信息保证实体在数据库中持续存在。
  • @table 注释提供了四个属性,允许您覆盖的表的名称,目录及其模式,在表中可以对列制定独特的约束。现在我们使用的是表名为 CLASSES。

@Id 和 @GeneratedValue 注释

  • 每一个实体 bean 都有一个主键,你在类中可以用 @Id 来进行注释。主键可以是一个字段或者是多个字段的组合,这取决于你的表的结构。
  • 默认情况下,@Id 注释将自动确定最合适的主键生成策略,但是你可以通过使用 @GeneratedValue 注释来覆盖掉它。strategy 和 generator 这两个参数我不打算在这里讨论,所以我们只使用默认键生成策略。让 Hibernate 确定使用哪些生成器类型来使代码移植于不同的数据库之间。

@Column Annotation

  • @Column 注释用于指定某一列与某一个字段或是属性映射的细节信息。您可以使用下列注释的最常用的属性:
    • name 属性允许显式地指定列的名称。
    • length 属性为用于映射一个值,特别为一个字符串值的列的大小。
    • nullable 属性允许当生成模式时,一个列可以被标记为非空。
    • unique 属性允许列中只能含有唯一的内容

扩展阅读

更多地注解说明请查看这里https://blog.csdn.net/dragonpeng2008/article/details/52297426

项目下载

一般来说看上面的就够了,如果你还是无法理解的话,可以来这里下载
https://gitee.com/mrchen13427566118/ssh_hibernate_learn.git
这里的ssh_hibernate_annotations项目即可。
打开的话可以看这里https://blog.csdn.net/weixin_43987277/article/details/116936221

上一篇:Qt官方文档中文翻译-View Classes


下一篇:# 20182335 2019-2020-1 《数据结构与面向对象程序设计》第5周学习总结