这次我们来学习一下JFinal访问数据库的支持,首先创建一个数据库表:
CREATE DATABASE TEST
CREATE TABLE user(
id int primary key,
name
varchar(20) ,
sex varchar(5),
ago int
);
insert into user values(1,'liuwei','man',22);
insert into user values(2,'gaoyanjun','woman',20);
insert into user values(3,'yuanmengzhou','woman',20);
insert into user values(4,'wangdan','woman',22);
1、首先我们先来学习一下Model类的使用。
一开始看到Model 我就先入为主的认为是类似JavaBean的承载数据的实体类,但深入了解之后发现不是的,我发现它比实体类更加的灵活,但又没有JDBC的代码冗余度那么高。(本来以为只需要用Java工程就够了,但发现配置ConfigClass只能通过web.xml)可以返回数据的我总结有三种:返回单独字段的值,返回一条记录的Map键值对
a)第一步配置JFinalConfig:
@Override
public void configPlugin(Plugins me) {
//添加一个C3p0数据源插件
C3p0Plugin cp = new C3p0Plugin("jdbc:mysql://127.1.1.1/test","root", "");
me.add(cp);
//创建ActiveRecordPlugin插件并添加到项目
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
//将表名和Model类做映射
arp.addMapping("user", User.class);
}
b)使用Model
创建Model
package cn.edu.sdnu.liuwei.jfinal.model;
import java.util.Map;
import com.jfinal.plugin.activerecord.Model;
public class User extends Model<User>{
private static final long serialVersionUID = 1L;
//饿汉式单例模式--注意,这个dao是用于访问数据库的,而非承载数据。
private static final User dao = new User();
public static User getDao(){
return dao;
}
}
然后重新回顾一下web层的使用:
①创建Controller类,添加测试方法
public class DaoController extends Controller {
public void getData(){
int id = getParaToInt("id");
String name = User.getDao().findById(id).getStr("name");
renderText(name);
}
}
②在Config中配置路由
me.add("/dao",DaoController.class);
③部署并运行,提示:我们这是在测试其中一种获取数据库数据的方法,返回单个字段的形式
访问http://localhost:8080/LearnJFinal/dao/getData?id=2
成功返回,没有报错
④我们来看一下剩下两种访问方法:
在DaoController类中添加getData2方法:
public void getData2(){
int id = getParaToInt("id");
Map<String, Object> res = User.getDao().getAttr(id);
renderText("" + res);
}
//User类中代码实现:
//测试通过的第二种方法
public Map<String,Object> getAttr(int id){
//getAttrs()方法是protected的,外界不可调用,只能封装于Model类中。
return dao.findById(id).getAttrs();
}
然后部署访问
精彩了,如果我们使用renderJson(String )方法呢:
⑤我们尝试第三种:通过SQL
public List<User> getList(){
return find("select * from user");
}
访问之后,成功返回所有数据:
如果我们要做WebService 返回Json数据怎么办呢?
我们可以尝试这种方式:
a、使用Gson框架:摘自笔者编写的Gson工具类
/**
* 将以键值对的方式存在Map中的数据转换为Json
* @param map
* @return 如果转换成功,返回Json,转换失败,返回空
*/
public static String mapToJson(Map<String,Object> map){
Type type = new TypeToken<Map<String,Object>>(){}.getType();
String json = null;
try {
json = gson.toJson(map, type);
} catch (Exception e) {}
return json;
}
b、修改User的toString方法:
@Override
public String toString() {
//我们尝试重写toString方法
return GsonUtil.mapToJson(getAttrs());
}
List的toString()方法正好符合Json格式,天助我,嘎嘎
c、编写Controller:
public void getData3(){
// renderText(""+User.getDao().getList());
List<User> list = User.getDao().getList();
renderText(""+list);
}
d、部署代码,访问:
[
{
"id": 1,
"sex": "man",
"name": "liuwei",
"ago": 22
},
{
"id": 2,
"sex": "woman",
"name": "gaoyanjun",
"ago": 20
},
{
"id": 3,
"sex": "woman",
"name": "yuanmengzhou",
"ago": 20
},
{
"id": 4,
"sex": "woman",
"name": "wangdan",
"ago": 22
}
]
通过校验。
2、好,我们再看看增删改:
①增:
public void save() {
boolean bool = new User().set("id", getParaToInt("id"))
.set("name", getPara("name")).set("sex", getPara("sex"))
.set("ago", getPara("ago")).save();
renderText("" + bool);
}
②删:
public void delete(){
User.getDao().deleteById(2);
}
③改:
public void update(){
User.getDao().findById(1).set("ago", 222).update();
renderText(""+User.getDao().findById(1));
}