在Jorm中使用最多的操作就是使用Session来实现对数据的CRUD操作,因为使用session才更符合JORM的设计编程的标准。在Hibernate中也是使用session来管理数据库操作的,这一点Jorm和Hibernate极为相似。我前几天就因为这个session的存储过程调用和函数调用而卡壳了,所以今天特别在这里写出,姑且记之于此,待来者阅览。
1、编写存储过程和函数
//存储过程
DROP PROCEDURE IF EXISTS count_has_same_name_proc;
CREATE PROCEDURE count_has_same_name_proc (xname VARCHAR(50 ) )
BEGIN
SELECT COUNT(* ) FROM t_user WHERE name like xname;
END;
//函数
DROP FUNCTION IF EXISTS count_has_same_name_func;
CREATE FUNCTION count_has_same_name_func ( xname VARCHAR(50 ) )
RETURNS INT
BEGIN
DECLARE s INT ;
SELECT COUNT(id ) into s FROM t_user WHERE name like xname;
RETURN s;
END;
2、编写需要的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;
}
}
3、Session的存储过程和函数调用的单元测试用例
package com.boonya.jorm.test;
import java.sql.SQLException;
import java.util.List;
import junit.framework.Assert;
import org.javaclub.jorm.Session;
import org.javaclub.jorm.jdbc.JdbcException;
import org.javaclub.jorm.jdbc.callable.ProcedureCaller;
import org.junit.Test;
import com.boonya.jorm.entity.User;
import com.boonya.jorm.service.utils.LogManager;
import com.boonya.jorm.service.utils.SessionManager;
import com.mysql.jdbc.CallableStatement;
import com.mysql.jdbc.ResultSet;
public class SessionTest
{
@Test
public void session(){
Session session=SessionManager.getInstance();
Assert.assertNotNull("Session:会话不为空",session);
}
@Test
public void getFirtUser()
{
int minId = 50;
String sql = " SELECT * FROM t_user WHERE id > ?";
Session session = SessionManager.getInstance();
User user = session.loadFirst(User.class, sql, minId);
Assert.assertNotNull("符合条件的第一个用户:", user);
}
@Test
public void deleteBetweenIds()
{
int startId = 97, endId = 100;
Session session = SessionManager.getInstance();
boolean flag = false;
session.beginTransaction();
try
{
session.delete(User.class, " id > " + startId + " and id < " + endId);
flag = true;
session.commit();
} catch (JdbcException e)
{
LogManager.setLog("区间ID删除:失败!", e);
} finally
{
session.endTransaction();
}
Assert.assertTrue("区间ID删除:成功", flag);
}
@Test
public void getNameList()
{
String sql = "SELECT name FROM t_user WHERE id > ? ";
Session session = SessionManager.getInstance();
List<String> names = session.list(String.class, sql, 10);
System.out.println(names == null ? "列表为空" : "列表长度:" + names.size());
}
@Test
public void sessionTransaction()
{
Session session = SessionManager.getInstance();
session.beginTransaction();
try
{
User user = new User("peng", "male", 24, "UI designer");
session.save(user);
session.commit();
} catch (Exception e)
{
LogManager.setLog("事务添加用户:失败!", e);
session.rollback();
} finally
{
session.endTransaction();
}
}
@Test
public void procedure()
{
final String pro = "call count_has_same_name_proc(?)";
final Session session = SessionManager.getInstance();
String res = session.call(new ProcedureCaller()
{
@Override
public CallableStatement prepare() throws SQLException
{
CallableStatement cs = (CallableStatement) getSession().getConnection().prepareCall(pro);
cs.setString(1, "boonya");
return cs;
}
@Override
public Object callback(java.sql.CallableStatement cs) throws SQLException
{
ResultSet rs = (ResultSet) cs.executeQuery();
Assert.assertNotNull("procedure:resultset", rs);
while (rs.next())
{
int count = rs.getInt(1);
System.out.println("procedure:统计同名用户结果:" + count);
}
return rs;
}
});
System.out.println(res);
}
@Test
public void function()
{
final String pro = "select count_has_same_name_func(?)";
final Session session = SessionManager.getInstance();
String res = session.call(new ProcedureCaller()
{
@Override
public CallableStatement prepare() throws SQLException
{
CallableStatement cs = (CallableStatement) getSession().getConnection().prepareCall(pro);
cs.setString(1, "boonya");
return cs;
}
@Override
public Object callback(java.sql.CallableStatement cs) throws SQLException
{
ResultSet rs = (ResultSet) cs.executeQuery();
Assert.assertNotNull("function:resultset", rs);
while (rs.next())
{
int count = rs.getInt(1);
System.out.println("function:统计同名用户结果:" + count);
}
return rs.toString();
}
});
System.out.println(res);
}
}
注:被误导的调用写法:pro="{? = call hello_proc(?)}";可以理解该coder是将此当做对象来查,然后将查询结果赋值给一个缺省的数据类型来存储,但是这样是调用不成功的。可以在sql语句中添加"{}" ,应该这样写:"{ call hello_proc(?)}"。
这个在开源中国上可以找得到的,地址:
http://www.oschina.net/p/gerald-jorm