天天看點

自己開發一個Java ORM架構(3)-極速CRUD操作6. 直接使用架構中的EntityOperation進行資料庫操作測試

最近比較忙,瑣事較多,在激烈的看球過程中抽出了些時間,基本把Panda ORM寫完了,隻在mysql上測試了下,問題不大,本篇先講下Panda ORM的用法,後面會陸續講解如何實作的。

Panda ORM用法很簡單:在有資料庫的基礎上,Panda ORM隻需要定義跟資料庫表同樣結構的實體類,并為表的外鍵、主鍵添加注解,即可實作實體對應的增、删、改、查操作。下面進行具體的示範:

1. 建立測試資料庫pandaormtest

建立兩張表user和role如下,注意取消了外鍵限制,使用代碼控制外鍵邏輯(User表的userRole指向Role表的roleId)。

/*
Navicat MySQL Data Transfer

Source Server         : 本機資料庫
Source Server Version : 50552
Source Host           : 127.0.0.1:3306
Source Database       : pandaormtest

Target Server Type    : MYSQL
Target Server Version : 50552
File Encoding         : 65001

Date: 2017-03-16 17:03:08
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `role`
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `roleId` int(10) NOT NULL AUTO_INCREMENT,
  `roleName` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`roleId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES ('1', '校長');
INSERT INTO `role` VALUES ('2', '教師');
INSERT INTO `role` VALUES ('3', '學生');

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `userId` int(10) NOT NULL AUTO_INCREMENT,
  `userRole` int(10) DEFAULT NULL,
  `userName` varchar(20) DEFAULT NULL,
  `userPassword` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`userId`),
  KEY `fk_user_role` (`userRole`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '1', '張一', '1234');
INSERT INTO `user` VALUES ('2', '2', '李四', '1234');
INSERT INTO `user` VALUES ('3', '2', '趙四', '1234');
INSERT INTO `user` VALUES ('4', '3', '王五', '1234');
INSERT INTO `user` VALUES ('5', '3', '陳五', '1234');
INSERT INTO `user` VALUES ('6', '3', '龍五', '1234');
INSERT INTO `user` VALUES ('7', '3', '1', '1234');
INSERT INTO `user` VALUES ('8', '3', '1', '1234');
INSERT INTO `user` VALUES ('9', '3', '1', '1234');
INSERT INTO `user` VALUES ('10', '3', '1', '1234');
INSERT INTO `user` VALUES ('11', '3', '1', '1234');
INSERT INTO `user` VALUES ('12', '3', '1', '1234');
      

2. 建立測試Web Project,并導入Panda ORM架構jar包

建立PandOrmDemo,并在Web-INF/lib下放入panda-orm.jar。該jar包是Panda ORM架構生成的jar包,所有類庫均在panda.orm下。

别忘了既然要連接配接mysql資料庫,要将mysql-connector-java-5.1.39-bin.jar也放到lib下哦。

3. 建立資料庫配置檔案config.properties

在src下建立config.properties,Panda ORM會預設讀取該配置檔案中的參數,代碼如下:

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/pandaormtest?useUnicode=true&characterEncoding=utf-8

user=root

password=Pass1234

注意别寫成

這下面是錯的。

driver="com.mysql.jdbc.Driver"

url= "jdbc:mysql://127.0.0.1:3306/pandaormtest?useUnicode=true&characterEncoding=utf-8";

user="root";

password="Pass1234";

4. 建立實體類

在包entity下建立User和Role實體類,注意實體類名需要和表名一一對應,而實體類的屬性需要和表的列名一一對應,代碼如下:

package entity;
public class User {
    private String userId;
    private Role userRole;
    private String userName;
    private String userPassword;
    //省略get set
}
package entity;
public class Role {
    private String roleId;
    private String roleName;
    //省略get set
}
      

5. 為主鍵、外鍵添加注解

此處需要注意兩點:1,外鍵列的注解需要将主表的主鍵名作為參數;2,主鍵列如果不是自增長需要配置AutoIncrement.FALSE參數(自增長則預設為AutoIncrement.TRUE,不需要配置。因為注解的參數不支援布爾類型,是以自定義了enum 類型的AutoIncrement)。

package entity;
import panda.orm.annotation.ForeignKey;
import panda.orm.annotation.Key;
public class User {
    @Key
    private String userId;
    @ForeignKey("roleId")
    private Role userRole;
    private String userName;
    private String userPassword;
    //省略get set
}
package entity;
import panda.orm.annotation.Key;
public class Role {
    @Key
    private String roleId;
    private String roleName;
    //省略get set
}
      

6. 直接使用架構中的EntityOperation進行資料庫操作測試

package test;
import java.util.List;
import entity.Role;
import entity.User;
import panda.orm.operation.EntityOperation;
public class Main {
    public static void main(String[] args) throws Exception{
        EntityOperation oper=new EntityOperation(User.class);
        //輸出
        List<User> users=oper.selectAll();
        for(User user:users){
            System.out.println(user.getUserName()+"|"+user.getUserRole().getRoleName());
        }
        //新增
        User tempUser=new User();
        tempUser.setUserName("熊貓");
        Role role=new Role();
        role.setRoleId("1");
        tempUser.setUserRole(role);
        oper.add(tempUser);
        //輸出
        users=oper.selectAll();
        for(User user:users){
            System.out.println(user.getUserName()+"|"+user.getUserRole().getRoleName());
        }
    }
}
      

輸入如下,可見已經實作了在具有外鍵的情況下的更新和查詢

張一|校長
李四|教師
趙四|教師
王五|學生
陳五|學生
龍五|學生
1|學生
1|學生
1|學生
1|學生
1|學生
1|學生
張一|校長
熊貓|校長
李四|教師
趙四|教師
王五|學生
陳五|學生
龍五|學生
1|學生
1|學生
1|學生
1|學生
1|學生
1|學生