Jorm实现简单的数据库CRUD操作

Jorm 跟Hibernate的相似度非常高,它也是一个封装了JDBC的数据库对象持久化的框架。Jorm本身提供了annotation的组件引用,可以通过简单地标记实体对象的字段和类就可以实现Java对象与数据库对象的一一对应关系。通过Jorm的工具方法来实现数据库的持久化或查询操作,最重要的工具类文件是Jorm.java,其次是Session.java。眼见为实,下面来看一下程序实例。

1、数据库及测试表创建

   打开mysql数据库管理界面,创建一个名为test的数据库,并创建一个t_user的数据库表,数据库建表语句如下:

CREATE TABLE `t_user` (                
        `id` int(11) NOT NULL,               
        `name` varchar(50) DEFAULT NULL,     
        `sex` char(4) DEFAULT NULL,          
        `age` int(11) DEFAULT NULL,          
        `career` varchar(100) DEFAULT NULL,  
        PRIMARY KEY (`id`)                   
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、创建User实体对象(此对象与数据库表字段一一对应)

package com.boonya.jorm.entity;

import org.javaclub.jorm.annotation.Column;
import org.javaclub.jorm.annotation.Entity;
import org.javaclub.jorm.annotation.Id;
import org.javaclub.jorm.annotation.NoColumn;
import org.javaclub.jorm.annotation.PK;
/**
 * 
 * 
  • 文件名称: User
  • *
  • 文件描述: $
  • *
  • 内容摘要: 包括模块、函数及其功能的说明
  • *
  • 完成日期:2013-10-27
  • *
  • 所属作者:[email protected]
  • *
  • 修改记录1:下午04:51:57,修改内容描述
  • * */ @PK(value = "id") @Entity(table="t_user") public class User { @Id @Column("id") private int id; @Column("name") private String name; // 与数据库字段命名一致,可以不指定@Column private String sex; @Column("age") private Integer age; @Column("career") private String career; @NoColumn private int kvalue; public User() { super(); } public User(String name, String sex, Integer age, String career) { super(); this.name = name; this.sex = sex; this.age = age; this.career = career; } public User(Integer id, String name, String sex, Integer age, String career) { super(); this.id = id; this.name = name; this.sex = sex; this.age = age; this.career = career; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getCareer() { return career; } public void setCareer(String career) { this.career = career; } public int getKvalue() { return kvalue; } public void setKvalue(int kvalue) { this.kvalue = kvalue; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("[" + id + ", " + name + ", " + sex + ", " + age + ", " + career + "]"); return sb.toString(); } }
    注:@PK表示主键,@NoColumn表示不在数据库持久化该字段(即不进行该字段的映射)。

    3、编写IUserService接口,定义用户动作

    package com.boonya.jorm.service;
    
    import java.util.List;
    
    import com.boonya.jorm.entity.User;
    /**
     * 
     * 
  • 文件名称: IUserService
  • *
  • 文件描述: $
  • *
  • 内容摘要: 包括模块、函数及其功能的说明
  • *
  • 完成日期:2013-10-27
  • *
  • 所属作者:[email protected]
  • *
  • 修改记录1:下午04:55:36,修改内容描述
  • * */ public interface IUserService { public boolean add(User user); public boolean batchAdd(List userList); public boolean delete(int id); public User getUser(int id); public boolean update(User user); public List getPagingList(Object [] params,int page, int pageSize,String sortType,String sortName); }

    4、编写SessionManager来实现数据库访问

    package com.boonya.jorm.service.utils;
    
    import org.javaclub.jorm.Jorm;
    import org.javaclub.jorm.Session;
    
    public class SessionManager
    {
    
    	private static final Session session = Jorm.getSession();
    
    	public static Session getInstance()
    	{
    		return SessionManager.session;
    	}
    
    }
    
    5、编写UserDao的CRUD方法

    package com.boonya.jorm.dao;
    
    import java.util.List;
    import org.javaclub.jorm.Page;
    import org.javaclub.jorm.Session;
    import org.javaclub.jorm.jdbc.JdbcException;
    import org.javaclub.jorm.jdbc.batch.JdbcBatcher;
    import org.javaclub.jorm.jdbc.criterion.Order;
    import org.javaclub.jorm.jdbc.sql.SqlParams;
    import com.boonya.jorm.entity.User;
    import com.boonya.jorm.service.utils.LogManager;
    import com.boonya.jorm.service.utils.SessionManager;
    /**
     * 
     * 
  • 文件名称: UserDao
  • *
  • 文件描述: $
  • *
  • 内容摘要: 包括模块、函数及其功能的说明
  • *
  • 完成日期:2013-10-27
  • *
  • 所属作者:[email protected]
  • *
  • 修改记录1:下午04:52:16,修改内容描述
  • * */ public class UserDao { /** * 根据ID查询用户信息 * * @param id * 主键ID * @return User 用户信息对象 */ public User getUserById(int id) { Session session = SessionManager.getInstance(); User user = session.read(User.class, id); return user; } /** * 用户信息入库 * * @param user * 用户信息对象 * @return boolean 成功(true)/失败(false) */ public boolean saveUser(User user) { Session session = SessionManager.getInstance(); // 清空User实体对应的数据库表的记录 session.clean(User.class); try { session.save(user); return true; } catch (JdbcException e) { LogManager.setLog("用户信息入库失败", e); } return false; } /** * 根据用户ID删除用户 * * @param id * 用户ID */ public boolean deleteUser(int id) { Session session = SessionManager.getInstance(); User user = session.read(User.class, id); try { if (user != null) { session.delete(user); return true; } } catch (JdbcException e) { LogManager.setLog("根据用户ID删除用户失败", e); } return false; } /** * 用户信息更新 * * @param user * 用户信息对象 * @return boolean 成功(true)/失败(false) */ public boolean updateUser(User user) { Session session = SessionManager.getInstance(); try { session.update(user); return true; } catch (JdbcException e) { LogManager.setLog("用户信息更新失败", e); } return false; } /** * [批量入库]用户信息 * * @param userList * 用户列表 * @return boolean 成功(true)/失败(false) */ public boolean batchSaveUser(List userList) { Session session = SessionManager.getInstance(); // 清空User实体对应的数据库表的记录 session.clean(User.class); JdbcBatcher batcher = session.createBatcher(); try { User user = null; for (int i = 0, j = userList.size(); i < j; i++) { user = userList.get(i); if (user != null) { batcher.save(user); } } batcher.execute(); return true; } catch (JdbcException e) { LogManager.setLog("[批量入库]用户信息失败", e); } return false; } /** * 用户分页查询(条件查询) * * @param page * 分页索引 * @param pageSize * 每页条数 * @param sortType * 排序类型 * @param sortName * 排序字段 * @return List 用户分页列表 */ @SuppressWarnings( { "rawtypes", "unchecked" }) public List getUserPage(Object[] params, int page, int pageSize, String sortType, String sortName) { Session session = SessionManager.getInstance(); String sql = " select * from t_user where name = ? and id > ? "; SqlParams sqlParams = new SqlParams(sql, params); sqlParams.setObjectClass(User.class); // 设置查询条件 // sqlParams.setParams(params); // sqlParams.setSql(sql); // 设置分页的查询索引 int firstPageIndex = (page - 1) * pageSize; int maxPageIndex = page * pageSize; sqlParams.setFirstResult(firstPageIndex); sqlParams.setMaxResults(maxPageIndex); sqlParams.addOrder(sortType.equals("asc") ? Order.asc(sortName) : Order.desc(sortName)); List users = session.list(sqlParams); return users; } /** * 用户分页查询 * * @param page * 分页索引 * @param pageSize * 每页条数 * @param sortType * 排序类型 * @param sortName * 排序字段 * @return List 用户分页列表 */ public List getUserPage(int page, int pageSize, String sortType, String sortName) { Session session = SessionManager.getInstance(); SqlParams sqlParams = new SqlParams(); sqlParams.setObjectClass(User.class); // 设置分页的查询索引 int firstPageIndex = (page - 1) * pageSize; int maxPageIndex = page * pageSize; sqlParams.setFirstResult(firstPageIndex); sqlParams.setMaxResults(maxPageIndex); // 添加排序类型和字段 sqlParams.addOrder(sortType.equals("asc") ? Order.asc(sortName) : Order.desc(sortName)); // 添加了排序类型和字段必须设置SQL语句,否则异常提示不能获取到Query对象 sqlParams.setSql(" select * from t_user "); List users = session.list(sqlParams); return users; } /** * 内置分页数据对象 * * @param page * 分页索引 * @param pageSize * 显示条数 * @param totalCount * 查询总数 * @param users * 查询结果集 * @return Page 分页数据对象 */ public Page getPage(int page, int pageSize, int totalCount, List users) { Page pageData = new Page(); pageData.setPageNo(page); pageData.setPageSize(pageSize); pageData.setTotalCount(totalCount); pageData.setResult(users); return pageData; } }
    6、创建UserService实现IUserService

    package com.boonya.jorm.service;
    
    import java.util.List;
    
    import com.boonya.jorm.dao.UserDao;
    import com.boonya.jorm.entity.User;
    /**
     * 
     * 
  • 文件名称: UserService
  • *
  • 文件描述: $
  • *
  • 内容摘要: 包括模块、函数及其功能的说明
  • *
  • 完成日期:2013-10-27
  • *
  • 所属作者:[email protected]
  • *
  • 修改记录1:下午04:55:55,修改内容描述
  • * */ public class UserService implements IUserService { public static UserDao userDao=new UserDao(); @Override public boolean add(User user) { return userDao.saveUser(user); } @Override public boolean batchAdd(List userList) { return userDao.batchSaveUser(userList); } @Override public boolean delete(int id) { return userDao.deleteUser(id); } @Override public User getUser(int id) { return userDao.getUserById(id); } @Override public boolean update(User user) { return userDao.updateUser(user); } @Override public List getPagingList(Object [] params,int page, int pageSize, String sortType, String sortName) { return userDao.getUserPage(params,page, pageSize, sortType, sortName); } }

    7、编写单元测试用例

    package com.boonya.jorm.test;
    
    import java.util.ArrayList;
    import java.util.List;
    import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import com.boonya.jorm.entity.User;
    import com.boonya.jorm.service.IUserService;
    import com.boonya.jorm.service.UserService;
    
    public class UserTest
    {
    	private IUserService userService;
    
    	@Before
    	public void initInterface()
    	{
    		userService = new UserService();
    	}
    
    	@After
    	public void freeSources()
    	{
    		userService = null;
    	}
    
    	@Test
    	public void add()
    	{
    		User user = new User("boonya", "male", 23, "Java programmer");
    		boolean success = userService.add(user);
    		Assert.assertTrue("添加新的用户", success);
    	}
    
    	@Test
    	public void bgetUser()
    	{
    		User user = userService.getUser(1);
    		Assert.assertNull("用户ID=1查询", user);
    	}
    
    	@Test
    	public void cupdate()
    	{
    		User user = userService.getUser(1);
    		Assert.assertNotNull("存在ID=1用户", user);
    		user.setCareer("Test case update " + System.currentTimeMillis());
    		boolean success = userService.update(user);
    		Assert.assertTrue("更新ID=1的用户", success);
    	}
    
    	@Test
    	public void delete()
    	{
    		User user = userService.getUser(1);
    		Assert.assertNotNull("存在ID=1用户", user);
    		boolean success = userService.delete(1);
    		Assert.assertTrue("删除ID=1的用户", success);
    	}
    
    	@Test
    	public void fbatchAdd()
    	{
    		// 批量添加
    		List userList = new ArrayList();
    		User user;
    		for (int i = 0; i < 100; i++)
    		{
    			user = new User("boonya", "male", 23, "Java programmer" + i);
    			userList.add(user);
    		}
    		Assert.assertNotNull("fbatchAdd集合不为空", userList);
    		boolean success = userService.batchAdd(userList);
    		Assert.assertTrue("批量添加", success);
    	}
    
    	@Test
    	public void gpaingQuery()
    	{
    		// 分页数据查询
    		Object[] params = new Object[]
    		{ "boonya100", "90" };
    		List users = userService.getPagingList(params, 1, 8, "asc", "id");
    		Assert.assertNotNull("gpaingQuery集合不为空", users);
    		User user;
    		for (int i = 0, j = users.size(); i < j; i++)
    		{
    			user = users.get(i);
    			System.out.println(user == null ? "" : user.toString());
    		}
    	}
    
    }
    
    注:此处的Page分页只是最简单的一种封装方式,后面需要详细地了解,另外整个数据访问只包含一个数据库session访问,所以不用关闭该session,若是单个的session需要用完即对其进行关闭,释放资源占用。

    你可能感兴趣的:(JORM)