※resultMap的discriminator
為了練習用,再增加幾個欄位ALTER TABLE CHESS ADD SCORE NUMBER(3); ALTER TABLE CHESS ADD SCHOOL VARCHAR(20); ALTER TABLE CHESS ADD SALARY NUMBER(7); ALTER TABLE CHESS ADD COMPANY VARCHAR(20); ALTER TABLE CHESS ADD CLASS VARCHAR(3); COMMENT ON COLUMN CHESS.SCORE IS '學生學棋的分數'; COMMENT ON COLUMN CHESS.SCHOOL IS '學生的學校名稱'; COMMENT ON COLUMN CHESS.SALARY IS '員工製造棋的薪水'; COMMENT ON COLUMN CHESS.COMPANY IS '員工公司名稱'; COMMENT ON COLUMN CHESS.CLASS IS '分類:1學生 2員工';
或者乾脆重新建一張
CREATE TABLE CHESS ( CHESS_NO NUMBER(10), NAME VARCHAR2(10), PRICE NUMBER(5), PRODUCT_DATE DATE, SCORE NUMBER(3), SCHOOL VARCHAR2(20), SALARY NUMBER(7), COMPANY VARCHAR2(20), CLAZZ VARCHAR2(3), CONSTRAINT CHESS_PK PRIMARY KEY (CHESS_NO) ); COMMENT ON COLUMN CHESS CHESS_NO IS '棋編號'; COMMENT ON COLUMN CHESS NAME IS '棋名稱'; COMMENT ON COLUMN CHESS PRICE IS '棋價錢'; COMMENT ON COLUMN CHESS PRODUCT_DATE IS '棋的生產日期'; COMMENT ON COLUMN CHESS SCORE IS '學生學棋的分數'; COMMENT ON COLUMN CHESS SCHOOL IS '學生的學校名稱'; COMMENT ON COLUMN CHESS SALARY IS '員工製造棋的薪水'; COMMENT ON COLUMN CHESS COMPANY IS '員工公司名稱'; COMMENT ON COLUMN CHESS CLAZZ IS '分類:1學生 2員工'; COMMENT ON TABLE CHESS IS '棋表';
現在就是說新增的欄位CLAZZ可以區分成學生和員工兩部分,在資料庫是一張表,但在java把它區分開來,變三張表
因為CLAZZ是區分用的,所以要在原本的vo增加class,其他兩張分別是Student.java和Employee.java,把對應的兩個屬性放在裡面,然後給setter/getter,繼承一下原本的Chess.java
發現class在java是關鍵字,改一下
ALTER TABLE CHESS RENAME COLUMN CLASS TO CLAZZ;
三張java表如下:
Chess.java
public class Chess {
private Integer chessNo;
private String name;
private Integer price;
private Date productDate;
private String clazz;
}
//setter/getter
Student.java
public class Strudent extends Chess {
private int score;
private String school;
}
//setter/getter
Employee.java
public class Employee extends Chess {
private int salary;
private String company;
}
//setter/getter
重點來了,Chess.xml
<sql id="column">
CHESS_NO, NAME, PRICE, PRODUCT_DATE, CLAZZ
</sql>
<resultMap type="Chess" id="ChessInterface">
<id property="chessNo" column="CHESS_NO" />
<result property="name" column="NAME" />
<result property="price" column="PRICE" />
<result property="productDate" column="PRODUCT_DATE" />
<discriminator javaType="java.lang.String" column="CLAZZ">
<case value="1" resultType="Student">
<result property="score" column="SCORE"/>
<result property="school" column="SCHOOL"/>
</case>
<case value="2" resultType="Employee">
<result property="salary" column="SALARY"/>
<result property="company" column="COMPANY"/>
</case>
</discriminator>
</resultMap>
<insert id="insertStudent" parameterType="Chess">
<selectKey keyProperty="chessNo" order="BEFORE" resultType="java.lang.Integer">
SELECT CHESS_SEQUENCE.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO CHESS(
<include refid="column" />, SCORE, SCHOOL
)
VALUES(#{chessNo}, #{name}, #{price}, #{productDate}, #{clazz}, #{score}, #{school})
</insert>
<insert id="insertEmployee" parameterType="Chess">
<selectKey keyProperty="chessNo" order="BEFORE" resultType="java.lang.Integer">
SELECT CHESS_SEQUENCE.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO CHESS(
<include refid="column" />, SALARY, COMPANY
)
VALUES(#{chessNo}, #{name}, #{price}, #{productDate}, #{clazz}, #{salary}, #{company})
</insert>
測試類沒什麼特別(clazz可以用enum去設計較漂亮):Student stu = new Student();
stu.setName("孔明棋");
stu.setPrice(20);
stu.setProductDate(new Date());
stu.setClazz("1");
stu.setScore(70);
stu.setSchool("諸葛亮小學");
System.out.println(sqlSession.insert("Chess.insertStudent", stu));
Employee emp = new Employee();
emp.setName("孔明棋");
emp.setPrice(20);
emp.setProductDate(new Date());
emp.setClazz("2");
emp.setSalary(50000);
emp.setCompany("小棋玩具社");
System.out.println(sqlSession.insert("Chess.insertEmployee", emp));
沒有留言:
張貼留言