# simple-orm **Repository Path**: haopeng/simple-orm ## Basic Information - **Project Name**: simple-orm - **Description**: 基于 spring-jdbc的 简易rom框架(支持多数据源) - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 4 - **Created**: 2017-04-07 - **Last Updated**: 2022-03-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #基于spring-jdbc 和 javax.persistence 注解的简易ORM框架,支持多数据源(目前仅支持 mysql) 通过简单的常规的spring的配置就可以轻松实现,对代码无侵入,整个个jar包不到 30多K,包括对数据常用的所有操作,对于特殊业务可以灵活扩展; - 通过maven引用此包 ``` net.oschina.haopeng simple-orm v1.9 ``` - 只需要配置 datasource 和 jdbcTemplate 见下面配置: ``` //配置jdbcTemplate // 用于配置 spring的扫描器 加载bean到容器中 ``` - 自定义dao 数据操作层 只需要继承 BaseDaoAdapter 抽象类 就可以继承基础的操作 ``` @Repository //通过spring注解自动加载到 bean 容器中 public class SysUserDao extends BaseDaoAdapter{ // 实现对当前dao操作的扩展 //根据名称模糊查询(样例) public List like(String name) throws SQLException { return getQuery().likeProperty("userName", "hao").list(); } // 更新用户名称 public Integer updateUserName(String userName,int userId) throws SQLException { return getUpdater().equalProperty("userId", userId).setProperty("userName", userName).update(); } } ``` - 自定义 service 业务层 只需要继承 BaseServiceImpl 抽象类 就可以轻松继承基本业务的操作 ``` //自定义业务接口 public interface SysUserService extends BaseService{ //用于业务接口的扩展 } //自定义业务实现类 @Service //通过spring注解自动加载到 bean 容器中 public class SysUserServiceImpl extends BaseServiceImpl implements SysUserService{ //用于对业操作的扩展 } ``` - 使用方法 ``` //自定义性别枚举(下面会用到) public enum Sex { MALE,FEMALE } //定义数据映射实体类 @Table(name="sys_user") // 设置对应的表名 @TargetDataSource(name="hueDataSource") //如果需要支持多数据源,添加此注解 public class SysUser implements Serializable { @Id //设置为主键值 @Column(name="id") //设置数据库中对应的字段名 private Long userId; @Column(name="status") // 设置数据库中对应的字段名 private boolean status; @Column(name="user_name") private String userName; @OrderBy(value="DESC") //设置默认的排序字段,在查询时如果没有设置就按默认的排序方式查询; @Column(name="create_date") private Date createDate; @Column(name="sex") @Enumerated(EnumType.ORDINAL) //此处为枚举属性;@Enumerated(EnumType.STRING):以枚举的名称存储;@Enumerated(EnumType.ORDINAL):以枚举的ORDINAL存储;(如果不写默认按名称存储) private Sex sex; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } } 实际的操作: DAO(数据操作层demo): @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:beans.xml"}) public class DaoTest { @Autowired SysUserDao sysUserDao; //指定查询字段 @Test public void testSelect() { try { print(sysUserDao.select("userId", "userName","createDate","sex").setOrderBy("createDate","asc").query()); } catch (SQLException e) { e.printStackTrace(); } } // 查询单条数据 @Test public void testFind(){ try { System.out.println(sysUserDao.find(2)); } catch (DataAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } //模糊查询 @Test public void like() throws SQLException { print(sysUserDao.like("h")); } // 保存数据 @Test public void testSave(){ try { SysUser s=new SysUser(); s.setSex(Sex.FEMALE); s.setCreateDate(new Date()); s.setUserName("pegyou"); System.err.println(sysUserDao.insert(s).getUserId()); } catch (DataAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } // 统计数据 @Test public void testCount(){ try { SysUser s=new SysUser(); s.setUserName("pegyou"); System.err.println(sysUserDao.count(s)); } catch (DataAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } //更新数据库中的数据 @Test public void testUpdate(){ try { sysUserDao.update("userName", "我的测试", "userName", "pegyou"); } catch (SQLException e) { e.printStackTrace(); } } // 设置配置 并查询多条数据 @Test public void testQueryAll(){ try { print(sysUserDao.query()); System.out.println(); print(sysUserDao.setOrderBy("userId", "desc").query()); System.out.println(); print(sysUserDao.query()); } catch (SQLException e) { e.printStackTrace(); } } @Test public void testCountAll(){ try { System.out.println(sysUserDao.count()); } catch (Exception e) { // TODO: handle exception } } // 根据ID主键值删除 @Test public void deleteById(){ try { System.out.println(sysUserDao.deleteById(12)); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //根据bean属性删除 @Test public void delete(){ try { SysUser sysUser=new SysUser(); sysUser.setUserName("我的测试"); System.out.println(sysUserDao.delete(sysUser)); } catch (Exception e) { // TODO: handle exception } } public void print(List ls){ for(SysUser sysUser:ls){ System.out.println(sysUser.getUserId()+" "+sysUser.getUserName()+" "+sysUser.getSex()+" "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(sysUser.getCreateDate())); } } } Service(业务操作层实现demo): @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:beans.xml"}) public class ServiceTest { @Autowired SysUserService sysUserService; @Test public void testSelect(){ try { print(sysUserService.select("userId","userName","sex").query()); } catch (SQLException e) { e.printStackTrace(); } } @Test public void testFind(){ try { print(sysUserService.find(2)); } catch (DataAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } @Test public void update(){ try { sysUserService.update("userName","我的测试", "userName", "pegyou"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void testQuery(){ try { SysUser m=new SysUser(); m.setStatus(false); print(sysUserService.query(m)); print(sysUserService.setOrderBy("userName", "DESC").query(m)); print(sysUserService.query(m)); } catch (SQLException e) { e.printStackTrace(); } } @Test public void testPageable(){ try { Pageable pageable=new PageRequest(1, 10); //页码从1开始,每页10条数据 SysUser m=new SysUser(); m.setStatus(false); print(sysUserService.query(m, pageable).getContents()); } catch (SQLException e) { e.printStackTrace(); } } @Test public void testSave(){ try { SysUser m=new SysUser(); m.setUserId((long)16); m.setStatus(false); m.setCreateDate(new Date()); m.setUserName("我的测试"); print(sysUserService.save(m)); } catch (SQLException e) { e.printStackTrace(); } } public void print(SysUser sysUser){ if(sysUser==null){ System.err.println("sysUser 为 null"); return; } System.out.println(sysUser.getUserId()+" "+sysUser.getUserName()+" "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(sysUser.getCreateDate())); } public void print(List ls){ for(SysUser sysUser:ls){ System.out.println(sysUser.getUserId()+" "+sysUser.getUserName()+" "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(sysUser.getCreateDate())); } System.out.println(); } 注意:以上 业务层代码也是一样; 关于命名的规则(建议): 查询一条数据的方法 以find*,get* 开头; 查询多条数据的方法 以 query*,list* 开头; 添加数据的方法以 insert* 或 save*方法开头; 删除数据方法以 delete*,del* 开头; 更新数据方法以 update* 开头 具体的实现demo请参考 项目代码中 src/test/java/com.simple.orm.test 包下的实现方式; ```