Search in sources :

Example 1 with Record

use of org.nutz.dao.entity.Record in project nutz by nutzam.

the class SimpleDaoExecTest method test_exec_out.

@Test
public void test_exec_out() {
    if (!dao.meta().isMySql())
        // Only test for mysql now
        return;
    dao.create(Pet.class, true);
    dao.insert(Pet.create("wendal"));
    Pet pet = dao.fetch(Pet.class, "wendal");
    dao.execute(Sqls.create("DROP PROCEDURE IF EXISTS proc_pet_fetch"));
    dao.execute(Sqls.create("CREATE PROCEDURE proc_pet_fetch(IN nm varchar(1024), OUT outId int)\nBEGIN\n\tselect id into outId from t_pet where name=nm;\nEND"));
    // 像普通自定义SQL那样创建SQL对象.
    Sql sql = Sqls.create("CALL proc_pet_fetch(@nm, @OUTid)");
    sql.setEntity(dao.getEntity(Pet.class));
    // 设置入参
    sql.params().set("nm", "wendal");
    // 设置出参类型,注意,必须加OUT开头
    sql.params().set("OUTid", Types.INTEGER);
    dao.execute(sql);
    Record re = sql.getOutParams();
    assertNotNull(re);
    assertEquals(pet.getId(), re.get("id"));
}
Also used : Record(org.nutz.dao.entity.Record) Pet(org.nutz.dao.test.meta.Pet) Sql(org.nutz.dao.sql.Sql) Test(org.junit.Test)

Example 2 with Record

use of org.nutz.dao.entity.Record in project nutz by nutzam.

the class NutDaoExecutor method _runExec.

// 执行存储过程,简单实现
protected void _runExec(Connection conn, DaoStatement st) throws SQLException {
    if (st.getContext().getPager() != null) {
        throw Lang.makeThrow(DaoException.class, "NOT Pageable : " + st);
    }
    // 打印调试信息
    String sql = st.toPreparedStatement();
    if (log.isDebugEnabled())
        log.debug(sql);
    Object[][] paramMatrix = st.getParamMatrix();
    CallableStatement stmt = null;
    ResultSet rs = null;
    try {
        stmt = conn.prepareCall(sql);
        ValueAdaptor[] adaptors = st.getAdaptors();
        HashMap<Integer, OutParam> outParams = new HashMap<Integer, OutParam>();
        if (st instanceof Sql) {
            VarIndex varIndex = ((Sql) st).paramIndex();
            VarSet varSet = ((Sql) st).params();
            for (int i = 0; i < varIndex.size(); i++) {
                String name = varIndex.getOrderName(i);
                if (name.startsWith("OUT") && varSet.get(name).getClass() == Integer.class) {
                    Integer t = (Integer) varSet.get(name);
                    outParams.put(i, new OutParam(name, t));
                }
            }
        }
        // 创建语句并设置参数
        if (paramMatrix != null && paramMatrix.length > 0) {
            PreparedStatement pst = (PreparedStatement) stmt;
            Object[] pm = paramMatrix[0];
            for (int i = 0; i < pm.length; i++) {
                OutParam outParam = outParams.get(i);
                if (outParam == null)
                    adaptors[i].set(pst, pm[i], i + 1);
                else
                    stmt.registerOutParameter(i + 1, outParam.jdbcType);
            }
        }
        stmt.execute();
        if (outParams.size() > 0) {
            Record r = Record.create();
            for (Entry<Integer, OutParam> en : outParams.entrySet()) {
                OutParam outParam = en.getValue();
                int jdbcIndex = en.getKey() + 1;
                Object value;
                switch(outParam.jdbcType) {
                    case Types.INTEGER:
                        value = stmt.getInt(jdbcIndex);
                        break;
                    case Types.TIMESTAMP:
                        value = stmt.getTimestamp(jdbcIndex);
                        break;
                    case Types.CLOB:
                        value = stmt.getString(jdbcIndex);
                        break;
                    case Types.DATE:
                        value = stmt.getDate(jdbcIndex);
                        break;
                    default:
                        value = stmt.getObject(jdbcIndex);
                        break;
                }
                r.set(outParam.name.substring(3), value);
            }
            st.getContext().attr("OUT", r);
        }
        //先尝试读取第一个,并调用一次回调
        rs = stmt.getResultSet();
        try {
            st.onAfter(conn, rs, null);
        } finally {
            if (rs != null)
                rs.close();
        }
        while (true) {
            if (stmt.getMoreResults()) {
                rs = stmt.getResultSet();
                try {
                    if (rs != null)
                        st.onAfter(conn, rs, null);
                } finally {
                    if (rs != null)
                        rs.close();
                }
            }
            break;
        }
    } finally {
        if (stmt != null)
            stmt.close();
    }
}
Also used : HashMap(java.util.HashMap) ValueAdaptor(org.nutz.dao.jdbc.ValueAdaptor) VarIndex(org.nutz.dao.sql.VarIndex) PreparedStatement(java.sql.PreparedStatement) Sql(org.nutz.dao.sql.Sql) CallableStatement(java.sql.CallableStatement) VarSet(org.nutz.dao.sql.VarSet) ResultSet(java.sql.ResultSet) Record(org.nutz.dao.entity.Record)

Example 3 with Record

use of org.nutz.dao.entity.Record in project nutz by nutzam.

the class DaoUpTest method test_sql.

/**
     * 自定义SQL, 解决绝大部分Dao接口无法满足你的sql调用
     */
@Test
public void test_sql() {
    // 不再啰嗦, 不然你也烦了..
    Dao dao = DaoUp.me().dao();
    // 首先,我们用前一个test的pojo建表
    dao.create(SystemUser.class, true);
    dao.create(SystemTeam.class, true);
    // 建1个用户,一个Team
    SystemUser user = new SystemUser();
    user.setName("wendal");
    SystemTeam team = new SystemTeam();
    team.setName("root");
    user.setTeam(team);
    dao.insertWith(user, "team");
    // Dao接口大部分操作都生成单表SQL, 除了@ManyMany.
    // 所以很多人觉得@One也查2次很浪费啊, 那这里写一条
    String str = "select u.*,t.* from $user_table u INNER JOIN $team_table t ON u.t_id = t.id where u.nm=@name";
    // 创建一个自定义Sql对象, 还有各种形式哦
    Sql sql = Sqls.create(str);
    // $开头的是变量,会直接拼入sql哦
    sql.vars().set("user_table", dao.getEntity(SystemUser.class).getTableName());
    // 同上
    sql.vars().set("team_table", dao.getEntity(SystemTeam.class).getTableName());
    // @开头的是参数, 会变成问号哦
    sql.params().set("name", "wendal");
    // Sqls.callback提供N种常用的回调,你需要的一般都在里面了
    sql.setCallback(Sqls.callback.record());
    // 注意, execute是没有返回值的, 所需要的值都通过callback来获取
    dao.execute(sql);
    // 不抛出异常就是执行成功
    //Sqls.callback.record()的返回值就是Record
    Record record = sql.getObject(Record.class);
    // 从Record还原出Pojo来
    SystemUser u = record.toEntity(dao.getEntity(SystemUser.class), "u.");
    assertNotNull(u);
    SystemTeam t = record.toEntity(dao.getEntity(SystemTeam.class), "t.");
    assertNotNull(t);
    u.setTeam(t);
}
Also used : Dao(org.nutz.dao.Dao) SystemUser(org.nutz.dao.util.meta.SystemUser) Record(org.nutz.dao.entity.Record) SystemTeam(org.nutz.dao.util.meta.SystemTeam) Sql(org.nutz.dao.sql.Sql) Test(org.junit.Test)

Example 4 with Record

use of org.nutz.dao.entity.Record in project nutz by nutzam.

the class QueryTest method test_record_to_entity.

@Test
public void test_record_to_entity() {
    if (dao.meta().isH2())
        // h2死活过不去啊
        return;
    dao.each(Pet.class, null, new Each<Pet>() {

        public void invoke(int index, Pet pet, int length) {
            pet.setNickName("AA_" + pet.getName().toUpperCase());
            // 不知道为啥h2数据库会抛出表不存在的异常
            dao.update(pet);
        }
    });
    Entity<Pet> en = dao.getEntity(Pet.class);
    Sql sql = Sqls.queryRecord("SELECT * FROM t_pet");
    dao.execute(sql);
    List<Record> recs = sql.getList(Record.class);
    Pet[] pets = new Pet[recs.size()];
    int i = 0;
    for (Record rec : recs) pets[i++] = rec.toEntity(en);
    for (Pet pet : pets) assertEquals("AA_" + pet.getName().toUpperCase(), pet.getNickName());
}
Also used : Record(org.nutz.dao.entity.Record) Pet(org.nutz.dao.test.meta.Pet) Sql(org.nutz.dao.sql.Sql) Test(org.junit.Test)

Example 5 with Record

use of org.nutz.dao.entity.Record in project nutz by nutzam.

the class QueryTest method fetch_record.

@Test
public void fetch_record() {
    Record re = dao.fetch("t_pet", Cnd.where("name", "=", "pet3"));
    if (dao.meta().isOracle())
        re.remove("rn");
    if (dao.meta().isSqlServer()) {
        re.remove("__rn__");
        re.remove("__tc__");
    }
    System.out.println(re.keySet());
    Pet pet = re.toPojo(Pet.class);
    assertEquals(7, re.getColumnCount());
    assertEquals(4, pet.getId());
    assertEquals("pet3", pet.getName());
    dao.create(Pet.class, true);
    dao.insert(Pet.create("中文啊中文"));
}
Also used : Record(org.nutz.dao.entity.Record) Pet(org.nutz.dao.test.meta.Pet) Test(org.junit.Test)

Aggregations

Record (org.nutz.dao.entity.Record)11 Test (org.junit.Test)10 Pet (org.nutz.dao.test.meta.Pet)5 Sql (org.nutz.dao.sql.Sql)4 Dao (org.nutz.dao.Dao)3 HashMap (java.util.HashMap)2 CallableStatement (java.sql.CallableStatement)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 Timestamp (java.sql.Timestamp)1 TreeMap (java.util.TreeMap)1 ValueAdaptor (org.nutz.dao.jdbc.ValueAdaptor)1 VarIndex (org.nutz.dao.sql.VarIndex)1 VarSet (org.nutz.dao.sql.VarSet)1 Issue1163Pet (org.nutz.dao.test.meta.issue1163.Issue1163Pet)1 SystemTeam (org.nutz.dao.util.meta.SystemTeam)1 SystemUser (org.nutz.dao.util.meta.SystemUser)1 NutType (org.nutz.lang.util.NutType)1