今天想用jfinal数据库的功能,但是我不想启动web服务器,有没有什么办法能够在本地执行jfinal的数据库功能呢?
答案是肯定的。
jfinal给的教程是这样的,在插件里面加上对数据库的支持:
@Override
public void configPlugin(Plugins me) {
C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://localhost/transportSafe", "root", "root");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
arp.addMapping("user_", User.class);
}
依次类推,我在测试类的main方法中这样写:
public static void main(String[] args) {
C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://localhost/transportSafe", "root", "root");
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
arp.addMapping("user_", User.class);
List<User> users = User.dao.find("select * from user_");
for (User u : users) {
System.out.println(u.getStr("id") + "=" + u.getStr("name"));
}
}
很不幸,程序报空指针异常。
简单的看了下,ActiveRecordPlugin和C3p0Plugin这2个类的构造方法:
public C3p0Plugin(String jdbcUrl, String user, String password) {
this.jdbcUrl = jdbcUrl;
this.user = user;
this.password = password;
}
public ActiveRecordPlugin(IDataSourceProvider dataSourceProvider) {
ActiveRecordPlugin.dataSourceProvider = dataSourceProvider;
}
很明显,这2个构造方法仅仅只做了对类属性的赋值操作而已,连对象都没new出来,必定会报空指针异常。
还好这两个类的方法不多,里面初始化变量的操作都在start()方法里面完成,于是,正确操作如下:
public static void main(String[] args) {
C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://localhost/safe", "root", "root");
cp.start();
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
arp.start();
arp.addMapping("driver", Driver.class);
List<Driver> drivers = Driver.dao.find("select * from driver limit 0,20");
for(Driver d:drivers){
Set<Entry<String, Object>> set = d.getAttrsEntrySet();
Iterator<Entry<String, Object>> it = set.iterator();
System.out.println("=================");
while(it.hasNext()){
Entry<String, Object> next = it.next();
System.out.println(next.getKey()+":"+next.getValue());
}
System.out.println("=================");
}
}
到此,数据如期的查出来了。