# XSql
**Repository Path**: pichs/xsql
## Basic Information
- **Project Name**: XSql
- **Description**: xsql-core 数据库框架迁移,聚合(合一) 适配 kotlin
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-09-05
- **Last Updated**: 2023-09-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# XSql数据库框架
极致简单好用的ORM数据库框架
可自动升级,无需操心数据库升级带来的困扰,面对对像数据库操作
最新版本:[](https://jitpack.io/#com.gitee.pichs/xsql)
### 引用方式
// 核心包 其中已经包含xsql-base,可以不用重复引用
implementation 'com.gitee.pichs:xsql:2.0'
// 表字段映射类自动生成,可选
kapt 'com.gitee.pichs:xsql:compiler:2.0'
### 一、 一行代码,无需创建乱七八槽的 dao
var baseDao = XSql.getDBManager(this).getBaseDao(UserInfo::class.java)
// 获取baseDao 举个栗子。
baseDao.insert(UserInfo)
// 具体使用可以查看详情。
### 二、 字段随意定,支持模糊,区间,分页,排序等常用查询。
##### XSqlTable: 定义表名的注解,不可为空
##### 1、XSqlField:
- 定义字段名字的注解,不可为空,该字段必须为包装类。
- 不添加此注解的字段不添加到数据库。字段类型可随意。
- 仅支持以下7种,Integer,Long,Double,Float,Boolean, String,byte[]
- 不支持 Short,Byte,Date,这几个类型都可以用上面7种类型代替。
- 其他类型请使用String,然后自己转换。
- 本人以为这7种足以应对各种表,越简单,越好用。
##### 2、XSqlPrimaryKey: 定义自增键的注解,必须为Long或Integer。与XSqlField一起用
##### 3、XSqlUnique: 定义唯一值,与XSqlField一起用。
### Table实体类的定义(java)
```java
@XSqlTable("user_info")
public class UserInfo {
@XSqlField("name")
public String name;
@XSqlField("age")
public Integer age;
public UserInfo() {
}
public UserInfo(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
```
#### 注意:kotlin的写法,Kotlin的基础类型一定要带 "?" 否则会报错。
- 问:为什么基础类型上要带 ? 号, 因为kotlin的带问号的基础类型会转成 包装类,不带问号的基础类型会转成基础类型。
- 答:这个框架 做了基础类型(int,long,boolean,double,float)限制,不允许使用基础类型,请使用包装类型,否则会报错。
- 问:为什么一定要使用包装类型?
- 答:因为可以判断为null时不写入数据库或者,不作为条件查询,或者更新,而基础类型不可为null,无法实现(强行判断为n会导致n不能被写入),所以不允许使用基础类型。
### Table实体类的定义(kotin)
```kotlin
@XSqlTable(value = "user_info")
data class UserInfo(
@XSqlUnique
@XSqlField(value = "name")
var name: String? = "",
@XSqlField(value = "age")
var age: Int? = 0,
// 没注解就是忽略的字。
var tag: String? = ""
)
```
## 增删改查,一行搞定。
- 增删改查,是重中之重,所以详细介绍使用方式和规则。
### 增
1. insert(T entity): 添加一条数据
规则限制: 优先以XSqlPrimaryKey查询,其次XSqlUnique, 都没有
就以其他结果合并查询。
2. insertInTx(List entities):批量添加数据
### 删
1. delete(T entity): 删除匹配相同的数据
(规则限制,对象内所有属性为空时不删除任何数据,保证一定的安全性。)
2. delete(Where where): 根据条件删除
(规则限制条件为空时不删除任何数据)
3. deleteAll(): 删除所有数据
### 改
1. update(T entity): 更新数据:
(规则限制:必须满足有 唯一建或者自增id且不为null 的情况下有效。)
因为没有唯一建,无法知晓到底根据哪个字段更新更新哪些字段的数据。
全排列查询效率低下,此种情况建议使用条件更新 (2.)
2. update(Where where, T entity): 条件更新
(规则限制,where不可为null且条件必须有个一判断。entity中必须至少有一个字段的值不为null)
### 查
1. query(T entity): 根据entity查询数据
(规则限制:entity中必须至少有一个字段的值不为null)
规则优先级: 优先以XSqlPrimaryKey查询,其次XSqlUnique,
都没有就以其他结果合并查询。
2. query(Where where): 条件查询
如果普通的查询无法满足你的需求,那么就是用条件查询吧,各种花里胡哨的条件查询都有。
3. queryAll(): 查询所有
### 条件查询 Where详解
1. 条件查询代码示例
```kotlin
Where.Builder()
.eq(XSqlProperties.UserInfoData.name, "张三")
.or()// 条件拼接 二选一
// 或者
.and()// 条件拼接 二选一
.eq(XSqlProperties.UserInfoData.name, "李四")
.orderByDesc(XSqlProperties.UserInfoData.age)
.orderByAsc(XSqlProperties.UserInfoData.age)
.like(XSqlProperties.UserInfoData.name, "张")
.notLike(XSqlProperties.UserInfoData.name, "张")
.notEq(XSqlProperties.UserInfoData.name, "四")
.between(XSqlProperties.UserInfoData.age, 10, 20)
.ge(XSqlProperties.UserInfoData.age, 10)
.gt(XSqlProperties.UserInfoData.age, 10)
.le(XSqlProperties.UserInfoData.age, 10)
.lt(XSqlProperties.UserInfoData.age, 10)
.startWith(XSqlProperties.UserInfoData.name, "张")
.endWith(XSqlProperties.UserInfoData.name, "张")
.page(1, 10)
.build()
```
2. Where.Builder() 方法详解
| 方法 | 解释 |
|-------------------------------|----------------------|
| eq(column, value) | 该列等于给定值 |
| or() | 逻辑或操作,连接两个条件其中之一满足即可 |
| and() | 逻辑与操作,连接两个条件都要满足 |
| notEq(column, value) | 该列不等于给定值 |
| like(column, value) | 该列的值包含给定值(模糊匹配) |
| notLike(column, value) | 该列的值不包含给定值(模糊匹配) |
| between(column, lower, upper) | 该列的值在给定的范围内 |
| ge(column, value) | 该列的值大于或等于给定值 |
| gt(column, value) | 该列的值大于给定值 |
| le(column, value) | 该列的值小于或等于给定值 |
| lt(column, value) | 该列的值小于给定值 |
| startWith(column, value) | 该列的值以给定值开头 |
| endWith(column, value) | 该列的值以给定值结尾 |
| orderByDesc(column) | 根据该列降序排列 |
| orderByAsc(column) | 根据该列升序排列 |
| page(pageNumber, pageSize) | 查询结果分页,指定页码和每页记录数 |
| build() | 生成查询条件对象,用于执行查询 |
#### 以上就是条件查询的全部方法,非常的简单
### 条件查询示例
```kotlin
// 查询年龄大于10岁的数据
var where = Where.Builder()
.gt(XSqlProperties.UserInfoData.age, 10)
.build()
var list = baseDao.query(where)
// 查询年龄大于10岁的数据,按照年龄降序排列
where = Where.Builder()
.gt(XSqlProperties.UserInfoData.age, 10)
.orderByDesc(XSqlProperties.UserInfoData.age)
.build()
// 查询名字为张三的数据
where = Where.Builder()
.eq(XSqlProperties.UserInfoData.name, "张三")
.build()
val list = baseDao.query(where)
// 查询名字为张三或者李四的数据
where = Where.Builder()
.eq(XSqlProperties.UserInfoData.name, "张三")
.or()
.eq(XSqlProperties.UserInfoData.name, "李四")
.build()
val list = baseDao.query(where)
// 查询名字为张三,且年龄为18岁的数据
where = Where.Builder()
.eq(XSqlProperties.UserInfoData.name, "张三")
.and()
.eq(XSqlProperties.UserInfoData.age, 18)
.build()
val list = baseDao.query(where)
// 分页查询, page从1开始
val page = 1 // page=2,3,4,5,6,7,8,9,10
where = Where.Builder()
.page(page, 10)
.build()
val list = baseDao.query(where)
// 查询名字以张开头的数据
where = Where.Builder()
.startWith(XSqlProperties.UserInfoData.name, "张")
.build()
// 查询名字以张结尾的数据
where = Where.Builder()
.endWith(XSqlProperties.UserInfoData.name, "张")
.build()
// 查询名字包含张的数据
where = Where.Builder()
.like(XSqlProperties.UserInfoData.name, "张")
.build()
// 查询名字不包含张的数据
where = Where.Builder()
.notLike(XSqlProperties.UserInfoData.name, "张")
.build()
// 查询年龄在10到20之间的数据
where = Where.Builder()
.between(XSqlProperties.UserInfoData.age, 10, 20)
.build()
// 查询年龄大于等于10岁的数据
where = Where.Builder()
.ge(XSqlProperties.UserInfoData.age, 10)
.build()
// 查询年龄大于10岁的数据
where = Where.Builder()
.gt(XSqlProperties.UserInfoData.age, 10)
.build()
// 查询年龄小于等于10岁的数据
where = Where.Builder()
.le(XSqlProperties.UserInfoData.age, 10)
.build()
// 查询年龄小于10岁的数据
where = Where.Builder()
.lt(XSqlProperties.UserInfoData.age, 10)
.build()
// 查询所有数据 按照年龄降序排列
where = Where.Builder()
.orderByDesc(XSqlProperties.UserInfoData.age)
.build()
```
### 数据库升级
1. 该框架不需要数据库升级,会自动管理升级,无需操心。
2. 你只需要新增实体类的字段,或者删除实体类的字段即可
3. 注解的话,直接删除注解即可。