# 一款自行编写的orm框架(ibernate)
**Repository Path**: IdeaHome_admin/ibernate
## Basic Information
- **Project Name**: 一款自行编写的orm框架(ibernate)
- **Description**: 基于java语言编写的一款原生ORM框架,包含部分有:数据库连接池,redis缓存机制,基于注解的数据库crud常用方法,可支持从配置文件读取数据源信息。2.0版本里面可以提供自定义接口,并且自动通过接口创建相应的crud函数。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 12
- **Forks**: 3
- **Created**: 2018-04-13
- **Last Updated**: 2023-11-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### Ibernate 框架2.0

### 介绍
这是一款完全基于java语言,注解和简单properties配置的一款原生ORM框架,包含部分有:数据库连接池,redis缓存机制,基于注解的数据库crud常用方法,可支持从配置文件读取数据源信息。经过一定的和修复已经对于redis的缓存自动化进行了调整,后期将会引入自动生成接口功能,从而提高sql的使用方便度。希望各位开源大佬们多多给Ibernate一些建议。
常规的hibernate可以自动化生成相应的sql代码,但是对于性能优化方面需要开发人员学习hql语法,特别繁琐。而且Hibernate对于session生命周期管理也太过于复杂,配置也过于繁琐。现今比较流行的mybatis需要开发人员自己手动写sql来进行数据库操作,这种步骤较为灵活,但是对于一些简单的增删改查操作不能自动生成,例如一个插入语句,如果相应的表有1000个字段,那么这段sql语句将会特别冗长,不利于后期的维护。Ibernate结合了Hibernate和Mybatis两者的好处,简单的sql语句可以自动生成,复杂的sql语句可以自己编写。开发时长为1星期,由于6月份需要找实习工作,所以只好最近抽时间来进行相应的优化。
### 版本更新
在基于之前的版本基础进行了迭代改造,2.0版本对于数据接口部分的编写更为简单,通过声明式接口的方式即可实现,而且自带已定义好的Dao函数,简化了开发者的代码编写工作,希望大家能够喜欢2.0版本的ibernate。
### 配置环境
jdk版本:1.8
数据源:暂时只支持mysql和redis
开发环境:windows,linux,mac
项目结构类型:maven类型项目
### 使用说明
导入以下jar包:
ibernate-1.4.jar
以及相关应用依赖:
```go
redis.clients
jedis
2.9.0
mysql
mysql-connector-java
5.1.36
```
#### 编写MySQL配置文件
ibernate的核心数据源配置:
命名要求:ibn-cfg.properties (一定要一致)
然后在ibn-cfg.properties文件中配置相关的连接数据库信息
```go
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=false&characterEncoding=gb2312
username=root
password=root
initcount=10 #连接池的连接大小数目
step=2 #连接池的扩容因子,当连接数不足的时候的递增量
maxcount=50 #连接池的最大连接数
```
#### Redis缓存配置文件
命名要求:ibn-redis.properties (一定要一致)
加入缓存的连接配置
```java
cachetype: redis #缓存的类型,切记要一致配置
ip: 127.0.0.1
port: 6379
maxidle: 100 #缓存池的最大连接数
timeout: 1000 #超时时长
password: 1 #redis密码
```
相应的配置文件需要存放在resource文件夹底下:

接下来只需要构建好相应的项目结构即可开工:

#### 入门demo
首先构建一个User类,然后再去构建UserDao
User类里面的对象需要和数据库对象做好相应的注解映射配置:

配置对应的User实体类
```java
package com.sise.model;
import org.lh.ibernate.annotation.Column;
import org.lh.ibernate.annotation.Id;
import org.lh.ibernate.annotation.Table;
@Table(name = "user")
public class User {
@Id
@Column(value = "id")
public int id;
@Column(value = "username")
public String username;
@Column(value = "password")
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
}
```
UserDao里面的编写比较简单:
是的,就是这么简单,只需要继承一个IbernateBaseDao接口,对所需要开发的函数加上注解即可,其他的东西全部都交给框架来处理就好了
```java
package com.sise.dao.interfaces;
import com.sise.model.User;
import org.lh.ibernate.annotation.*;
import org.lh.ibernate.core.invoker.IbernateBaseDao;
import java.util.List;
@Mapper
public interface UserDao extends IbernateBaseDao {
@Query("select * from user limit ?")
List findAllByPage(int size);
@Query("select * from user where id=?")
User findOne(int id);
@Query("select * from user where id>? and username like ?")
List findAllByIdAndUsername(int id,String username);
@Query("select * from user order by id desc limit 1 ")
User findNewOne();
@Query("select * from user group by username")
List findAllGroupByUsername();
@Query("select * from user order by id desc limit ?,?")
List findAllByPage(int page,int pageSize);
@QueryCallableStatement(value = "{call userlist()}")
List callUserList();
}
```
#### junit的相关测试
使用junit4框架进行基本的crud测试
```java
import com.sise.dao.UserDao;
import com.sise.model.User;
import org.junit.Before;
import org.junit.Test;
import org.lh.ibernate.interfaces.ISessionUtil;
import org.lh.ibernate.interfaces.impl.SessionUtil;
import java.util.List;
public class UserDaoTest {
public MapperFactory mf=new MapperFactory<>();
public UserDao ud;
@Before
public void setUp() throws ClassNotFoundException {
ud= (UserDao) mf.createmapper(UserDao.class);
}
@Test
public void testFindOne(){
User user=ud.findOne(1);
System.out.println(user.toString());
}
@Test
public void testfindAll(){
List userList=ud.findAllByPage(5);
for (User user : userList) {
System.out.println(user.toString());
}
}
@Test
public void testfindAllByIdAndUsername(){
List userList=ud.findAllByIdAndUsername(1,"%1%");
for (User user : userList) {
System.out.println(user.toString());
}
}
@Test
public void testSaveOne(){
User user=new User();
user.setUser_name("hhhh");
user.setPass_word("pwd");
ud.saveOne(user);
}
@Test
public void testUpdate(){
User user=ud.findOne(13);
user.setUser_name("new update");
ud.updateOne(user);
}
@Test
public void testDelete(){
User user=ud.findNewOne();
System.out.println(user.toString());
ud.deleteOne(user);
}
@Test
public void testFindNewOne(){
List userList=ud.findAllGroupByUsername();
for (User user : userList) {
System.out.println(user.toString());
}
}
@Test
public void testFindAllByPage(){
List userList=ud.findAllByPage(2,4);
for (User user : userList) {
System.out.println(user.toString());
}
}
}
```
#### 引用注意要点
1.创建接口dao,需要继承相应的IbernateBaseDao
2.需要通过MapperFactory里面的createmapper创建相应的接口类即可。
```java
public MapperFactory mf=new MapperFactory<>();
public UserDao ud;
@Before
public void setUp() throws ClassNotFoundException {
ud= (UserDao) mf.createmapper(UserDao.class);
}
```
#### 性能比较
在大数据量的情况下比常规的jdbc单一链接查询性能要快10-20倍