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);
}
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);
}
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);
}
}
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);
}
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());
}
Aggregations