xUtils 里的DbUtils使用心得

2019-10-15 05:53:20

这篇转载的文章有我对xUtils3操作数据库新学到的一些东西。

1.为两个字段设置索引
    

  1. @Table(name = "parent", onCreated = "CREATE UNIQUE INDEX index_name ON parent(name,email)")//自定义表名,并且设置两个字段为索引,如果不在此定义表名,则表的名字为包名_类名,并把.换成_


2.字段使用Date类型

    

  1. @Column(name = "time")

  2. private Date time;//可以使用java.util.date

  3. @Column(name = "date")

  4. private java.sql.Date date;//可以使用java.sql.date


3.可直接在类中写查询方法

public List<Child> getChildren(DbManager db) throws DbException {
        return db.selector(Child.class).where("parentId", "=", this.id).findAll();//一对多的查询
    }

4.可对字段设置索引保持唯一

  1. @Column(name = "parentId" /*, property = "UNIQUE"//如果是一对一加上唯一约束*/)

  2. private long parentId; // 外键表id

5.可忽略属性,只使用不存入数据库

  1. // 这个属性被忽略,不存入数据库

  2. private String willIgnore;

6.一对一,多对一查询

  1. public Parent getParent(DbManager db) throws DbException {

  2. //一对一,多对一查询

  3. return db.findById(Parent.class, parentId);

  4. }


以上具体参考文章 xUtils 里的DbUtils使用心得

使用xUtils做Android数据库开发非常简便和得心应手,而且它本身还支持很多查询功能,比如一对多,select count和自定义sql查询等,并且支持事务(默认关闭)


下面是官方sample给的代码和我的一些使用心得


首先是两个实体类,对应两张表,这两张表中有一对多的关系


首先是多方:


import org.xutils.DbManager;

import org.xutils.db.annotation.Column;

import org.xutils.db.annotation.Table;

import org.xutils.ex.DbException;

 

import java.util.Date;

import java.util.List;

 

/**

 * Author: wyouflf

 * Date: 13-7-25

 * Time: 下午7:06

 */

@Table(name = "parent", onCreated = "CREATE UNIQUE INDEX index_name ON parent(name,email)")//自定义表名,并且设置两个字段为索引,如果不在此定义表名,则表的名字为包名_类名,并把.换成_

public class Parent {

 

    @Column(name = "id", isId = true)//设置为主键

    private int id;

 

    @Column(name = "name")//列名和成员名一致

    public String name;

 

    @Column(name = "email")

    private String email;

 

    @Column(name = "isAdmin")

    private boolean isAdmin;

 

    @Column(name = "time")

    private Date time;//可以使用java.util.date

 

    @Column(name = "date")

    private java.sql.Date date;//可以使用java.sql.date

 

    public List<Child> getChildren(DbManager db) throws DbException {

        return db.selector(Child.class).where("parentId", "=", this.id).findAll();//一对多的查询

    }

 

    // 一对一的查询

    //public Child getChild(DbManager db) throws DbException {

    //    return db.selector(Child.class).where("parentId", "=", this.id).findFirst();

    //}

 

    //get set方法必须写

    public int getId() {

        return id;

    }

 

    public void setId(int id) {

        this.id = id;

    }

 

    public boolean isAdmin() {

        return isAdmin;

    }

 

    public void setAdmin(boolean admin) {

        isAdmin = admin;

    }

 

    public Date getTime() {

        return time;

    }

 

    public void setTime(Date time) {

        this.time = time;

    }

 

    public java.sql.Date getDate() {

        return date;

    }

 

    public void setDate(java.sql.Date date) {

        this.date = date;

    }

 

    public String getEmail() {

        return email;

    }

 

    public void setEmail(String email) {

        this.email = email;

    }

 

    @Override

    public String toString() {

        return "Parent{" +

                "id=" + id +

                ", name='" + name + '\'' +

                ", email='" + email + '\'' +

                ", isAdmin=" + isAdmin +

                ", time=" + time +

                ", date=" + date +

                '}';

    }

}

下面是单方:

import org.xutils.DbManager;

import org.xutils.db.annotation.Column;

import org.xutils.db.annotation.Table;

import org.xutils.ex.DbException;

 

/**

 * Author: wyouflf

 * Date: 13-7-29

 * Time: 下午5:04

 */

@Table(name = "child")

public class Child {

 

    @Column(name = "id", isId = true)

    private int id;

 

    @Column(name = "name")

    private String name;

 

    @Column(name = "email")

    private String email;

 

    @Column(name = "parentId" /*, property = "UNIQUE"//如果是一对一加上唯一约束*/)

    private long parentId; // 外键表id

 

    // 这个属性被忽略,不存入数据库

    private String willIgnore;

 

    @Column(name = "text")

    private String text;

 

    public Parent getParent(DbManager db) throws DbException {//一对一,多对一查询

        return db.findById(Parent.class, parentId);

    }

 

    public long getParentId() {

        return parentId;

    }

 

    public void setParentId(long parentId) {

        this.parentId = parentId;

    }

 

    public int getId() {

        return id;

    }

 

    public void setId(int id) {

        this.id = id;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public String getEmail() {

        return email;

    }

 

    public void setEmail(String email) {

        this.email = email;

    }

 

    public String getWillIgnore() {

        return willIgnore;

    }

 

    public void setWillIgnore(String willIgnore) {

        this.willIgnore = willIgnore;

    }

 

    public String getText() {

        return text;

    }

 

    public void setText(String text) {

        this.text = text;

    }

 

    @Override

    public String toString() {

        return "Child{" +

                "id=" + id +

                ", name='" + name + '\'' +

                ", email='" + email + '\'' +

                ", parentId=" + parentId +

                ", willIgnore='" + willIgnore + '\'' +

                ", text='" + text + '\'' +

                '}';

    }

}


然后是官方给出的简单应用

import android.view.View;

import android.widget.TextView;

 

import org.xutils.DbManager;

import org.xutils.db.table.DbModel;

import org.xutils.sample.db.Child;

import org.xutils.sample.db.Parent;

import org.xutils.view.annotation.ContentView;

import org.xutils.view.annotation.Event;

import org.xutils.view.annotation.ViewInject;

import org.xutils.x;

 

import java.io.File;

import java.util.Calendar;

import java.util.Date;

import java.util.List;

 

/**

 * Created by wyouflf on 15/11/4.

 */

@ContentView(R.layout.fragment_db)

public class DbFragment extends BaseFragment {

 

    //配置数据库基本信息

    DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()

            .setDbName("test")//设置数据库的名字

            .setDbDir(new File("/sdcard"))//设置数据库的存储路径

            .setDbVersion(2)//设置当前数据库的版本

            .setDbUpgradeListener(new DbManager.DbUpgradeListener() {//设置数据库更新监听器

                @Override

                public void onUpgrade(DbManager db, int oldVersion, int newVersion) {

                    // TODO: ...

                    // db.addColumn(...);//添加字段的操作

                    // db.dropTable(...);//删除表的操作

                    // ...

                }

            });

 

    @ViewInject(R.id.tv_db_result)

    private TextView tv_db_result;

 

    @Event(R.id.btn_test_db)

    private void onTestDbClick(View view) {

 

        // 一对多: (本示例的代码)

        // 自己在多的一方(child)保存另一方的(parentId), 查找的时候用parentId查parent或child.

        // 一对一:

        // 在任何一边保存另一边的Id并加上唯一属性: @Column(name = "parentId", property = "UNIQUE")

        // 多对多:

        // 再建一个关联表, 保存两边的id. 查询分两步: 先查关联表得到id, 再查对应表的属性.

 

        String temp = "";

 

        try {

 

            DbManager db = x.getDb(daoConfig);

 

            Child child = new Child();//多方

            child.setName("child's name");

 

            Parent test = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).findFirst();

            // long count = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).count();//查找符合条件的数据条数

            // Parent test = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findFirst();//查找符合条件的第一条数据

            if (test != null) {

                child.setParentId(test.getId());//给多方设置查询的限制条件

 

                temp += "first parent:" + test + "\n";//显示多方的查询结果

                tv_db_result.setText(temp);

            }

 

            Parent parent = new Parent();

            parent.name = "测试" + System.currentTimeMillis();

            parent.setAdmin(true);

            parent.setEmail("wyouflf@qq.com");

            parent.setTime(new Date());

            parent.setDate(new java.sql.Date(new Date().getTime()));

            db.save(parent);

 

            db.saveBindingId(child);//保存对象关联数据库生成的id

 

            List<Child> children = db.selector(Child.class).findAll();

            temp += "children size:" + children.size() + "\n";

            tv_db_result.setText(temp);

            if (children.size() > 0) {

                temp += "last children:" + children.get(children.size() - 1) + "\n";

                tv_db_result.setText(temp);

            }

 

            Calendar calendar = Calendar.getInstance();

            calendar.add(Calendar.DATE, -1);

            calendar.add(Calendar.HOUR, 3);

 

            List<Parent> list = db.selector(Parent.class)

                    .where("id", "<", 54)

                    .and("time", ">", calendar.getTime())//以java.util.date作为查询条件

                    .orderBy("id")

                    .limit(10).findAll();

            temp += "find parent size:" + list.size() + "\n";

            tv_db_result.setText(temp);

            if (list.size() > 0) {

                temp += "last parent:" + list.get(list.size() - 1) + "\n";

                tv_db_result.setText(temp);

            }

 

            //parent.name = "hahaha123";

            //db.update(parent);

 

            Parent entity = child.getParent(db);

            temp += "find by id:" + entity.toString() + "\n";

            tv_db_result.setText(temp);

 

            List<DbModel> dbModels = db.selector(Parent.class)//DbModel是个很有用的类,用于不查询实体的情况

                    .groupBy("name")//可以使用groupBy

                    .select("name", "count(name) as count").findAll();//在这里查询结果是数据的条数

            temp += "group by result:" + dbModels.get(0).getDataMap() + "\n";

            tv_db_result.setText(temp);

 

        } catch (Throwable e) {

            temp += "error :" + e.getMessage() + "\n";

            tv_db_result.setText(temp);

        }

    }

 

}


xUtils里面还有很多非常有用的自定义查询sample里面没有,尤其是以原生sql语句进行查询的方法,下面是个例子

 List<DbModel> offersmodelList = getDbUtils().findDbModelAll(

                    DbModelSelector.from(IMGRestaurantOffer.class)

                            .select("id", "offerId", "offerType",

                                    "offerDescription", "offerImage",

                                    "offerTerms", "offerStartDate",

                                    "offerEndDate", "offerStartTime",

                                    "offerEndTime", "offerTitle",

                                    "offerOff", "offerSlotId",

                                    "offerSlotMinDisc",

                                    "offerSlotMaxDisc", "offerMenu",

                                    "offerSlotList", "offerUrl",

                                    "tagLine", "restaurantId")

                            .where(WhereBuilder.b()

                                    .and("restaurantId", "=", restaurantId)

                                    .and("offerStartDate", "<=", maxDate)

                                    .and("offerEndDate", ">=", minDate))

                            .orderBy("offerType", false).orderBy("offerSlotMaxDisc", true));

            if (offersmodelList != null && offersmodelList.size() > 0) {

                final int offermodellistsize = offersmodelList.size();

 

                int specialofferlistindex = offermodellistsize;

                for (int modelindex = (offermodellistsize - 1); modelindex >= 0; --modelindex) {

                    DbModel model = offersmodelList.get(modelindex);

                    if (model != null) {

                       

                            RestaurantOffer oneofferitem = new RestaurantOffer();

                            oneofferitem.setId(model.getLong("id"));

                            oneofferitem.setOfferId(model.getString("offerId"));

                            oneofferitem.setOfferType(model.getInt("offerType"));

                            oneofferitem.setOfferDescription(model.getString("offerDescription"));

                            oneofferitem.setOfferImage(model.getString("offerImage"));

                            oneofferitem.setOfferTerms(model.getString("offerTerms"));

                            oneofferitem.setOfferStartDate(model.getString("offerStartDate"));

                            oneofferitem.setOfferEndDate(model.getString("offerEndDate"));

                            oneofferitem.setOfferStartTime(model.getLong("offerStartTime"));

                            oneofferitem.setOfferEndTime(model.getLong("offerEndTime"));

                            oneofferitem.setOfferTitle(model.getString("offerTitle"));

                            oneofferitem.setOfferOff(model.getString("offerOff"));

                            oneofferitem.setOfferSlotId(model.getString("offerSlotId"));

                            oneofferitem.setOfferSlotMinDisc(model.getString("offerSlotMinDisc"));

                            oneofferitem.setOfferSlotMaxDisc(model.getString("offerSlotMaxDisc"));

                            oneofferitem.setOfferMenu(model.getString("offerMenu"));

                            oneofferitem.setOfferSlotList(model.getString("offerSlotList"));

                            oneofferitem.setOfferUrl(model.getString("offerUrl"));

                            oneofferitem.setRestaurantId(model.getString("restaurantId"));

                            oneofferitem.setTagLine(model.getString("tagLine"));

                            result.add(0, oneofferitem);


还有手写sql的多表联查

 final String sqlStr = "SELECT DISTINCT A.offerId,"

                    + " A.id, A.offerType, A.offerDescription, A.offerImage, A.offerTerms,"

                    + " A.offerStartDate, A.offerEndDate, A.offerStartTime, A.offerEndTime,"

                    + " A.offerTitle, A.offerOff, A.tagLine,"

                    + " A.offerSlotId, A.offerSlotMinDisc, A.offerSlotMaxDisc, A.offerSlotList,"

                    + " A.offerMenu, A.offerUrl, A.restaurantId, A.hasNewSign"

                    + " FROM com_xxx_yyy_model_RestaurantOffer AS A"

                    + " LEFT OUTER JOIN com_xxx_yyy_model_OfferSlot AS B"

                    + " ON A.offerId = B.offerId"

                    + " WHERE A.restaurantId = ?"

                    + " ORDER BY A.offerType ASC, A.offerSlotMaxDisc DESC";

 

 

            SqlInfo sqlinfo = new SqlInfo();

            sqlinfo.setSql(sqlStr);

// sqlinfo.addBindArgs(restaurantId, currentdatestring, currentdatestring);

            sqlinfo.addBindArgs(restaurantId);

            List<DbModel> offersmodelList = db.findDbModelAll(sqlinfo);

            if (offersmodelList != null && offersmodelList.size() > 0) {

                final int offermodellistsize = offersmodelList.size();

 

                int specialofferlistindex = offermodellistsize;

                for (int modelindex = (offermodellistsize - 1); modelindex >= 0; --modelindex) {

                    DbModel model = offersmodelList.get(modelindex);

                    if (model != null) {

                        int offerType = model.getInt("offerType");

                        if (offerType == 4) {

                            RestaurantOffer oneofferitem = new RestaurantOffer();

                            oneofferitem.setId(model.getLong("id"));

                            oneofferitem.setOfferId(model.getString("offerId"));

                            oneofferitem.setOfferType(model.getInt("offerType"));

                            oneofferitem.setOfferDescription(model.getString("offerDescription"));

                            oneofferitem.setOfferImage(model.getString("offerImage"));

                            oneofferitem.setOfferTerms(model.getString("offerTerms"));

                            oneofferitem.setOfferStartDate(model.getString("offerStartDate"));

                            oneofferitem.setOfferEndDate(model.getString("offerEndDate"));

                            oneofferitem.setOfferStartTime(model.getLong("offerStartTime"));

                            oneofferitem.setOfferEndTime(model.getLong("offerEndTime"));

                            oneofferitem.setOfferTitle(model.getString("offerTitle"));

                            oneofferitem.setOfferOff(model.getString("offerOff"));

                            oneofferitem.setOfferSlotId(model.getString("offerSlotId"));

                            oneofferitem.setOfferSlotMinDisc(model.getString("offerSlotMinDisc"));

                            oneofferitem.setOfferSlotMaxDisc(model.getString("offerSlotMaxDisc"));

                            oneofferitem.setOfferMenu(model.getString("offerMenu"));

                            oneofferitem.setOfferSlotList(model.getString("offerSlotList"));

                            oneofferitem.setOfferUrl(model.getString("offerUrl"));

                            oneofferitem.setRestaurantId(model.getString("restaurantId"));

                            oneofferitem.setTagLine(model.getString("tagLine"));

                            oneofferitem.setHasNewSign(model.getInt("hasNewSign"));



  • 2019-12-05 17:01:36

    Vue 结合 Axios 接口超时统一处理

    当网路慢的时候。又或者公司服务器不在内地的时候,接口数据请求不回来超时报错的情况相信大家肯定遇到过的,这里我把我公司项目请求超时的处理方法分享下,希望看过后有帮助。

  • 2019-12-05 17:13:40

    JS模板工具lodash.template的简单用法

    lodash是从underscore分支的一个项目,之前我写了一篇JS模板工具underscore.template的简单用法,lodash跟underscore很相似,这也简单介绍一下lodash的template方法。 先把underscore的文章中用过的代码贴过来,把underscore的js文件换成lodash的js,其他一字不改,然后我们试试:

  • 2019-12-06 10:47:29

    date-fns日期工具的使用方法详解

    isToday() 判断传入日期是否为今天 isYesterday() 判断传入日期是否为昨天 isTomorrow() 判断传入日期是否为 format() 日期格式化 addDays() 获得当前日期之后的日期 addHours() 获得当前时间n小时之后的时间点 addMinutes() 获得当前时间n分钟之后的时间 addMonths() 获得当前月之后n个月的月份 subDays() 获得当前时间之前n天的时间 subHours() 获得当前时间之前n小时的时间 subMinutes() 获得当前时间之前n分钟的时间 subMonths() 获得当前时间之前n个月的时间 differenceInYears() 获得两个时间相差的年份 differenceInWeeks() 获得两个时间相差的周数 differenceInDays() 获得两个时间相差的天数 differenceInHours() 获得两个时间相差的小时数 differenceInMinutes() 获得两个时间相差的分钟数

  • 2019-12-06 10:49:39

    npm 查看源 换源

    npm,cnpm,查看源,切换源,npm config set registry https://registry.npmjs.org

  • 2019-12-06 11:01:31

    npm发布包流程详解 有demo

    npm发布包步骤,以及踩过的坑(见红颜色标准): 1.注册npm账号,并完成Email认证(否则最后一步提交会报Email错误) 2.npm添加用户或登陆:npm adduser 或 npm login

  • 2019-12-06 13:16:18

    vue mixins组件复用的几种方式

    最近在做项目的时候,研究了mixins,此功能有妙处。用的时候有这样一个场景,页面的风格不同,但是执行的方法,和需要的数据非常的相似。我们是否要写两种组件呢?还是保留一个并且然后另个一并兼容另一个呢? 不管以上那种方式都不是很合理,因为组件写成2个,不仅麻烦而且维护麻烦;第二种虽然做了兼容但是页面逻辑造成混乱,必然不清晰;有没有好的方法,有那就是用vue的混合插件mixins。混合在Vue是为了提出相似的数据和功能,使代码易懂,简单、清晰。

  • 2019-12-06 13:26:30

    vue的mixins混入合并规则

    混入minxins:分发vue组件中可复用功能的灵活方式。混入对象可以包含任意组件选项。组件使用混入对象时,所有混入对象的选项将混入该组件本身的选项。

  • 2019-12-06 16:50:34

    Intellij idea 如何关闭无用的提示

    Linux:Settings —> Editor —> Inspections —> General —> Duplicated Code Mac:Preferences --> Editor —> Inspections —> General —> Duplicated Code fragment 将对应的勾去掉。