SpringDataJpa的使用 -- 一对一、一对多、多对多 关系映射

本文主要讲述 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany 这四个关系映射注解的使用,以及其对应的级联关系

有四张表,分别是:学生表、家长表、教室表、教师表,它们的关联关系如下:

  • 学生 对 家长:一对一
  • 学生 对 教室:多对一
  • 学生 对 教师:多对多

项目依赖

必要的依赖有:mysql驱动、SpringBootWeb、SpringBootStarter、SpringDataJpa、SpringBootText、druid,其它的依赖可以按需添加。 如:lombok、

pom.xml 必要依赖

<!-- Spring Boot 都使用 2.4.5,看个人习惯 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.4.5</version>
<scope>runtime</scope>
</dependency>
<!-- Spring Data JPA 使用 2.6.1,看个人习惯 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.6.1</version>
</dependency>

<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
<scope>runtime</scope>
</dependency>
<!-- druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.24</version>
</dependency>

pom.xml 可选依赖

<!--  Spring 热部署  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>2.4.5</version>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>

项目配置

application.yaml

spring:
  # DataSource
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 账号
    password: 密码
    # serverTimezone可以设置为北京时间GMT 8、上海时间Asia/Shanghai或者香港时间Hongkong
    url: jdbc:mysql://localhost:3306/cloudtext?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT 8
  # DataBase Connection -- JPA
  jpa:
    # 显示 SQL 语句
    show-sql: true
    # 不允许在视图阶段 执行 sql
    open-in-view: false

# 建议设置一个不常用的,避免冲突
server:
  # 项目端口号
  port: 8092
  # 项目路径
  servlet:
    context-path: /jpa

sql文件(MySQL版)

cloudText.sql 仅结构

-- ----------------------------
-- Table structure for classroom
-- ----------------------------
DROP TABLE IF EXISTS `classroom`;
CREATE TABLE `classroom` (
 `class_room_id` tinyint unsigned NOT NULL AUTO_INCREMENT COMMENT '班级主键',
 `class_room_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '班级名称',
 `class_room_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '班级位置',
  `class_room_capacity` int unsigned DEFAULT NULL COMMENT '班级人数',
  `class_room_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '班级年级',
 PRIMARY KEY (`class_room_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

-- ----------------------------
-- Table structure for patriarch
-- ----------------------------
DROP TABLE IF EXISTS `patriarch`;
CREATE TABLE `patriarch` (
 `patriarch_id` tinyint unsigned NOT NULL AUTO_INCREMENT COMMENT '家长主键',
 `patriarch_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '家长姓名',
 `patriarch_age` int unsigned DEFAULT NULL COMMENT '家长年龄',
 `patriarch_sex` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '家长性别',
 `patriarch_phone` varchar(11) COLLATE utf8_bin DEFAULT NULL COMMENT '家长电话',
 `patriarch_address` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '家长住址',
 PRIMARY KEY (`patriarch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
 `student_id` tinyint unsigned NOT NULL AUTO_INCREMENT COMMENT '学生主键',
 `student_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '学生姓名',
 `student_age` int unsigned DEFAULT NULL COMMENT '学生年龄',
 `student_sex` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '学生性别',
 `patriarch_id` tinyint unsigned NOT NULL COMMENT '家长外键',
 `class_room_id` tinyint unsigned DEFAULT NULL COMMENT '班级外键',
 PRIMARY KEY (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

-- ----------------------------
-- Table structure for student_teacher
-- ----------------------------
DROP TABLE IF EXISTS `student_teacher`;
CREATE TABLE `student_teacher` (
 `student_id` tinyint unsigned NOT NULL COMMENT '学生主键',
 `teacher_id` tinyint unsigned NOT NULL COMMENT '教师主键',
 PRIMARY KEY (`student_id`,`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;


-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
 `teacher_id` tinyint unsigned NOT NULL AUTO_INCREMENT COMMENT '教师主键',
 `teacher_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '教师姓名',
 `teacher_age` int unsigned DEFAULT NULL COMMENT '教师年龄',
 `teacher_sex` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '教师性别',
 `teacher_course` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '教师教授科目',
 PRIMARY KEY (`teacher_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;

级联关系简述

  • ALL -- 级联所有操作
  • PERSIST -- 级联持久化操作
  • MERGE -- 级联合并操作
  • REMOVE -- 级联删除操作
  • REFRESH -- 级联刷新操作(调用refresh方法才会刷新)
  • DETACH -- 级联分离操作(2.0版本才有)

参考:《Spring Boot 整合——JPA 数据模型关联操作(一对一、一对多、多对多)》

参考:《cascade级联关系》

@OneToOne 一对一 关系映射

一对一关系的双方必须有且仅有一方放弃维护,在 @OneToOne 中添加mappedBy属性表示放弃维护。

学生类(Student.java):维护方 家长类(Patriarch.java):被维护方

Student.java (主键和非外键属性)

package com.ljm.exmaple.entity;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * 学生 类
 *
 * @author LJM
 */
@Entity
@Table(name = "STUDENT")
public class Student {
	
	/**
	 * 学生 id
	 */
	@Id
	@Column(name = "student_id", nullable = false)
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long studentId;
	/**
	 * 学生 姓名
	 */
	@Column(name = "student_name", nullable = false)
	private String studentName;
	/**
	 * 学生 年龄
	 */
	@Column(name = "student_age", nullable = false)
	private Short studentAge;
	/**
	 * 学生 性别
	 */
	@Column(name = "student_sex", nullable = false)
	private String studentSex;
	/** 省略 Constructor、Getter、Setter、toString 方法 **/
}

Patriarch.java (主键和非外键属性)

package com.ljm.exmaple.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * 家长 类
 *
 * @author LJM
 */
@Entity
@Table(name = "PATRIARCH")
public class Patriarch {
    /**
     * 家长 id
     */
    @Id
    @Column(name = "patriarch_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long patriarchId;
    /**
     * 家长 姓名
     */
    @Column(name = "patriarch_name", nullable = false)
    private String patriarchName;
    /**
     * 家长 年龄
     */
    @Column(name = "patriarch_age")
    private Short patriarchAge;
    /**
     * 家长 性别
     */
    @Column(name = "patriarch_sex", nullable = false)
    private String patriarchSex;
    /**
     * 家长 电话
     */
    @Column(name = "patriarch_phone", nullable = false, length = 11)
    private String patriarchPhone;
    /**
     * 家长 住址
     */
    @Column(name = "patriarch_address", nullable = false)
    private String patriarchAddress;
    /** 省略 Constructor、Getter、Setter、toString 方法 **/
}

1.无中间表,维护方添加外键,被维护方添加对应项

cascade = CascadeType.ALL 表示:级联关系。

fetch = FetchType.EAGER 表示:预加载。

name = "patriarch_id" 指定外键。

nullable = false 表示:不能为空。

unique = true 表示:不能重复。

mappedBy = "patriarch" :添加了这个属性表示放弃维护。

维护方的属性添加到 Student.java 中。

被维护方的属性添加到 Patriarch.java 中。

/**
 * 一对一
 * 家长 外键
 * 维护方   
 * 使用  CascadeType.ALL 亦可,区别不大
 */
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinColumn(name = "patriarch_id", nullable = false, unique = true)
private Patriarch patriarch;


/**
 * 一对一
 * 被维护方(对应项)
 * 使用  CascadeType.ALL 亦可,区别不大
 */
@OneToOne(mappedBy = "patriarch", cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.EAGER)
private Student student;

/** 注意,外键及对应项的 Getter、Setter 不要忘了 */

2.无中间表,维护方添加外键,被维护方不添加对应项

cascade = CascadeType.ALL 表示:级联关系。

fetch = FetchType.EAGER 表示:预加载。

name = "patriarch_id" 指定外键。

nullable = false 表示:不能为空。

unique = true 表示:不能重复。

维护方的属性添加到 Student.java 中。

/**
 * 一对一
 * 家长 外键
 * 维护方   
 * 使用  CascadeType.ALL 亦可,区别不大
 */
@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.EAGER)
@JoinColumn(name = "patriarch_id", nullable = false, unique = true)
private Patriarch patriarch;
/**
 * 一对一
 * 被维护方(对应项),不需要添加对应项
 * 使用  CascadeType.ALL 亦可,区别不大
 */
/**
 * @OneToOne(mappedBy = "patriarch", cascade = {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.EAGER)
 * private Student student;
 */

/** 注意,外键的 Getter、Setter 不要忘了 */

3.有中间表,维护方不添加外键,被维护方不添加对应项

暂缺,这不是本文重点,以后可能会添加。

不需要使用关系注解 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany,没有外键。

@OneToMany、@ManyToOne 一对多 关系映射

一对多关系中,多方必须维护外键,一方一般不维护(我在某篇文章中看到:说一方也可以维护外键,我还未验证)。

学生类(Student.java):维护方

教室类(ClassRoom.java):被维护方

Student.java (主键和非外键属性)

package com.ljm.exmaple.entity;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * 学生 类
 *
 * @author LJM
 */
@Entity
@Table(name = "STUDENT")
public class Student {
    /**
     * 学生 id
     */
    @Id
    @Column(name = "student_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long studentId;
    /**
     * 学生 姓名
     */
    @Column(name = "student_name", nullable = false)
    private String studentName;
    /**
     * 学生 年龄
     */
    @Column(name = "student_age", nullable = false)
    private Short studentAge;
    /**
     * 学生 性别
     */
    @Column(name = "student_sex", nullable = false)
    private String studentSex;
    /** 省略 Constructor、Getter、Setter、toString 方法 **/
}

ClassRoom.java (主键和非外键属性)

package com.ljm.exmaple.entity;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * 教室 类
 *
 * @author LJM
 */
@Entity
@Table(name = "CLASSROOM")
public class ClassRoom {
    /**
     * 教室 id
     */
    @Id
    @Column(name = "classRoom_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long classRoomId;
    /**
     * 教室 名称
     */
    @Column(name = "classRoom_name", nullable = false)
    private String classRoomName;
    /**
     * 教室 位置
     */
    @Column(name = "classRoom_location", nullable = false)
    private String classRoomLocation;
    /**
     * 教室 容量
     */
    @Column(name = "classRoom_capacity", nullable = false)
    private Short classRoomCapacity;
    /**
     * 教室 所在的 班级的年级(小学到高中)
     */
    @Column(name = "classRoom_grade", nullable = false)
    private String classRoomGrade;
    /** 省略 Constructor、Getter、Setter、toString 方法 **/
}

1.无中间表,多方维护并添加外键,一方被维护

cascade = CascadeType.XXX 表示:级联关系。

fetch = FetchType.EAGER 表示:预加载。

name = "classRoom_id" 指定外键。

nullable = false 表示:不能为空。

mappedBy = "classRoom" :添加了这个属性表示放弃维护,在一对多的一方用来指向多方的那个外键属性。

/**
 * 多对一
 * 多方
 * 教室外键
 * 维护方,级联关系为 none(没有,默认)
 */
@JoinColumn(name = "classRoom_id", nullable = false)
@ManyToOne(fetch = FetchType.EAGER)
private ClassRoom classRoom;


/**
 * 一对多
 * 一方
 * (被)维护方(对应项)
 * 被维护方代码
 */
@OneToMany(mappedBy = "classRoom", cascade = {CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<Student> studentList;

/** 注意,外键及对应项的 Getter、Setter 不要忘了 */

2.有中间表,多方维护,一方被维护

暂缺,这不是本文重点,以后可能会添加。

不需要使用关系注解 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany,没有外键。

3.无中间表,多方维护,一方也维护

暂缺,待验证。

@ManyToMany 多对多 关系映射

多对多关系中,必须有且仅有一方放弃维护外键,需要新建中间表,但不需要写对应的实体类。

学生类(Student.java):维护方

教师类(Teacher.java):被维护方

Student.java (主键和非外键属性)

package com.ljm.exmaple.entity;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * 学生 类
 *
 * @author LJM
 */
@Entity
@Table(name = "STUDENT")
public class Student {	
    /**
     * 学生 id
     */
    @Id
    @Column(name = "student_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long studentId;
    /**
     * 学生 姓名
     */
    @Column(name = "student_name", nullable = false)
    private String studentName;
    /**
     * 学生 年龄
     */
    @Column(name = "student_age", nullable = false)
    private Short studentAge;
    /**
     * 学生 性别
     */
    @Column(name = "student_sex", nullable = false)
    private String studentSex;
    /** 省略 Constructor、Getter、Setter、toString 方法 **/
}

Teacher.java (主键和非外键属性)

package com.ljm.exmaple.entity;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
/**
 * 教师 类
 *
 * @author LJM
 */
@Entity
@Table(name = "TEACHER")
public class Teacher {
    /**
     * 教师 id
     */
    @Id
    @Column(name = "teacher_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long teacherId;
    /**
     * 教师 姓名
     */
    @Column(name = "teacher_name", nullable = false)
    private String teacherName;
    /**
     * 教师 年龄
     */
    @Column(name = "teacher_age")
    private Integer teacherAge;
    /**
     * 教师 性别
     */
    @Column(name = "teacher_sex", nullable = false)
    private String teacherSex;
    /**
     * 教师 所教的 科目
     */
    @Column(name = "teacher_course", nullable = false)
    private String teacherCourse;
    /** 省略 Constructor、Getter、Setter、toString 方法 **/
}

fetch = FetchType.EAGER 表示:预加载。

name = "student_teacher" 指定关联关系表。

joinColumns = @JoinColumn(name = "student_id") 指定我方在关联表中对应的主键。

inverseJoinColumns = @JoinColumn(name = "teacher_id") 指定被维护方在关联表中对应的主键。

mappedBy = "teacherList" :添加了这个属性表示放弃维护,维护方用来指向另一方的那个外键属性。

/**
 * 多对多
 * 维护方
 * 教师 外键
 * 级联关系为 none(没有,默认),双方互不干扰
 */
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "student_teacher", joinColumns = @JoinColumn(name = "student_id"), inverseJoinColumns = @JoinColumn(name = "teacher_id"))
private List<Teacher> teacherList;


/**
 * 多对多
 * 被维护方
 * 学生 外键(对应项)
 * 级联关系为 none(没有,默认),双方互不干扰
 */
@ManyToMany(mappedBy = "teacherList", fetch = FetchType.EAGER)
private List<Student> studentList;

/** 注意,外键及对应项的 Getter、Setter 不要忘了 */

本文参考

Spring Data JPA之一对一,一对多,多对多关系映射

到此这篇关于SpringDataJpa的使用之一对一、一对多、多对多 关系映射的文章就介绍到这了,更多相关SpringDataJpa使用内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题的更多相关文章

  1. 如何在PHP环境中使用ProtoBuf数据格式

    这篇文章主要介绍了如何在PHP环境中使用ProtoBuf数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  2. 使用sockets:从新闻组中获取文章(三)

    >我们从服务器的这个新闻组中读取了最后的十篇文章,。也可以通过使用HEAD命令读取文章的头信息,或者使用BODY命令读取文章内容。>关于fclose()的更多信息,请参考http://www.php.net/manual/function.fclose.php结论在上文中,我们看到了怎样打开、使用然后关闭一个socket:连接到一个NNTP服务器,取回一些文章。使用POST命令发表文章也复杂不到哪儿去。下一步就是编写一个基于WEB的新闻组客户端了。这样,你有了一个基于web的搜索新闻组的程序了。

  3. JavaScript中Webpack的使用教程

    Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,这篇文章主要介绍了JavaScript中Webpack的使用,需要的朋友可以参考下

  4. vue3中$attrs的变化与inheritAttrs的使用详解

    $attrs现在包括class和style属性。 也就是说在vue3中$listeners不存在了,vue2中$listeners是单独存在的,在vue3 $attrs包括class和style属性, vue2中 $attrs 不包含class和style属性,这篇文章主要介绍了vue3中$attrs的变化与inheritAttrs的使用 ,需要的朋友可以参考下

  5. PHP中GET变量的使用

    自PHP4.1.0以后将HTTP_GET_VARS使用GET变量来保存,GET的变量主要来自以下的方法对服务器以获取资料信息为请求方法的例如,URL,使用FORM的METHOD为GET方式。这样所有的请求变量将通过URL传递给服务器,服务器根据配置调用相关的解释器来处理这些GET出来的变量。arg_separator.input=";,"————二、自己编写解释语法list=$_GET;//将GET变量分解出来$tmp=explode;//将数据分出这个用法的优点在于,别人无法知道您传递的值是被谁使用,您

  6. Python数据分析 Numpy 的使用方法

    这篇文章主要介绍了Python数据分析 Numpy 的使用方法,Numpy 是一个Python扩展库,专门做科学计算,也是大部分Python科学计算库的基础,关于其的使用方法,需要的小伙伴可以参考下面文章内容

  7. 关于@RequestLine的使用及配置

    这篇文章主要介绍了关于@RequestLine的使用及配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  8. Flask-Sqlalchemy的基本使用详解

    本文主要介绍了Flask-Sqlalchemy的基本使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. IOS之UIWebView的使用(基本知识)

    在Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,那么下面就对UIWebView的一些基本知识详解一下

  10. 详解Android中AIDL的使用

    AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互,接下来通过本文给大家分享Android AIDL使用,需要的朋友参考下吧

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部