Search in sources :

Example 6 with Dao

use of org.nutz.dao.Dao in project nutz by nutzam.

the class DaoUpTest method test_pojo.

/**
     * 2. 带Pojo的基本操作,单表无操作
     */
@Test
public void test_pojo() {
    // 首先,得到Dao实例, 同理, 已经初始化好了的
    // 因为
    Dao dao = DaoUp.me().dao();
    // 关于SimplePojo, 请务必打开看一眼哦
    // 这个类同时标注了@Id和@Name,自动建表时以@Id作为主键,@Name作为唯一键
    // 强制建表
    // 真实代码可别写true,被删表了别找我!!!
    dao.create(SimplePojo.class, true);
    // 先生成个随机字符串帮助实例, R是nutz内部的随机数相关的帮助类,有UUID, UU32, UU64等很多东西哦
    // 代表一个字符串长度为10的随机字符串生成器
    StringGenerator sg = R.sg(10);
    // 插入几条记录
    for (int i = 0; i < 100; i++) {
        // 如果用的是Oracle数据库死在这里了,请加上druid,使其用上连接池.
        dao.insert(new SimplePojo(sg.next(), "http://www." + sg.next() + ".cn", R.random(10, 100)));
    }
    // 统计一下,应该是100条
    assertEquals(100, dao.count(SimplePojo.class));
    // 批量插入1000条吧
    List<SimplePojo> list = new ArrayList<SimplePojo>();
    for (int i = 0; i < 100; i++) {
        list.add(new SimplePojo(sg.next(), "http://www." + sg.next() + ".cn", R.random(10, 100)));
    }
    // 注意, list里面的对象必须是同一个类型哦
    dao.fastInsert(list);
    // fastInsert的特点是快,但不会执行@Prev和@Next, 也不会取回生成的主键哦,有得有失嘛
    // 看看大于45岁的有多少人,虽然理论上是一半一半,事实上经常不是这样...
    int re = dao.count(SimplePojo.class, Cnd.where("age", ">", 45));
    log.infof("older than 45y : %d", re);
    // 分页查询,跟无Pojo时的操作差不多
    List<SimplePojo> pojos = dao.query(SimplePojo.class, Cnd.where("age", ">", 45), dao.createPager(2, 10));
    // 肯定小于等于10
    log.infof("size=%d", pojos.size());
    // 更新操作
    // 不加参数的话,就是取出第一条记录了
    SimplePojo pojo = dao.fetch(SimplePojo.class);
    // 肯定不为null啦
    assertNotNull(pojo);
    // nutzbook是一本很值得看的nutz书哦
    pojo.setWebsite("http://nutzbook.wendal.net");
    // 只需要更新website, 如果全部属性都更新就 dao.update(pojo, null)
    dao.update(pojo, "website");
    // 检查一下是不是真的变成nutzbook的网址了
    assertEquals("http://nutzbook.wendal.net", dao.fetch(SimplePojo.class, pojo.getId()).getWebsite());
    // 现在, 随便删掉一条记录
    // 传入的是数值,所以SimplePojo必须有个@Id的属性
    dao.delete(SimplePojo.class, 20);
    // 肯定删了,或者根本没有,呵呵
    assertNull(dao.fetch(SimplePojo.class, 20));
    // 再根据name删掉一条
    // 传入的是字符串,所以SimplePojo必须有个@Name
    dao.delete(SimplePojo.class, pojo.getName());
    assertNull(dao.fetch(SimplePojo.class, pojo.getName()));
    // delete方法时删除单条记录,而批量呢? clear方法
    // 开始大开杀戒
    // 删掉所有id小于20的记录,哈哈
    dao.clear(SimplePojo.class, Cnd.where("id", "<", 20));
    // 统计一下20以内的记录,应该是0哦
    assertEquals(0, dao.count(SimplePojo.class, Cnd.where("id", "<", 20)));
    // 现在,让id大于50的记录的website通通变成nutzbook,哈哈哈
    int count = dao.update(SimplePojo.class, Chain.make("website", "http://nutzbook.wendal.net").add("createTime", new Date()), Cnd.where("id", ">", 50));
    assertEquals(count, dao.count(SimplePojo.class, Cnd.where("id", ">", 50).and("website", "=", "http://nutzbook.wendal.net")));
    // 请留意一下Cnd和Chain的链式写法
    // 按某人的建议, 查询一下id大于30或者website为nutzbook且name包含a的记录
    // 翻译成伪sql就是  where id > 300 or (website like "%nutzbook%" and name like "%a%")
    int size = dao.count(SimplePojo.class, Cnd.where("id", ">", 300).or(Cnd.exps("website", "like", "%nutzbook%").and("name", "like", "%a%")));
    assertTrue(size > 0);
    // sql 输出类似于
    // SELECT COUNT(*) FROM t_test_simple_pojo  WHERE id>300 OR (website LIKE '%nutzbook%' AND name LIKE '%a%')
    // 关于日志中的sql, 特别说明一下, nutz真正执行的sql是
    /**
         * SELECT COUNT(*) FROM t_test_simple_pojo  WHERE id>? OR (website LIKE ? AND name LIKE ?)
         */
    // 即PreparedStatement, 参数都是以安全的方式传输.
    // 而日志中带上参数的以"For example"提示的sql是用于显示的,并非真正执行的sql
    // 好了, happy完了,全杀
    dao.clear(SimplePojo.class, null);
}
Also used : Dao(org.nutz.dao.Dao) StringGenerator(org.nutz.lang.random.StringGenerator) ArrayList(java.util.ArrayList) SimplePojo(org.nutz.dao.util.meta.SimplePojo) Date(java.util.Date) Test(org.junit.Test)

Example 7 with Dao

use of org.nutz.dao.Dao in project druid by alibaba.

the class NutzTransactionTest method test_trans.

public void test_trans() throws Exception {
    Dao dao = new NutDao(dataSource);
    dao.clear("test");
    // doTran1(dao);
    doTran2(dao);
}
Also used : NutDao(org.nutz.dao.impl.NutDao) Dao(org.nutz.dao.Dao) NutDao(org.nutz.dao.impl.NutDao)

Example 8 with Dao

use of org.nutz.dao.Dao in project nutz by nutzam.

the class MainSetup method init.

public void init(NutConfig nc) {
    Ioc ioc = nc.getIoc();
    Dao dao = ioc.get(Dao.class);
    Daos.createTablesInPackage(dao, getClass(), false);
    if (0 == dao.count(User.class)) {
        User user = new User();
        user.setName("admin");
        user.setSalt(R.UU32());
        user.setPassword(Lang.digest("SHA-256", user.getSalt() + "123456"));
        dao.insert(user);
    }
}
Also used : Dao(org.nutz.dao.Dao) User(net.wendal.nutzdemo.bean.User) Ioc(org.nutz.ioc.Ioc)

Example 9 with Dao

use of org.nutz.dao.Dao in project nutz by nutzam.

the class DaoUpTest method test_without_pojo.

/**
     * 1. 不使用pojo类,直接操作数据库, Chain插入,查询结果为Record(一个实现了Map接口的增强版LinkedHashMap).<p/>
     * 在nutz 1.b.38之后,均可使用类Map对象进行CRUD.<p/>
     * Chain代表插入/更新时的目标值K-V<p/>
     * Record是查询的返回类型,增强版的忽略大小写的LinkedHaskMap
     */
@Test
public // 提醒一句,下面的assert均为Junit的方法
void test_without_pojo() {
    // 首先,得到Dao实例, 因为Junit的规则就是setUp先执行,所以Dao已经初始化好了
    // me()是public静态方法,意味着你可以从任何代码访问到哦
    Dao dao = DaoUp.me().dao();
    // 弱弱地定义个表名方便操作
    String tableName = "tx_daoup_user";
    // 看看有无tx_text_user表,有的话就删掉好了
    if (dao.exists(tableName)) {
        // 没有openSession之类的事
        // 生产环境可别乱调用,死人了别找我
        dao.drop(tableName);
    }
    // 好了,现在开始建表, 其中的Sqls是Nutz中的自定义SQL的帮助类, 具体用法后面还有讲解
    // 为了最大兼容各种数据库,这里就建3个属性,不自增,没默认值
    // 如果您测试的数据库不支持下面的建表sql,自己改一下吧,呵呵.
    dao.execute(Sqls.create("create table " + tableName + " (id int, nm varchar(50), age int)"));
    // 首先,插入4条记录, 不抛异常就是执行成功(Dao接口的方法均如此)
    dao.insert(tableName, Chain.make("id", 1).add("nm", "wendal").add("age", 30));
    dao.insert(tableName, Chain.make("id", 2).add("nm", "zozoh").add("age", 60));
    dao.insert(tableName, Chain.make("id", 3).add("nm", "pangwu").add("age", 20));
    dao.insert(tableName, Chain.make("id", 4).add("nm", "ywjno").add("age", 10));
    // 我们统计一下是不是真的4条呢?
    //count方法可以查Pojo所代表的表,也可以直接写表名
    assertEquals(4, dao.count(tableName));
    // 类似的方法还有fetch/query/clear等
    // ------------------
    // --------- query操作
    // 现在查一下小于25,且按nm降序
    // Cnd是最常用的查询构建类
    List<Record> users = dao.query(tableName, Cnd.where("age", "<", 25).desc("nm"));
    // 理应是2个人
    // 忍不住提醒一句啊, 统计总数用dao.count, 因为真的有人这样写: return dao.query(XXX.class, Cnd....).size();
    assertEquals(2, users.size());
    // 因为是倒序,那第一个就是ywjno,第二个是pangwu.
    // 注意一下Record里面的key都是自动转为小写的,但值不会,这个可以放心.
    // ywjno就是冬日温泉,nutz的其中一位commiter
    assertEquals("ywjno", users.get(0).getString("nm"));
    // pangwu,胖五也, 也是commiter
    assertEquals("pangwu", users.get(1).getString("nm"));
    // 查大于15岁,且第二页,每页2条记录, 注意页数是从1开始的,若填了0,就不分页,全部记录
    users = dao.query(tableName, Cnd.where("age", ">", 15), dao.createPager(2, 2));
    // 因为大于15岁的只有3个人,又分页,所以结果应该是只有第3条记录
    assertEquals(1, users.size());
    // ^|_|^ ...
    assertEquals("pangwu", users.get(0).get("nm"));
    // --------------------------
    // --------- update和fetch操作
    //现在, 我们更新wendal的年龄,使其变成26,啊啊啊
    dao.update(tableName, Chain.make("age", 26), Cnd.where("nm", "=", "wendal"));
    // Chain是链式的可以继续接下去哦
    // Chain.make(....).add(...).add(...)
    // 或者从一个Map/Pojo转化而来 Chain.from(xxxMap) Chain.from(obj)
    // 检查一下wendal的年龄,应该是26
    assertEquals(26, dao.fetch(tableName, Cnd.where("nm", "=", "wendal")).getInt("age"));
    // 然后让pangwu老一岁,注意是用makeSpecial,而且值是特殊的+1
    dao.update(tableName, Chain.makeSpecial("age", "+1"), Cnd.where("nm", "=", "pangwu"));
    // 同样要检查一下pangwu的年龄是不是变成 20+1=21岁了
    assertEquals(21, dao.fetch(tableName, Cnd.where("nm", "=", "pangwu")).getInt("age"));
    // 再大发慈悲,让zozoh年轻10岁吧.
    dao.update(tableName, Chain.makeSpecial("age", "age-10"), Cnd.where("nm", "=", "zozoh"));
    // 同样要检查一下zozoh的年龄是不是变成 60-10=50岁了
    assertEquals(50, dao.fetch(tableName, Cnd.where("nm", "=", "zozoh")).getInt("age"));
    // 为了表达我的博爱,全部人减5岁!!
    // 提示一下, makeSpecial属于直接拼入sql, 请留意注入问题.
    dao.update(tableName, Chain.makeSpecial("age", "age-5"), null);
    // ----------------------
    // 最后是delete和clear操作,然而delete是针对单个pojo对象删除的,所以这里只演示clear
    // 首先,我们删掉zozoh,原因嘛, 没你帅/漂亮.
    dao.clear(tableName, Cnd.where("nm", "=", "zozoh"));
    // 应剩下3条记录
    assertEquals(3, dao.count(tableName));
    // 现在再干掉年龄少于20岁的
    dao.clear(tableName, Cnd.where("age", "<", 20));
    // 应剩下1条记录
    assertEquals(1, dao.count(tableName));
    // 最后,全部杀光, 啊啊啊, 减少人口啊啊啊...
    dao.clear(tableName);
    // 应剩下0条记录, 没人了...
    assertEquals(0, dao.count(tableName));
    // 最后的最后,人在表在, 人没了,表也干掉
    // 三思三思... 
    dao.drop(tableName);
}
Also used : Dao(org.nutz.dao.Dao) Record(org.nutz.dao.entity.Record) Test(org.junit.Test)

Example 10 with Dao

use of org.nutz.dao.Dao in project nutz by nutzam.

the class SimpleDaoTest method test_insert_with_id.

@Test
public void test_insert_with_id() {
    if (dao.meta().isSqlServer())
        return;
    dao.clear(Pet.class);
    Pet pet = Pet.create("zzz");
    // 主动设置id
    pet.setId(9090);
    Dao dao = Daos.ext(this.dao, FieldFilter.create(Pet.class, FieldMatcher.make(null, null, true).setIgnoreId(false)));
    dao.fastInsert(pet);
    // 只有一条记录
    pet = dao.fetch(Pet.class);
    assertEquals(9090, pet.getId());
    // / 然后用1.b.53的新方法测试一下
    if (dao.meta().isPostgresql()) {
        System.out.println("因为Pet的@Id配置了@Next,导致插入后再执行里面的sql会报错");
        // 还没想到怎么解决, FieldMatcher存在的时候忽略@Next?
        return;
    }
    dao.clear(Pet.class);
    pet = Pet.create("zzz");
    // 主动设置id
    pet.setId(9090);
    dao.insert(pet, FieldFilter.create(Pet.class, FieldMatcher.create(false)));
    // 只有一条记录
    pet = dao.fetch(Pet.class);
    assertEquals(9090, pet.getId());
}
Also used : NutDao(org.nutz.dao.impl.NutDao) Dao(org.nutz.dao.Dao) Issue1163Pet(org.nutz.dao.test.meta.issue1163.Issue1163Pet) Pet(org.nutz.dao.test.meta.Pet) Test(org.junit.Test)

Aggregations

Dao (org.nutz.dao.Dao)11 Test (org.junit.Test)8 Connection (java.sql.Connection)3 SQLException (java.sql.SQLException)3 Record (org.nutz.dao.entity.Record)3 NutDao (org.nutz.dao.impl.NutDao)3 Sql (org.nutz.dao.sql.Sql)3 SystemUser (org.nutz.dao.util.meta.SystemUser)3 ResultSet (java.sql.ResultSet)2 ArrayList (java.util.ArrayList)2 SystemTeam (org.nutz.dao.util.meta.SystemTeam)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 Date (java.util.Date)1 DataSource (javax.sql.DataSource)1 User (net.wendal.nutzdemo.bean.User)1 LibraryException (org.ansj.exception.LibraryException)1 ConnCallback (org.nutz.dao.ConnCallback)1 SimpleDataSource (org.nutz.dao.impl.SimpleDataSource)1