===【根据表结构写实体】。===表结构设计暂不考虑,一般都是项目经理设计好,给咱用。
步骤:先写出最基础的JavaBean。不考虑注解。
1.客户表、字典表。
===字典表
加注解前:
/**
* 数据字典
* @author syl
*创建数据字典表
CREATE TABLE `base_dict` (
`dict_id` varchar(32) NOT NULL COMMENT '数据字典id(主键)',
`dict_name` varchar(64) NOT NULL COMMENT '数据字典项目名称',//===三个有用字段
`dict_type_code` varchar(10) NOT NULL COMMENT '数据字典类别代码',
`dict_type_name` varchar(64) NOT NULL COMMENT '数据字典类别名称',
`dict_sort` int(10) DEFAULT NULL COMMENT '排序字段',//===暂时没用
`dict_enable` char(1) NOT NULL COMMENT '1:使用 0:停用',//===暂时没用
`dict_memo` varchar(64) DEFAULT NULL COMMENT '备注',//===暂时没用
PRIMARY KEY (`dict_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
*/
public class BaseDict {
private String dictId;
private String dictName;
private String dictTypeCode;
//===暂时没用字段
private Integer dictSort;
private Character dictEnable;
private String dictMemo;
//==###=问题:
//客户和联系人是一对多,加 List<Customer>属性
//===字典和客户表 也是一对多啊。为什么 这里不需要添加 List<Customer>属性。?
//==###=答案:
//===【没有通过字典 操作 客户的需求】然而有通过客户操作联系人(级联删除)的需求。---如果有,比如级联删除,就必须加上。
//==############=收获:【添加对象间依赖。必须要有操作这个对象属性的(crud)的需求】。
//==######===【没有需求:操作字典表,并且根据字典表 操作客户。】所以这里不需要添加属性依赖。
//==######===【有需求:操作客户表,并且根据客户表操作联系人(级联删除)。】所以这里不需要添加属性依赖。
//private Set<Customer> customers;
//==############=收获:【需要选择的数据,都要单独建一张表,从表里查出来。】
//===只是这里每张表只有一个有效字段,需要三张表,数据库设计 表太多。为了优化表结构,把三张表集成到一张表里(数据字典表))【不是为了增强了数据 复用性】
加注解后:
@Entity
@Table(name="base_dict")
public class BaseDict {
@Override
public String toString() {//===页面显示处理方式2.===方式1:多级属性调用(推荐)。
return dictName;
}
@Id
@Column(name="dict_id")//===String :只能手动设置。
//===这里只涉及查询(字典),没有保存操作。所以这个主键是String需要手动设置才能保存 的问题还没出现。
private String dictId;
@Column(name="dict_name")
private String dictName;
@Column(name="dict_type_code")
private String dictTypeCode;
//===暂时没哟字段
@Column(name="dict_sort")
private Integer dictSort;
@Column(name="dict_enable")
private Character dictEnable;
@Column(name="dict_memo")
private String dictMemo;
//@OneToMany
//private Set<Customer> customers;
===客户表:
加注解前:
/**
* CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;
* @author syl
*
*/
public class Customer {
private Long custId;
private String custName;
/*
private String custSource;
private String custIndustry;
private String custLevel; */
//===提取到 字典表。===【下拉框选择内容(非自定义数据)都来自表】
private BaseDict custSource;
private BaseDict custIndustry;
private BaseDict custLevel;//===多的一方。
private String custAddress;
private String custPhone;
加注解后:
@Entity
@Table(name="cst_customer")
public class Customer {
@Column(name="cust_id")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long custId;
@Column(name="cust_name")
private String custName;
/*
@Column(name="cust_source")
private String custSource;
@Column(name="cust_industry")
private String custIndustry;
@Column(name="cust_level")
private String custLevel; */
//===提取到 字典表。
@ManyToOne
@JoinColumn(name="cust_source")
private BaseDict custSource;
@ManyToOne
@JoinColumn(name="cust_industry")
private BaseDict custIndustry;
@ManyToOne
@JoinColumn(name="cust_level")
private BaseDict custLevel;//===多的一方。
@Column(name="cust_address")
private String custAddress;
@Column(name="cust_phone")
private String custPhone;
2.客户和联系人
===客户:
加注解前:
加注解后://===同上。
===联系人:
加注解前:
/**
*
* @author syl
*CREATE TABLE `cst_linkman` (
`lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
`lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
`lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
`lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
`lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
`lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
`lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
`lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
`lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id(外键)',
PRIMARY KEY (`lkm_id`),
KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
*/
public class LinkMan {
private Long lkmId;
// `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
// `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
// `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
// `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
// `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
// `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
// `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
// `lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id(外键)',
private String lkmName;
private String lkmGender;
private String lkmPhone;
private String lkmMobile;
private String lkmEmail;
private String lkmPostion;
private String lkmMemo;
private Customer customer;
加注解后:
@Entity
@Table(name="cst_linkman")
public class LinkMan {
@Id
@Column(name="lkm_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long lkmId;
@Column(name="lkm_name")
private String lkmName;
@Column(name="lkm_gender")
private String lkmGender;
@Column(name="lkm_phone")
private String lkmPhone;
@Column(name="lkm_mobile")
private String lkmMobile;
@Column(name="lkm_email")
private String lkmEmail;
@Column(name="lkm_position")
private String lkmPostion;
@Column(name="lkm_memo")
private String lkmMemo;
@ManyToOne()//==###=没有mappedBy属性==【不需要 targetEntity,这里封装过,通过属性类型也能获取到映射的类型】
@JoinColumn(name="lkm_cust_id")//===外键。
private Customer customer;
========================================
熟练自己根据表 编写实体类。应该是最基础的基本功了。也是项目的编码的第一件事。
===######=【最大的注意就是:实体属性除了表的字段。还在【实体间有关联操作的需求】时(例如根据客户 级联删除 联系人):添加关联对象的属性===set+get。
本质:通过对象名引用(地址)访问另一个对象数据。 】
===######=深刻理解:
这里没有 通过字典操作 客户的需求。所以,虽然字典和客户 是一对多。
但是字典类里就没有(不需要)客户类型的属性。
加注解前:
加注解后: