Hibernate框架详解(三)

2023-11-10

表与表之间的关系

(1)一对一

例子:在中国,一个男人只能有一个妻子,一个女人只能有一个丈夫。

 

(2)一对多

例子:学生和班级的关系,一个班级可以有多个学生,而一个学生只能属于一个班级。

一对多建表:通过外键建立关系,在多的那一方创建字段作为外键,指向一的那一方的主键。

 

(3)多对多

例子:学生和课程的关系,一个学生可以选择多个课程,一个课程可以有多个学生。

多对多建表:创建第三章表维护关系,至少有两个字段作为外键,指向两个表的主键。

 

Hibernate的一对多操作(重点)

(1)一对多的映射配置

以上述班级和学生的关系为例:班级是一,学生是多。

第一步:创建两个实体类,学生类和班级类

public class Student {
	private Integer sid;
	private String sname;
	private String address;
	private String phone;
	private String sex;
	private Classes classes;
	
	
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Classes getClasses() {
		return classes;
	}
	public void setClasses(Classes classes) {
		this.classes = classes;
	}
}
public class Classes {
	private Integer cid;
	private String cname;
	private String location;
	private Set<Student> cStudents=new HashSet<Student>();
	
	
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getLocation() {
		return location;
	}
	public void setLocation(String location) {
		this.location = location;
	}
	public Set<Student> getcStudents() {
		return cStudents;
	}
	public void setcStudents(Set<Student> cStudents) {
		this.cStudents = cStudents;
	}
}

第二步:让两个实体类之间互相表示

在班级类里面表示多个学生,即一个班级里有多个学生:

注意:在hibernate中要求使用集合表示多的数据,使用set集合

在学生类里面表示所属班级,即一个学生只能属于一个班级:

第三步:配置映射关系

  • 一般一个实体类对应一个映射文件
  • 首先完成最基本的配置,然后配置一对多的关系

在班级映射文件中,配置所有学生:(hibernate机制:双向维护外键,即一对多双方都需要配置外键)

使用<set>标签标示所有学生,其中<set>标签里面的name属性标示班级类中学生的set集合名称。

使用<key>标签表示外键(一对多建表,有外键),其中column属性标示外键名称

<one-to-many>标签表示一对多的关系,其中class属性标示学生类全路径

<hibernate-mapping>
	<class name="cn.itcast.entity.Classes" table="classes">
		<id name="cid" column="cid">
			<generator class="native"></generator>
		</id>
		<property name="cname" column="cname"></property>
		<property name="location" column="location"></property>
		
		<set name="cStudents">
			<key column="csid"></key>
			<one-to-many class="cn.itcast.entity.Student"/>
		</set>
	</class>
</hibernate-mapping>

在学生映射文件中,配置所属班级:(hibernate机制:双向维护外键,即一对多双方都需要配置外键)

使用<many-to-one>标签表示多对一的关系,其中name属性表示班级类对象名称,class属性表示班级类全路径,column属性表示外键名称,与上述<key>标签中column属性一致。

<hibernate-mapping>
	<class name="cn.itcast.entity.Student" table="student">
		<id name="sid" column="sid">
			<generator class="native"></generator>
		</id>
		<property name="sname" column="sname"></property>
		<property name="address" column="address"></property>
		<property name="phone" column="phone"></property>
		<property name="sex" column="sex"></property>
		<many-to-one name="classes" class="cn.itcast.entity.Classes" column="csid"></many-to-one>
	</class>
</hibernate-mapping>

第四步: 创建核心配置文件,把映射文件引入到核心配置文件中

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///test1016</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
	
	
		<property name="hibernate.show_sql">true</property>
	    <property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
	
		<mapping resource="cn/itcast/entity/classes.hbm.xml"/>
		<mapping resource="cn/itcast/entity/student.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

第五步:编写测试代码

public class Operation {
	public void addStudent() {
		Configuration cfg=new Configuration();
		cfg.configure();
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction tx=session.beginTransaction();
		Student student=new Student();
		student.setSname("张三");
		student.setSex("男");
		student.setPhone("56154");
		student.setAddress("北京");
		student.setClasses(null);
		session.save(student);
		tx.commit();
		session.close();
		sessionFactory.close();
	}
	
	
	
	public void addClasses(){
		Configuration cfg=new Configuration();
		cfg.configure();
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction tx=session.beginTransaction();
		Classes classes=new Classes();
		classes.setCname("一班");
		classes.setLocation("左家垅");
		classes.setcStudents(null);
		session.save(classes);
		tx.commit();
		session.close();
		sessionFactory.close();
	}
}

结果:

 

(2)一对多的级联操作

级联操作:

级联操作是指当主控方执行保存,更新或者删除操作时,其关联对象(被控方)也执行相同的操作。

  • 级联保存:添加一个班级,为这个班级添加多个学生
  • 级联删除:删除一个班级,这个班级里面的所有学生也删除

一对多级联保存

需求:添加班级,为这个班级添加一个学生

复杂写法:(底层写法)

public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction transaction=session.beginTransaction();
		
		
		//创建班级对象
		Classes classes=new Classes();
		classes.setCname("火箭班");
		classes.setLocation("china");
		
		
		//创建学生对象
		Student student=new Student();
		student.setSname("张三");
		student.setSex("男");
		student.setPhone("1123");
		student.setAddress("左家垅");
		
		
		//建立班级和学生对象的关系,即把学生对象放到班级对象中,把班级对象放到学生对象汇总
		classes.getcStudents().add(student);
		student.setClasses(classes);
		
		
		//保存到数据库
		session.save(classes);
		session.save(student);
		

		transaction.commit();
		session.close();
		sessionFactory.close();	
	}

简化写法:

需求:上述复杂写法,需要维护双向关系,即班级对象维护学生对象,学生对象维护班级对象。当一个班级中有很多学生对象时,需要挨个进行维护。我们在班级映射文件中,使用cascade属性设置控制方对关联对象采用级联操作,只需关注主控方即可。

第一步:在班级映射文件中的<set>标签进行配置

第二步:创建班级和学生对象,只需要把学生对象放入到班级对象中,最后保存班级对象即可。

public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction transaction=session.beginTransaction();
		
		
		//创建班级对象
		Classes classes=new Classes();
		classes.setCname("就业班");
		classes.setLocation("香港");
		
		
		//创建学生对象
		Student student=new Student();
		student.setSname("王富贵");
		student.setSex("男");
		student.setPhone("99999");
		student.setAddress("瓜瓢山");
		
		
		//将学生对象添加到班级对象中
		classes.getcStudents().add(student);
		
		
		//只需保存班级对象
		session.save(classes);
		

		transaction.commit();
		session.close();
		sessionFactory.close();		
	}

总结:一对多的关系中,一是主控方,所以在主控方的映射文件中配置被控方的级联操作。其次将被控方对象加入到主控方对象中,最后也不需提交主控方对象即可。(只需关注主控方即可,主控方配置,主控方维护,主控方保存)

 

一对多级联删除

需求:删除某个班级,把班级中的所有学生删除

具体实现:

  • 第一步:在班级映射文件<set>标签,使用cascade属性值delete进行配置
  • 第二步:根据id查询对象那个,调用session中的delete方法删除班级对象

代码:

<hibernate-mapping>
	<class name="cn.itcast.entity.Classes" table="classes">
		<id name="cid" column="cid">
			<generator class="native"></generator>
		</id>
		<property name="cname" column="cname"></property>
		<property name="location" column="location"></property>
		
		<set name="cStudents" cascade="save-update,delete">
			<key column="csid"></key>
			<one-to-many class="cn.itcast.entity.Student"/>
		</set>
	</class>
</hibernate-mapping>
public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		Transaction transaction=session.beginTransaction();
		
		
		Classes classes=session.get(Classes.class,6);
		session.delete(classes);
		

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

结果:

执行过程:

(1)根据id查询班级

(2)根据外键id值查询学生

(3)把学生外键设置为null

(4)删除班级和学生

总结:一对多的关系中,只需关注主控方即可。级联保存的时候,在主控方进行配置级联操作save-update,同时在主控方添加被控方对象,最后提交主控方对象即可。级联删除的时候,在主控方进行配置级联操作delete,同时查询主控方对象,并删除即可实现级联删除。

 

双向关联产生多余的SQL语句(使用inverse属性,让“一”方放弃外键维护权)

需求:让李翠花所属班级调整为火箭班

代码:

public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction transaction=session.beginTransaction();
		
		Classes classes=session.get(Classes.class, 3);
		Student student=session.get(Student.class, 4);
		
		student.setClasses(classes);
		classes.getcStudents().add(student);
		

		transaction.commit();
		session.close();
		sessionFactory.close();
	}

结果:

问题:Hibernate双向维护外键,在班级和学生里面都需要维护外键,修改班级的时候,修改一次外键;修改学生的时候,修改一次外键,造成效率问题。

上述修改操作,执行了两次update语句------------产生原因是因为双向维护了关系,更新班级的时候会修改一次外键,更新学生的时候也会修改一次外键,这样就产生了多余的SQL。

解决:其中一方放弃外键维护权即可。通常在一对多的关系中,让“一”的一方放弃外键维护权。举个例子:一个班级对应多个学生,一个学生只属于一个班级,这是典型的一对多的关系。要让一个班级记住所有学生的名字是很难的,但是如果让每个学生记住班级的名字就很简单。所以在一对多的关系中,“一”的一方放弃外键的维护权。

实现:使用inverse属性进行配置,inverse属性默认值是false,即不放弃外键维护权;配置为true,则代表放弃外键维护权。

代码:

<hibernate-mapping>
	<class name="cn.itcast.entity.Classes" table="classes">
		<id name="cid" column="cid">
			<generator class="native"></generator>
		</id>
		<property name="cname" column="cname"></property>
		<property name="location" column="location"></property>
		
		<set name="cStudents" cascade="save-update,delete" inverse="true">
			<key column="csid"></key>
			<one-to-many class="cn.itcast.entity.Student"/>
		</set>
	</class>
</hibernate-mapping>
public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction transaction=session.beginTransaction();
		
		//根据id查询调整后的班级对象
		Classes classes=session.get(Classes.class, 4);
		//根据id查询要调整的学生对象
		Student student=session.get(Student.class, 3);
		
		//维护双向关系---将学生添加到班级中,将班级添加到学生中
		student.setClasses(classes);
		classes.getcStudents().add(student);
		

		transaction.commit();
		session.close();
		sessionFactory.close();
	
	}

结果:(只进行了一次update)

 

Hibernate的多对多操作(重点)

(1)多对多的映射配置

以上述学生和课程的关系为例:学生是多,课程也是多。

第一步:创建两个实体类,学生类和课程类

public class Course {
	private Integer cid;
	private String cname;
	private String description;
	private Set<Student> cStudents=new HashSet<Student>();
	
	
	public Set<Student> getcStudents() {
		return cStudents;
	}
	public void setcStudents(Set<Student> cStudents) {
		this.cStudents = cStudents;
	}
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
}
public class Student {
	private Integer sid;
	private String sname;
	private String address;
	private String phone;
	private String sex;
	private Set<Course> sCourses=new HashSet<Course>();

	
	
	public Set<Course> getsCourses() {
		return sCourses;
	}
	public void setsCourses(Set<Course> sCourses) {
		this.sCourses = sCourses;
	}
	
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

第二步:让两个实体类互相表示

一个学生里面表示所有课程,使用set集合

一个课程里面表示所有学生,使用set集合

第三步:配置映射关系

  • 一般一个实体类对应一个映射文件
  • 首先完成最基本的配置,然后配置多对多的关系

在学生映射文件中,配置所有课程:

<hibernate-mapping>
	<class name="cn.itcast.entity.Student" table="student">
		<id name="sid" column="sid">
			<generator class="native"></generator>
		</id>	
		<property name="sname" column="sname"></property>
		<property name="address" column="address"></property>
		<property name="phone" column="phone"></property>
		<property name="sex" column="sex"></property>
		
		<!-- 在学生里面表示所有课程,使用set标签 -->
		<!-- name属性:课程set集合名称 -->
		<!-- table属性:第三张表名称(维护两张表的关系) -->		
		<set name="sCourses" table="student_course">
		
			<!-- key标签配置当前映射文件在第三张表中外键的名称 -->
			<key column="studentid"></key>
			
			<!-- many-to-many标签配置多对多的关系 -->
			<!-- class属性:课程类全路径 -->
			<!-- column属性:课程在第三张表外键名称,与课程类配置文件中的key标签属性一致 -->
			<many-to-many class="cn.itcast.entity.Course" column="courseid"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

在课程映射文件中,配置所有学生:

<hibernate-mapping>
	<class name="cn.itcast.entity.Course" table="course">
		<id name="cid" column="cid">
			<generator class="native"></generator>
		</id>
		<property name="cname" column="cname"></property>
		<property name="description" column="description"></property>

		<!-- 在课程里面表示所有学生,使用set标签 -->
		<!-- name属性:学生set集合名称 -->
		<!-- table属性:第三张表名称(维护两张表的关系) -->		
		<set name="cStudents" table="student_course">
		
			<!-- key标签配置当前映射文件在第三张表中外键的名称 -->
			<key column="courseid"></key>
			
			<!-- many-to-many标签配置多对多的关系 -->
			<!-- class属性:学生类全路径 -->
			<!-- column属性:学生在第三张表外键名称,与学生类配置文件中的key标签属性一致 -->
			<many-to-many class="cn.itcast.entity.Student" column="studentid"></many-to-many>
		</set>	
	</class>
</hibernate-mapping>

第四步: 创建核心配置文件,把映射文件引入到核心配置文件中

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///test1017</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
	
	
		<property name="hibernate.show_sql">true</property>
	    <property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		
		
		<mapping resource="cn/itcast/entity/course.hbm.xml"/>
		<mapping resource="cn/itcast/entity/student.hbm.xml"/>

	</session-factory>
</hibernate-configuration>

第五步:编写测试代码

public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction tx=session.beginTransaction();
		
		Student student1=new Student();
		student1.setSname("王富贵");
		student1.setSex("男");
		student1.setPhone("185648411");
		student1.setAddress("左家垅");
		
		Student student2=new Student();
		student2.setSname("王翠花");
		student2.setSex("女");
		student2.setPhone("8435184");
		student2.setAddress("瓜瓢山");
		
		
		
		Course course1=new Course();
		course1.setCname("高数");
		course1.setDescription("这门课非常难");
		
		Course course2=new Course();
		course2.setCname("物联网");
		course2.setDescription("考试非常简单");
		
		Course course3=new Course();
		course3.setCname("计算机网络");
		course3.setDescription("非常有意思");
		
		student1.getsCourses().add(course1);
		student1.getsCourses().add(course3);
		student2.getsCourses().add(course3);
		student1.getsCourses().add(course2);
		
		session.save(student1);
		session.save(student2);
		
		
		tx.commit();
		session.close();
		sessionFactory.close();
		
	}

结果:

 

(2)多对多的级联操作

级联操作:

级联操作是指当主控方执行保存,更新或者删除操作时,其关联对象(被控方)也执行相同的操作。

  • 级联保存:根据学生保存课程,或者根据课程保存学生
  • 级联删除:

多对多级联保存

需求:根据学生保存课程

简化写法:

第一步:在学生映射文件中的<set>标签进行配置,cascade属性值设置为save-update

第二步:创建学生和课程对象,把课程放到学生里面,最终保存学生就可以了

public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction tx=session.beginTransaction();
		
		Student student1=new Student();
		student1.setSname("王富贵");
		student1.setSex("男");
		student1.setPhone("185648411");
		student1.setAddress("左家垅");
		
		Student student2=new Student();
		student2.setSname("王翠花");
		student2.setSex("女");
		student2.setPhone("8435184");
		student2.setAddress("瓜瓢山");
		
		
		
		Course course1=new Course();
		course1.setCname("高数");
		course1.setDescription("这门课非常难");
		
		Course course2=new Course();
		course2.setCname("物联网");
		course2.setDescription("考试非常简单");
		
		Course course3=new Course();
		course3.setCname("计算机网络");
		course3.setDescription("非常有意思");
		
		student1.getsCourses().add(course1);
		student1.getsCourses().add(course3);
		student2.getsCourses().add(course3);
		student1.getsCourses().add(course2);
		
		session.save(student1);
		session.save(student2);
		
		
		tx.commit();
		session.close();
		sessionFactory.close();
		
	}

 

 

需求:根据课程保存学生

简化写法:

第一步:在课程映射文件中的<set>标签进行配置,cascade属性值设置为save-update

第二步:创建学生和课程对象,把学生放到课程里面,最终保存课程就可以了

	public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction tx=session.beginTransaction();
		
		Student student1=new Student();
		student1.setSname("王富贵");
		student1.setSex("男");
		student1.setPhone("185648411");
		student1.setAddress("左家垅");
		
		Student student2=new Student();
		student2.setSname("王翠花");
		student2.setSex("女");
		student2.setPhone("8435184");
		student2.setAddress("瓜瓢山");
		
		
		
		Course course1=new Course();
		course1.setCname("高数");
		course1.setDescription("这门课非常难");
		
		Course course2=new Course();
		course2.setCname("物联网");
		course2.setDescription("考试非常简单");
		
		Course course3=new Course();
		course3.setCname("计算机网络");
		course3.setDescription("非常有意思");
		
		course1.getcStudents().add(student1);
		course1.getcStudents().add(student2);
		course2.getcStudents().add(student1);
		course3.getcStudents().add(student2);
		
		session.save(course1);
		session.save(course2);
		session.save(course3);
		
		
		tx.commit();
		session.close();
		sessionFactory.close();
		
	}

 

多对多级联删除(一般不用,了解即可)

需求:删除某个课程,把课程中的所有学生也删除

第一步:在<set>标签中进行配置,其中cascade属性值设为delete

第二步:删除课程

 

(3)维护第三张表关系

多对多的关系主要是靠第三张表来维护的

需求:让某个学生选择某个课程

第一步:根据id查询学生和课程

第二步:把课程放到学生里面

	public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction tx=session.beginTransaction();
		
		Student student=session.get(Student.class, 1);
		Course course=session.get(Course.class, 6);
		student.getsCourses().add(course);
		
		tx.commit();
		session.close();
		sessionFactory.close();	
	}

需求:让某个学生放弃某个课程

第一步:根据id查询学生和课程

第二步:在学生中将课程去掉

	public void testDemo(){
		Configuration cfg=new Configuration();
		cfg.configure();
		
		SessionFactory sessionFactory=cfg.buildSessionFactory();
		Session session=sessionFactory.openSession();
		
		Transaction tx=session.beginTransaction();
		
//		Student student=session.get(Student.class, 1);
//		Course course=session.get(Course.class, 6);
//		student.getsCourses().add(course);
		
		Student student2=session.get(Student.class, 1);
		Course course2=session.get(Course.class, 2);
		student2.getsCourses().remove(course2);
		
		tx.commit();
		session.close();
		sessionFactory.close();	
	}

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate框架详解(三) 的相关文章

  • 程序员必读书目推荐

    1 Effective Java Joschua 稍许过时 但没有替代java方面的书 2 Effectvie C Scott Meyer 3 More Effective C Scott Meyer的书是非常非常好书 每次读都感到汗颜 自
  • MyBatis3框架详解(二)

    一 MyBatis全局配置文件 MyBatis的全局配置文件包含设置 settings 和属性 properties 信息 文档结构如下 二 全局配置文件中 引入dtd约束 目的 为了在全局配置文件 mybatis config xml 中
  • 一篇文章入门MyBatis3

    要使用mybatis 需要在类路径下建立一个配置文件 名称为mybatis config xml mybatis中的总配置文件 mybatis config xml
  • Web框架安全

    模板引擎与XSS防御 XSS攻击是在用户的浏览器上执行的 其形成过程则是在服务器端页面渲染时 注入了恶意的HTML代码导致的 从MVC架构来说 是发生在View层 因此使用 输出编码 的防御方法更加合理 这意味着需要针对不同上下文的XSS攻
  • MyBatis3框架详解(四)

    一 select元素 select标签元素是用来定义查询操作的 id属性 唯一标识符 用来引用这条语句 需要和接口的方法名一致 parameterType属性 参数类型 可以不传 mybatis会根据TypeHandler自动推断 resu
  • 一份超详细的Spring4常用知识清单!

    文章目录 1 Spring 是什么 2 Spring模块结构 3 Spring核心 3 1 IOC 和 DI 3 2 Spring 容器 4 Spring中Bean 4 1 IOC 容器中 Bean 的生命周期方法 4 2 在 Spring
  • 成为技术传播者(二):Why and Why NOT

    前文 成为技术传播者 一 写在前面 Contributing to Eclipse的开篇第一句话说得很有味道 Humans need to feel nurtured and cared for Humans also need to nu
  • 用Vue.js开发一个电影App的前端界面

    我们要构建一个什么样的App 我们大多数人使用在线流媒体服务 如Netflix 观看我们最喜欢的电影或者节目 这篇文章将重点介绍如何通过使用vue js 2 建立一个类似风格的电影流媒体WEB交互界面 见上图 最终的产品可以去这里找 htt
  • 一篇文章入门Hibernate框架

    什么是Hibernate 一个框架 一个Java领域的持久化框架 一个ORM框架 什么叫持久化操作 和数据库相关的各种操作 对象的增删改查 什么是ORM 对象 关系映射 ORM思想 将关系数据块中表中的记录映射成为对象 以对象的形式展现 程
  • 一份超详细的SpringMVC4常用知识清单!

    文章目录 1 SpringMVC 概述 2 使用 RequestMapping 映射请求 2 1 映射请求参数 请求方法或请求头 2 2 Maping支持通配符 3 PathVariable 映射 URL 绑定的占位符 4 REST 5 请
  • Spring框架详解(三)

    一 代理模式 代理模式 为一个对象提供一个替身 以控制对这个对象的访问 即通过代理对象访问目标对象 这样做的好处就是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 被代理对象可以是远程对象 创建开销大的对象或者是需要
  • Spring MVC框架详解(一)

    一 三层架构与MVC模型 我们的开发架构一般都是基于两种形式 一种是C S架构 也就是客户端 服务器架构 另一种是B S架构 也就是浏览器 服务器架构 在JavaEE开发中 几乎都是基于B S架构的开发 在B S架构中 系统标准的三层架构包
  • Hibernate框架详解(三)

    表与表之间的关系 1 一对一 例子 在中国 一个男人只能有一个妻子 一个女人只能有一个丈夫 2 一对多 例子 学生和班级的关系 一个班级可以有多个学生 而一个学生只能属于一个班级 一对多建表 通过外键建立关系 在多的那一方创建字段作为外键
  • Jsf与Spring的整合原理

    Jsf做为Web框架 Spring做为业务层框架 两者可以结合起来用 只要在faces config xml中做一个很简单的配置
  • Spring框架详解(二)

    一 IOC基本原理 1 什么是IOC容器 容器 容器是一种为特定组件的运行提供必要支持的一个软件环境 例如Tomcat就是一个Servlet容器 它可以为Servlet的运行提供运行环境 类似Docker这样的软件也是一个容器 它提供了必要
  • python Web开发 flask轻量级Web框架

    O flask介绍 Flask是一个使用 Python 编写的轻量级 Web 应用框架 其 WSGI 工具箱采用 Werkzeug 模板引擎则使用 Jinja2 Flask使用 BSD 授权 Flask也被称为 microframework
  • ASP.NET Core3.1 跨平台智能云管理系统源码

    ASP NET Core3 1 跨平台智能云管理系统源码 一个相当不错的系统框架 ASP NET Core3 1 跨平台智能云管理系统 什么是 ASP NET Core ASP NET Core 是一个由微软创建的 用于构建 web 应用
  • Struts2框架详解(二)

    Struts2结果页面配置 全局结果页面 场景 多个action 有相同的方法返回值 且都到同一个结果页面 需求 创建两个action 执行默认的方法execute方法 让两个action的方法都返回success 返回success之后
  • Hibernate框架详解(四)

    Hibernate查询方式 1 对象导航查询 根据id查询某个班级 再查询这个班级里面的所有学生 2 OID查询 根据id查询某一条记录 返回对象 3 HQL查询 利用Query对象 写HQL语句实现查询 4 QBC查询 利用Criteri
  • Nginx的X-Accel-Redirect实现大文件下载

    一 文件下载的几种方式 1 直接给出下载地址 使用静态文件服务器nginx下载 任何人都可以下载 无法控制用户的权限 2 后端流式读取文件内容 设置header后疯狂输出 django文档中提到 可以向HttpResponse传递一个迭代器

随机推荐

  • LSH(Locality Sensitive Hashing)原理与实现

    LSH Locality Sensitive Hashing 翻译成中文 叫做 局部敏感哈希 它是一种针对海量高维数据的快速最近邻查找算法 在信息检索 数据挖掘以及推荐系统等应用中 我们经常会遇到的一个问题就是面临着海量的高维数据 查找最近
  • Linux下防火墙开启外网端口

    1 查看所有开启的端口 firewall cmd list ports 2 开启5000端口 firewall cmd zone public add port 5000 tcp permanent 3 重启防火墙 使其生效 firewal
  • EXCEL-VBA:递归遍历文件夹及子文件夹中的文件

    Const SearchPath D PDF Dim DicList FileList I FileName FilePath Set DicList CreateObject Scripting Dictionary Set FileLi
  • matlab对正弦信号作FFT得到频谱图

    转自 https www cnblogs com alexanderkun p 4723577 html https blog csdn net qq 36024066 article details 89491650 一 FFT物理意义如
  • 大小限制_GEE学习笔记 九十五:请求大小限制

    这里说一个导出数据可能会遇到的问题 当然这个问题不仅仅可能会出现在数据导出 在其他涉及到网络通信的操作都有可能会出现这个问题 1 分析错误 首先先看一下报错的内容 如下图 分析一下报错的内容 消息请求 payload 的大小超过了大小限制
  • UE4 GamePlay框架个人整理——游戏信息

    摘自 UE4官方文档 接在UE4框架类关系之后 游戏信息 两个主要类负责处理进行中游戏的相关信息 Game Mode 和 Game State GameMode 任务是定义和实现游戏规则 用于表示一个游戏的玩法逻辑 如 类似英雄联盟中推掉最
  • 2022苹果开发者账号注册流程详解(公司账号)

    公司开发者账号注册流程详解 一 注册公司账号前需要提供的信息 1 邮箱 邮箱密码 2 微信或支付宝或储蓄卡或者信用卡 原来是必须有需要带国际支付能力银行卡 visa银行卡 实际上是转账到国外的苹果银行卡账号 3 一个手机号 4 D U N
  • 如何有效实现应用系统的增删改查功能

    如何有效实现应用系统的增删改查功能 1 前言 针对数据的增加 修改 删除和查询是应用软件系统中最为常用的功能 作为软件开发人员 如何高效的实现上述功能 并且能够保证系统数据的正确性 规范性和有效性是非常重要的 本文结合自己在项目实践中完成的
  • 【1day】复现深信服数据中心管理系统 XXE漏洞——可读取文件

    目录 一 漏洞描述 二 影响版本 三 资产测绘 四 漏洞复现 一 漏洞描述 深信服的数据中心管理系统DC是一种外置的AC 异地扩展备份管理 数据中心 它提供了强大的功能和灵活性 旨在满足日志数据处理的需求 该系统具备多种高级功能 包括多条件
  • 5. 垃圾收集器G1&ZGC详解

    JVM性能调优 1 G1收集器 XX UseG1GC 1 1 G1垃圾收集分类 1 1 1 YoungGC 1 1 2 MixedGC 1 1 3 Full GC 1 2 G1收集器参数设置 1 3 G1垃圾收集器优化建议 1 4 什么场景
  • C++中string类对象占多少个字节?

    不管string的内容多少 或者不赋值 大小都是28个字节 但是G 编译是4个字节 string的实现在各库中可能有所不同 但是在同一库中相同一点是 无论你的string 里放多长的字符串 它的sizeof 都是固定的 字符串所占的空间是从
  • 【Yarn】YARN 核心设计 yarn 核心 service 是如何运行的

    文章目录 1 概述 2 案例 2 1 service 2 2 状态类 2 3 抽象类 2 4 组合service 2 5 组合service 2 6 ResourceManager 1 概述 上一篇文章 Yarn Yarn NodeMana
  • CompletableFuture取多个任务结果

    public class DemoTest Test public void test long start System currentTimeMillis CompletableFuture
  • 网络分层模型及协议简介

    1 OSI七层模型和TCP IP四层模型 从应用程序的角度出发 主要掌握TCP IP模型 OSI七层模型 物数网传会表应 1 物理层 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流
  • 合并两个有序链表,合并后依然有序 --- 三种方法

    1 合并链表p1 p2到p1上 void CombineList ListNode p1 ListNode p2 合并链表p1 p2 到p1 if p1 NULL p1 p2 return if p2 NULL return ListNod
  • 随机抽人名小程序_年会必备,5分钟学会制作抽奖小程序

    每次年会 都希望人品爆发 中个大奖 可惜这么多年过去了 依然没中过大奖 你是不是跟卢子一样 抽奖的形式有多种 在Excel中也可以制作一个抽奖小程序 现在从A列成员中抽取3名中奖人员 效果如动图 抽奖都是随机生成的 要借助随机数 随机数有两
  • 数据库和AI的一次火花

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由宗文 发表于云 社区专栏 导语 通过历史数据 基于时间序列来预测未来 我们生活中很多数据是有时间维度的 比如说天气或者股票价格 对于这种带有时序的数据 有一种基于时间序列的预测
  • linux 下如何配置JDK呢?

    系统Ubuntu 下载jdk 9 0 1 1 切换到root 创建文件夹 xxxx ubuntu sudo su root ubuntu mkdir usr java 2 找到下载的jdk 9 0 1 linux x64 bin tar g
  • 【Shell-Kill】Kill掉Linux进程以及Kill掉Yarn任务

    Shell Kill Kill掉Linux进程以及Kill掉Yarn任务 1 使用 awk 方式 kill Linux 进程 2 使用 Shell 脚本批量处理 Yarn 任务 2 1 使用 Shell 脚本批量查看 Yarn 任务数量 2
  • Hibernate框架详解(三)

    表与表之间的关系 1 一对一 例子 在中国 一个男人只能有一个妻子 一个女人只能有一个丈夫 2 一对多 例子 学生和班级的关系 一个班级可以有多个学生 而一个学生只能属于一个班级 一对多建表 通过外键建立关系 在多的那一方创建字段作为外键