自己开发一个Java ORM框架(3)-极速CRUD操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文目录1. 新建测试数据库pandaormtest2. 新建测试Web Project,并导入Panda ORM框架jar包3. 建立数据库配置文件config.properties4. 建立实体类5. 为主键、外键添加注解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|学生


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
25天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
13天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
74 13
|
17天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
52 10
|
11天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
49 2
|
20天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
26天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
38 4
|
SQL Java 数据库
自己开发一个Java ORM框架(5)-CRUD操作源码
本文目录 1. 整体思路介绍 2. 注解设计与实现 3. 实体类结构解析器DataTable的实现 4. 通过表结构类DataTable生成sql语句 5. 通过EntityOperation封装数据库实体操作 6. 总结和展望
213 0
自己开发一个Java ORM框架(5)-CRUD操作源码
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。