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;
/**
*
* <li>文件名称: User</li>
* <li>文件描述: $</li>
* <li>内容摘要: 包括模块、函数及其功能的说明</li>
* <li>完成日期:2013-10-27</li>
* <li>所属作者:boonyachengdu@gmail.com</li>
* <li>修改记录1:下午04:51:57,修改内容描述</li>
*
*/
@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;
/**
*
* <li>文件名称: IUserService</li>
* <li>文件描述: $</li>
* <li>内容摘要: 包括模块、函数及其功能的说明</li>
* <li>完成日期:2013-10-27</li>
* <li>所属作者:boonyachengdu@gmail.com</li>
* <li>修改记录1:下午04:55:36,修改内容描述</li>
*
*/
public interface IUserService {
public boolean add(User user);
public boolean batchAdd(List<User> userList);
public boolean delete(int id);
public User getUser(int id);
public boolean update(User user);
public List<User> 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;
/**
*
* <li>文件名称: UserDao</li>
* <li>文件描述: $</li>
* <li>内容摘要: 包括模块、函数及其功能的说明</li>
* <li>完成日期:2013-10-27</li>
* <li>所属作者:boonyachengdu@gmail.com</li>
* <li>修改记录1:下午04:52:16,修改内容描述</li>
*
*/
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<User> 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<User> 用户分页列表
*/
@SuppressWarnings(
{ "rawtypes", "unchecked" })
public List<User> 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<User> users = session.list(sqlParams);
return users;
}
/**
* 用户分页查询
*
* @param page
* 分页索引
* @param pageSize
* 每页条数
* @param sortType
* 排序类型
* @param sortName
* 排序字段
* @return List<User> 用户分页列表
*/
public List<User> getUserPage(int page, int pageSize, String sortType, String sortName)
{
Session session = SessionManager.getInstance();
SqlParams<User> sqlParams = new SqlParams<User>();
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<User> users = session.list(sqlParams);
return users;
}
/**
* 内置分页数据对象
*
* @param page
* 分页索引
* @param pageSize
* 显示条数
* @param totalCount
* 查询总数
* @param users
* 查询结果集
* @return Page<User> 分页数据对象
*/
public Page<User> getPage(int page, int pageSize, int totalCount, List<User> users)
{
Page<User> pageData = new Page<User>();
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;
/**
*
* <li>文件名称: UserService</li>
* <li>文件描述: $</li>
* <li>内容摘要: 包括模块、函数及其功能的说明</li>
* <li>完成日期:2013-10-27</li>
* <li>所属作者:boonyachengdu@gmail.com</li>
* <li>修改记录1:下午04:55:55,修改内容描述</li>
*
*/
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<User> 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<User> 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<User> userList = new ArrayList<User>();
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<User> 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<T>分页只是最简单的一种封装方式,后面需要详细地了解,另外整个数据访问只包含一个数据库session访问,所以不用关闭该session,若是单个的session需要用完即对其进行关闭,释放资源占用。