# velox-jpa
**Repository Path**: maxwellnie/velox-jpa
## Basic Information
- **Project Name**: velox-jpa
- **Description**: 轻量级,扩展性强的JPA框架。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 9
- **Forks**: 0
- **Created**: 2023-06-03
- **Last Updated**: 2025-09-01
## Categories & Tags
**Categories**: database-dev
**Tags**: JPA, Java, SQL, JDBC, reflect
## README
# VeloxJPA
## 注意事项
当项目已移至项目velox-sql,项目已被放弃,不会被维护。
### 什么是VeloxJPA?
VeloxJPA是一款基于Java的,符合JPA规范的数据持久化框架,扩展性很强,可以无需书写SQL语句和声明Dao接口,由VeloxJPA为你实现Dao层的功能,VeloxJPA核心提供基本的框架,你可以根据自身需要,自定义或者是优化SQL,以此增强JPA的功能,通过自定义开发产生的模块称之为velox-jpa-xxx-template。
### 适配性
目前velox-jpa只适配了mysql5+ & Java8+ & spring 5+,你可以根据自身需求编写新的,以适配不同的数据库。
### 使用文档
#### java原生快速上手:
导入依赖:
```xml
io.github.maxwellnie
velox-jpa-core
1.1
io.github.maxwellnie
velox-jpa-core-template
1.1
mysql
mysql-connector-java
5.1.8
org.slf4j
slf4j-api
1.6.1
ch.qos.logback
logback-classic
1.2.6
```
```java
import com.maxwellnie.velox.jpa.core.dao.support.SqlBuilder;
import com.maxwellnie.velox.jpa.core.dao.support.env.Environment;
import com.maxwellnie.velox.jpa.core.cahce.impl.LRUCache;
import com.maxwellnie.velox.jpa.core.config.simple.VeloxJpaConfig;
import com.maxwellnie.velox.jpa.core.jdbc.context.JdbcContext;
import com.maxwellnie.velox.jpa.core.jdbc.context.JdbcContextFactory;
import com.maxwellnie.velox.jpa.core.jdbc.context.SimpleContextFactory;
import com.maxwellnie.velox.jpa.core.jdbc.pool.impl.SimpleConnectionPool;
import com.maxwellnie.velox.jpa.core.jdbc.transaction.impl.jdbc.JdbcTransactionFactory;
import com.maxwellnie.velox.jpa.core.template.dao.TemplateDao;
import java.sql.SQLException;
public class Tests {
public static void main(String[] args) throws SQLException {
//配置数据源
SimpleConnectionPool simpleConnectionPool = new SimpleConnectionPool();
simpleConnectionPool.setDriverClassName("com.mysql.jdbc.Driver");
simpleConnectionPool.setUsername("root");
simpleConnectionPool.setPassword("123456");
simpleConnectionPool.setUrl("jdbc:mysql://localhost:3307/bounddatabase");
//配置针对普通Java程序的配置类VeloxJpaConfig
VeloxJpaConfig veloxJpaConfig = VeloxJpaConfig.getInstance();
veloxJpaConfig.setCache(true);
veloxJpaConfig.setCacheClassName(LRUCache.class.getName());
veloxJpaConfig.setTablePrefix("tb_");
veloxJpaConfig.setStandColumn(true);
veloxJpaConfig.setStandTable(true);
//初始化JdbcContext生产环境环境
Environment environment = new Environment(new JdbcTransactionFactory(), simpleConnectionPool, veloxJpaConfig);
environment.addDaoImpl(User.class);
//JdbcContext工厂
JdbcContextFactory jdbcContextFactory = new SimpleContextFactory(environment);
JdbcContext jdbcContext = jdbcContextFactory.produce(false);
//获取实例
TemplateDao daoImpl = (TemplateDao) environment.getDaoImplFactory(User.class).produce(jdbcContext);
//查询数据
System.out.println(daoImpl.queryAll(new SqlBuilder().where().eq("user_id", 32).build()));
jdbcContext.commit();
System.out.println(daoImpl.queryAll(new SqlBuilder().where().eq("user_id", 32).build()));
}
}
```
User实体:
```java
import com.maxwellnie.vleox.jpa.core.annotation.Entity;
import com.maxwellnie.vleox.jpa.core.annotation.Column;
import com.maxwellnie.vleox.jpa.core.annotation.PrimaryKey;
import com.maxwellnie.vleox.jpa.core.enums.PrimaryMode;
import java.util.Date;
/**
* @author Maxwell Nie
*/
@Entity("tb_user")
public class User {
@PrimaryKey(strategyKey = "jdbc_auto")//KeyStrateyManager.JDBC_AUTO
public int userId;
public String loginName;
public String password;
private String userName;
private String roleName;
private String rights;
private String iconPath;
private boolean sex;
private Date lastTime;
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRights() {
return rights;
}
public void setRights(String rights) {
this.rights = rights;
}
public String getIconPath() {
return iconPath;
}
public void setIconPath(String iconPath) {
this.iconPath = iconPath;
}
public Date getLastTime() {
return lastTime;
}
public void setLastTime(Date lastTime) {
this.lastTime = lastTime;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", loginName='" + loginName + '\'' +
", password='" + password + '\'' +
", userName='" + userName + '\'' +
", roleName='" + roleName + '\'' +
", rights='" + rights + '\'' +
", iconPath='" + iconPath + '\'' +
", sex=" + sex +
", lastTime=" + lastTime +
'}';
}
}
```
#### spring快速上手:
依赖:
```xml
org.springframework
spring-context
5.3.20
org.springframework
spring-jdbc
5.3.20
org.springframework
spring-test
5.3.20
mysql
mysql-connector-java
5.1.8
ch.qos.logback
logback-classic
1.1.2
com.alibaba
druid
1.2.16
io.github.maxwellnie
velox-jpa-spring
1.0
io.github.maxwellnie
velox-jpa-core-template
1.1
net.bytebuddy
byte-buddy
1.14.5
junit
junit
4.13.2
test
```
xml配置文件:
```xml
```
Test类:
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class Test {
public Test() {
// TODO Auto-generated constructor stub
}
@Resource
private TemplateDao userTemplateDao;
@org.junit.Test
public void test() {
boolean b;
System.out.println(userTemplateDao.queryAll(new SqlBuilder().where().eq("user_id", 98).build()));
}
}
```
#### springboot快速上手:
依赖:
```xml
org.springframework.boot
spring-boot-starter-jdbc
${spring-boot.version}
org.springframework.boot
spring-boot-starter-test
${spring-boot.version}
test
org.springframework.boot
spring-boot-dependencies
${spring-boot.version}
pom
import
mysql
mysql-connector-java
5.1.8
org.projectlombok
lombok
true
1.18.28
io.github.maxwellnie
velox-jpa-spring-boot-starer
1.1
com.alibaba
druid
1.2.16
io.github.maxwellnie
velox-jpa-core-template
1.1
net.bytebuddy
byte-buddy
1.14.5
```
application.yml:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3307/bounddatabase?useUnicode=true&characterEncoding=UTF8
driver-class-name: com.mysql.jdbc.Driver
password: 123456
username: root
type: com.alibaba.druid.pool.DruidDataSource
logging:
level:
root: debug
velox-jpa:
tablePrefix: tb_
cache: true
standTable: true
standColumn: true
```
启动类:
```java
@SpringBootApplication
@DaoImplConf(value = "com.example.ttdemo.po")
public class TtdemoApplication {
public static void main(String[] args) {
SpringApplication.run(TtdemoApplication.class, args);
}
}
```
User实体:
```java
package com.example.ttdemo.po;
import com.maxwellnie.velox.jpa.core.annotation.Entity;
import com.maxwellnie.velox.jpa.core.annotation.PrimaryKey;
import com.maxwellnie.velox.jpa.core.enums.PrimaryMode;
import com.maxwellnie.velox.jpa.core.manager.KeyStrategyManager;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@Entity
public class User {
@PrimaryKey(strategyKey = KeyStrategyManager.JDBC_AUTO)
private int userId;
private String loginName;
private String password;
}
```
Test:
```java
package com.example.ttdemo;
import com.example.ttdemo.po.User;
import com.maxwellnie.velox.jpa.core.dao.support.SqlBuilder;
import com.maxwellnie.velox.jpa.core.template.dao.TemplateDao;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.sql.SQLException;
@SpringBootTest
class TtdemoApplicationTests {
@Resource
TemplateDao userTemplateDao;
@Test
void contextLoads() throws SQLException {
System.out.println(userTemplateDao);
User user = userTemplateDao.queryOne(new SqlBuilder().where().eq("user_id", 49).build());
System.out.println(userTemplateDao.queryOne(new SqlBuilder().where().eq("user_id", 49).build()));
System.out.println(userTemplateDao.queryOne(new SqlBuilder().where().eq("user_id", 490).build()));
System.out.println(userTemplateDao.queryOne(new SqlBuilder().where().eq("user_id", 234).build()));
}
}
```
sql:
```sql
USE
DATABASE bounddatabase;
SET NAMES utf8mb4;
SET
FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_bound
-- ----------------------------
DROP TABLE IF EXISTS `tb_bound`;
CREATE TABLE `tb_bound`
(
`bound_id` int(11) NOT NULL AUTO_INCREMENT,
`bound_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`bound_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user`
(
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`login_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`rights` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`icon_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`sex` tinyint(255) NULL DEFAULT NULL,
`last_time` datetime NULL DEFAULT NULL,
PRIMARY KEY (`user_id`) USING BTREE,
INDEX `a`(`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;
SET
FOREIGN_KEY_CHECKS = 1;
```
#### 开发者
如果你是一个想要丰富VeloxJpa功能的开发者,你需要了解VeloxJpa的特点、架构。
VeloxJpa是一个高度自定义的框架,你可以创造属于你的velox-jpa-template并将它分享到互联网。
VeloxJpa分为以下结构:
##### Dao接口
这个是开发者需要提供的接口,这个接口中需要编写对应的操作数据库开放的方法
```
编写好接口后,你需要指定接口中哪些方法是操作数据库的方法,哪些是默认方法,在这里我们提供了一种注册操作数据库方法的注解:
@RegisterMethod(value=Class extends Executor>),这个注解中,你需要指定你所实现的Executor。
```
##### Executor接口
这个接口用于实现Dao被注册方法的逻辑实现
```java
/**
* 方法执行器,执行被代理的方法
*
* @author Maxwell Nie
*/
public interface Executor {
/**
* 执行被代理的方法
*
* @param tableInfo
* @param context
* @param cache
* @param daoImplHashCode
* @param args
* @return 操作结果
*/
Object execute(TableInfo tableInfo, JdbcContext context, Cache