# 一款自行编写的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 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128101213368.png) ### 介绍 这是一款完全基于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文件夹底下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128101612786.png) 接下来只需要构建好相应的项目结构即可开工: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128101629669.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Rhbm55X2lkZWE=,size_16,color_FFFFFF,t_70) #### 入门demo 首先构建一个User类,然后再去构建UserDao User类里面的对象需要和数据库对象做好相应的注解映射配置: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128101648901.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Rhbm55X2lkZWE=,size_16,color_FFFFFF,t_70) 配置对应的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倍