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"));



  • 2018-12-04 23:40:26

    pod删除已导入的第三方库和移除项目中的cocoapods

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具。CocoaPods的项目源码在Github上管理。在我们有了CocoaPods这个工具之后,只需要将用到的第三方开源库放到一个名为Podfile的文件中,然后在命令行执行$ pod install命令。CocoaPods就会自动将这些第三方开源库的源码下载下来,并且为我的工程设置好相应的系统依赖和编译参数. 但是如果我们导入的某个第三方不适用,或者我们又不想使用该第三方,那我们又该如何将这些相关的东西从我们的项目中清理出去呢?

  • 2018-12-04 23:41:47

    制作自己的Pod库(公有/私有)

    目的:1.管理自己常用的类;2.组件化开发步骤:1.想一个比较酷的名字,在桌面简历文件夹。2.打开terminal,cd到这个文件夹下面,执行pod lib create  xxx(这里我们以JJCategoryKit为例子,下同)命令,如下图。这个过程会问几个问题,根据实际情况输入回答即可。这里我们选择添加demo,结束的时候会自动Lanuch这个app. 作者:深水日月 链接:https://www.jianshu.com/p/ece0b5721461 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2018-12-05 06:08:26

    CocoaPods建立私有仓库 spec repo

    好多项目里都有公共的组件,copy来,copy去很容易出错,而且不容易维护,所以就想到用用cocoapods 建自己的私有库,Carthage用法虽然相对简单,但是它是把公共组件都放在framework里不容易单步调试,所以我还是选择用Cocoapods 来建立私有仓库 参考使用Cocoapods创建私有podspec

  • 2018-12-05 15:11:18

    为什么 Objective-C非常难

    作为一个Objective-C的coder,我总能听到一部 分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这 些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。

  • 2018-12-05 15:22:23

    十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有的同学会感觉像是看天书一样。不过,语言都是相通的,有很多共性。下面列出Objective-C语言的语法和Java,C++的对比,这样你就会很容易Objective-C的语法是怎么回事了。

  • 2018-12-05 15:33:33

    一篇文章看懂有关iOS开发语言的一切!

    OS开发语言有哪些?OS开发语言主要包括什么?iOS开发语言具体怎么学习?今天重点介绍一下: iOS开发语言主要包括:C语言基础、Obiective-C编程、Swift、UIKit框架详解这几大块,在这里项目阶段就不详细的介绍了。 C语言基础 C语言是开发语言的基础,是最常用的一门程序设计语言,最常用于编写计算机程序。

  • 2018-12-06 10:03:36

    定时杀掉processlist sleep状态的线程

    由于程序设计的Bug,导致目前这个项目使用的数据库中有很多Sleep状态的线程。找了很多解决办法,还没发现最终有效的解决方案。只能临时使用如下方法: 编写shell文件,如killSleepProcess.sh

  • 2018-12-07 08:26:37

    mysql线程池和连接池的区别

    可能有的DBA会把线程池和连接池混淆,其实两者是有很大区别的,连接池一般在客户端设置,而线程池是在DB服务器上配置;另外连接池可以取到避免了连接频繁创建和销毁,但是无法取到控制MySQL活动线程数的目标,在高并发场景下,无法取到保护DB的作用。比较好的方式是将连接池和线程池结合起来使用。 作者:飞鸿无痕 链接:https://www.jianshu.com/p/88e606eca2a5 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2018-12-07 17:47:24

    linux中wc命令用法

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。