# tisimple **Repository Path**: lhd1102/tisimple ## Basic Information - **Project Name**: tisimple - **Description**: 一个轻ORM框架,一个JDBC小工具。 面向域的操作风格。 单表零SQL增删改查与分页。 安全的字符串SQL模版引擎,简单直观高效。 只需在数据库创建一张表,填入一行数据,少量配置,一键生成实体。 还有什么?....先来试试看....从建一张表开始,填一行数据,.... - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: https://gitee.com/oeoe/tisimple - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-01-13 - **Last Updated**: 2022-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TiSimple 越简单越好用,越直接越高效。封装于JDBC的SQL执行框架,一款简单的ORM轻框架。 #### MANIFESTO >ideas gathering.... > #### 简介 > 一个轻ORM框架,一个JDBC小工具 > > 面向域的操作风格 > > 单表零SQL增删改查与分页 > > 安全的字符串SQL模版引擎,简单直观高效可扩展 > > 只需在数据库创建一张表,填入一行数据,少量配置,一键生成实体 > > 还有什么?....先来试试看....从建一张表开始,填一行数据,.... #### 使用要求 1. JDK 1.8+ 2. 实体类属性若为基本类型,则必须为包装类型 3. 如果要使用 IBaseAbility 的sql能力,请务必使用@TiTable指明表名 #### 着重注意 1. 默认实体属性名与对应表的字段名是相同的,若不同,需要使用@TiColumn指定表字段名,建议使用生成工具自动生成 2. 实体类类型与数据库字段类型需绝对对应 3. 从table生成实体是有条件的,需要表中至少有一条记录,且各个字段不为空,这是为了让生成的实体属性类似与字段类型绝对对应。 #### 使用步骤 1. 配置数据源以及连接池,可以使用任意一种连接池 2. 将连接池注册到 TiDBPoolManager 3. 通过 TiDBPoolManager 获取连接,即可使用TiSimpleCore中各个方法。 4. 如果要支持分页,使用TiGlobalConfig注册全局分页工厂,也可以每个实体指定设置一个分页工厂 5. 详细的例子,请看示例项目example-single #### 安装教程 1. clone TiSimple 项目后执行 maven的install将它安装到本地 2. 在项目中引入它 3. 可以查看示例项目 example-single 4. 之后可能会提交到Maven.... #### 求关注+求三连 >如果觉得还可以,您的点赞与star是我继续完善它并坚持的动力。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 使用教程 > 使实体继承TiEntity.class > > 在类名上添加注释@TiTable,并申明表名 > > 如果太麻烦,使用 EntityBuilderFactory 生成实体,只需要定义好表,填入一行数据... > > 如果还太麻烦了,稍等等...,稍后再码一个更好的工具,expecting.... --- --- ### 配置 ```java package com.example.tisimple; import com.mysql.cj.jdbc.MysqlDataSource; import we.us.tisimple.core.TiDBPoolManager; import we.us.tisimple.core.TiGlobalConfig; import we.us.tisimple.extra.pagefactory.mysql.MysqlPageFactory; /** * 只需要创建任何一个连接池,注册到TiDBPoolManager即可 */ public class TiConfig { public static final String url = "jdbc:mysql://localhost:3306/alis"; public static final String username = "mime"; public static final String password = "123"; public static final String driver = "com.mysql.cj.jdbc.Driver"; static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setURL(url); dataSource.setUser(username); dataSource.setPassword(password); TiDBPoolManager.register(dataSource);//注册连接池 TiGlobalConfig.setGlobalPageFactory(MysqlPageFactory.class,5);//注册全局分页工厂,设置默认分页大小 } public static long id() { return System.nanoTime(); } } ``` ### 快速入门 ```java package com.example.tisimple.domain; import com.example.tisimple.TiConfig; import org.junit.jupiter.api.Test; import we.us.tisimple.extra.IPage; import java.nio.charset.StandardCharsets; import java.sql.Date; import java.time.LocalDateTime; import java.util.List; class MysqlTypeTest { public static final Long serialVersionUID = TiConfig.id(); @Test void insert() { MysqlType entity = new MysqlType(); entity.setInteger(188); entity.setDate(new Date(new java.util.Date().getTime())); entity.setVarchar("hello my love"); entity.setDatetime(LocalDateTime.now()); entity.setLongblob("china".getBytes(StandardCharsets.UTF_8)); entity.setBlob("中国".getBytes(StandardCharsets.UTF_8)); entity.setChar("M"); entity.setDecimal(BigDecimal.valueOf(123.456)); entity.insert(); } @Test void delete() { MysqlType condition = new MysqlType(); condition.setInteger(188); int result = condition.delete(); System.out.println(result); } @Test void update() { MysqlType condition = new MysqlType(); condition.setInteger(188); MysqlType entity = new MysqlType(); entity.setVarchar("miss you "); int result = condition.update(entity); System.out.println(result); } @Test void query() { MysqlType condition = new MysqlType(); condition.setInteger(188); List query = condition.query(); System.out.println(query); } @Test void page() { MysqlType condition = new MysqlType(); //如果没有设置全局分页工厂,则需要手动设置一个,否则page接口永远返回null //IPageFactory pageFactory = new MysqlPageFactory(); //condition.setPageFactory(pageFactory); condition.setInteger(188); IPage page = condition.page(); System.out.println(page); } @Test void count() { MysqlType condition = new MysqlType(); condition.setInteger(188); Long row = condition.count(); System.out.println(row); } } ``` ### 进阶示例 ```java package com.example.tisimple.domain; import com.example.tisimple.TiConfig; import org.junit.jupiter.api.Test; import we.us.tisimple.ability.TiEntity; import we.us.tisimple.annotation.TiColumn; import we.us.tisimple.extra.IPage; import we.us.tisimple.extra.pagefactory.mysql.MysqlPageFactory; import we.us.tisimple.template.SqlTemplate; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; class OrderTest { public static final Long serialVersionUID = TiConfig.id(); @Test void insert() { Order order = new Order(); order.setOrderTime(LocalDateTime.now()); order.setStatus(1); order.setPayment("zfb"); order.setTotalMoney(BigDecimal.valueOf(335)); order.setActualAmountPaid(BigDecimal.valueOf(236.23)); order.setUserId("1"); order.setUserName("爱德华"); int insert = order.insert(); System.out.println(insert); System.out.println("=============也可以指定主键自动生成工厂============="); //在id 列的@TiColumn注解申明属性keyGenerateFactory 指定主键生成工厂UUIDFactory.class //使用主键自动生成,看一下生成的主键 if (1 == insert) { System.out.println(order.getId()); } } @Test void delete() { Order condition = new Order(); condition.setStatus(5); System.out.println(condition.delete()); //如果默认条件匹配不符合,也可以自定义删除sql System.out.println("=============如果默认条件匹配不符合,也可以自定义删除sql==============="); condition.setOrderTime(LocalDateTime.now()); String sql="delete from k_order where order_time>{orderTime}"; System.out.println(condition.delete(sql)); } @Test void update() { Order condition = new Order(); condition.setId("12"); Order order = new Order(); order.setUserName("abc"); System.out.println(condition.update(order)); //与删除,都可以自定义更新sql System.out.println("========自定义更新SQL=========="); //比如需要多表更新 condition.setOrderTime(LocalDateTime.now()); String sql="update k_order,s_user set k_order.user_name=s_user.name where k_order.user_id=s_user.id and k_order.order_time>{orderTime}"; System.out.println(condition.update(sql)); //如果你需要添加额外的参数,可以这样写 System.out.println("========多表更新=========="); ArrayList statusList = new ArrayList<>(); statusList.add(1); statusList.add(2); statusList.add(3); sql="update k_order,s_user set k_order.user_name=s_user.name where k_order.user_id=s_user.id and k_order.order_time>{orderTime} and status in [foreach@list#(|,|)]"; SqlTemplate template = SqlTemplate.sqlO(sql, condition).addParam("list", statusList);//statusList是一个列表,或是其他值 System.out.println(condition.update(template)); } @Test void query() { Order condition = new Order(); List list = condition.query(); //设置查询条件值,默认所有字段匹配类型为等于 condition.setUserId("1"); System.out.println(condition.query()); System.out.println(list); //如果默认的不能满足要求,也可以拼写自己的查询sql System.out.println("=============指定sql语句=================="); String sql ="select id,status from k_order where order_time<{orderTime}"; condition.setOrderTime(LocalDateTime.now()); System.out.println(condition.queryList(sql)); System.out.println("=============更改字段的默认匹配方式=================="); //如果觉得对order_time字段的匹配方式所有地方都应该是小于,那就在Order.class 中的此字段上设置注解属性 fieldMatchTypeFactory // @TiColumn(value="order_time",comment="下单时间",fieldMatchTypeFactory = LeTypeFactory.class) // private java.time.LocalDateTime orderTime; System.out.println(condition.query()); //如果发现Order中的属性都不满足自己的条件,需要额外添加条件 System.out.println("==========额外添加参数到参数空间=========="); ArrayList statusList = new ArrayList<>(); statusList.add(1); statusList.add(2); statusList.add(3); sql ="select id,status from k_order where status in [foreach@statusList#(|,|)]"; //一种更好的写法,select id,status from k_order [foreach@statusList#where status in(|,|)] SqlTemplate template = SqlTemplate.sqlO(sql, condition);//先添加Order对象到参数空间 template.addParam("statusList", statusList);//再添加一个List参数到参数空间 System.out.println(condition.queryList(template)); //如果一个要查询多个表中的字段并返回,那么只需要新建一个实体包含这些字段,字段若是基本类型,必须用包装类,继承类TiEntity.class即可 System.out.println("==========多表查询,返回的字段来自多个表=========="); //所有继承类TiEntity.class的实体类都必须是一个public申明的类,意味着它不能是内部类,内部静态类 Example example = new Example();//在最后可以看实体的定义 sql = "select a.age,a.name as user_name,b.id as order_id from k_order b,s_user a where a.id=b.user_id and order_time<{orderTime}"; SqlTemplate template1 = SqlTemplate.sqlO(sql, condition); System.out.println(example.queryList(template1)); } @Test void page() { Order condition = new Order(); IPage page = condition.page(); System.out.println(page); System.out.println("========设置分页参数========="); //也可以手动设置分页大小 condition.setPageSize(2); condition.setCurrentPage(1); System.out.println(condition.page()); System.out.println("========设置自己的分页工厂========="); //如果你有自己的分页工厂,也可以指定此次使用的分页工厂 MysqlPageFactory factory = new MysqlPageFactory<>(); //也可以设置默认的分页大小 factory.setDefaultPageSize(5); condition.setPageFactory(factory); System.out.println(condition.page()); System.out.println("=========使用自己的分页查询SQL==========="); //如果觉得默认的分页查询方式不满足要求,也可以手动书写查询SQL String sql ="select id,status from k_order where order_time<{orderTime}"; condition.setOrderTime(LocalDateTime.now()); System.out.println(condition.page(sql)); } @Test void count() { Order condition = new Order(); System.out.println(condition.count()); System.out.println("========使用自己的统计方式============"); //如果默认的统计方式不符合要求,可以使用自己的统计sql condition.setOrderTime(LocalDateTime.now()); String sql ="select count(*)as total from k_order b,s_user a where a.id=b.user_id and order_time<{orderTime}"; System.out.println(condition.queryCount(sql,"total")); //也可以是这样的 System.out.println("===========也可以是这样的==============="); ArrayList statusList = new ArrayList<>(); statusList.add(1); statusList.add(2); statusList.add(3); sql ="select count(*) as sum from k_order where status in [foreach@list#(|,|)]"; SqlTemplate template = SqlTemplate.sqlL(sql, statusList);//sqlL()允许参数是一个list,会在参数空间给予默认参数名list //如果你还需要Order对象中的参数作为条件,可以这样写 SqlTemplate.sqlO(sql, condition).addParam("list", statusList) System.out.println(condition.queryCount(template,"sum"));//sum 为count(*)的别名 } @Test void queryList() { } @Test void queryOne() { } @Test void queryCount() { } @Test void testPage() { } } ``` ### 模版语法 > 第一类:sqlB(SQL for basal grammar),基础语法,使用 '?' 占位参数,参数将按照顺序填入,接口***SqlTemplate.sqlB(String sql, Object... param)*** ``` //select * from user where age=? and name=? String sql = "select * from user where age=? and name=?"; SqlTemplate template = SqlTemplate.sqlB(sql, 18, "小米"); ``` > 第二类:sqlN(SQL for number grammar),编号语法,使用 '{number}' ,number指定参数的位置,接口***SqlTemplate.sqlN(String sql, Object... param)*** ``` //select * from user where age=? and name=? String sql = "select * from user where age={2} and name={1}";//2,指定第二个参数,18;1,指定第一个参数 SqlTemplate template = SqlTemplate.sqlN(sql, "小米",18); ``` > 第三类:sqlM/sqlO(SQL for Map/Object grammar),命名语法,使用 '{varName}' 指定参数,接口***SqlTemplate.sqlM(String sql, Map param)和SqlTemplate.sqlO(String sql, Object param)*** ``` User user = new User(); user.setName("小米"); user.setAge(22); HashMap p = new HashMap<>(); p.put("name", "小米"); p.put("age", 12); //select * from user where age=? and name=? String sql = "select * from user where age={age} and name={name}"; SqlTemplate templateM = SqlTemplate.sqlM(sql, p); SqlTemplate templateO = SqlTemplate.sqlO(sql, user); ``` > > *特别的,如果在命名参数开头加上'#',将是一种不安全的字符替换,如下:* > ``` > String address = "('大海','天空')"; > HashMap p = new HashMap<>(); > p.put("address", address); > String sql = "select * from user where address in {#address}";//select * from user where address in ('大海','天空'); > SqlTemplate templateM = SqlTemplate.sqlM(sql, p); > ``` > 特殊类1:sqlL(SQL for list grammar),命名语法中的一种,参数是一个list,list参数将会被自动分配一个叫'list'的变量名,通常会结合foreach模版函数使用,接口***SqlTemplate.sqlL(String sql, Collection param)*** ``` ArrayList p = new ArrayList<>(); p.add("大海"); p.add("天空"); //select * from user where address in ('大海','天空'); String sql = "select * from user where address in [foreach@list#(|,|)]"; SqlTemplate template = SqlTemplate.sqlL(sql, p); ``` ### 模版函数规则-v1.0.1 > 模版函数调用规则: > *** > > 一个模版函数调用以 ***\[*** 开头,以 ***\]*** 结束,紧跟 ***\[*** 之后的funName是函数名,表示要调用的模版方法, ***@*** 与 ***#*** 之间的表示主参数,一般是参数空间中的属性, ***#*** 之后的是副参数部分,副参数只会被当做字符串处理(随着模版函数的丰富,后期可能会扩展类型),以 ***|*** 分隔为副参数列表 > *** > 目前内置模版函数: > > **null** 函数,格式:**\[null@主参数#副参数1|副参数2\]**, 如果主参数为 **对象null 或 字符度空 或 集合长度0** 则返回副参数1,否则返回副参数2 > >> select * from user **[null@name#|where name={name}]** > >>``` > >>如果name为空,整个sql为:select * from user,如果不为空,整个sql为:select * from user where name={name} > >>``` > > *** > >**foreach** 函数,格式:**[foreach@主参数#副参数1|副参数2|副参数3|副参数4\]**, 主参数为集合对象且不为空,此函数才会执行。迭代此集合对象,并拼接返回。 > > 副参数2为拼接字符串,副参数1为返回的前缀字符串,副参数3为返回的后缀字符串,参数4控制此次是直接拼接还是占位拼接,默认是占位拼接,只要此参数不为空即表示需要直接拼接。 > >> select * from user where address in **[foreach@list#(|,|)]** > >>``` > >>如果list为['大海','天空'],sql为:select * from user where address in (?,?)。这是一种安全的sql。 > >>``` > >>*** > >> select * from user where address in **[foreach@list#(|,|)|false]** > >>``` > >>如果list为['大海','天空'],sql为:select * from user where address in ('大海','天空')。这是一种不安全的sql,如果不确定list的内容, 不建议使用第四个副参数。 > >>``` > >>*** > >> select * from user **[foreach@list#where address in(|,|)]** > >>``` > >>这种写法更好,如果list为空,sql为:select * from user。 > >>``` > >>*** ### 注解 > @TiColumn > > 主要用于关联实体属性和表列名,如果在实体上不加此注解,默认为实体属性名即为表列名 > >*** > >设置 **fieldMatchTypeFactory** 属性,可设置字段在默认查询中的匹配规则,默认是等于(=), > > 目前可用有大于(>),大于等于(>=),小于(<),小于等于(<=),不等于(!=),全模糊匹配(like '%xxx%'),左模糊匹配(like '%xxx'),右模糊匹配(like 'xxx%')。 > >*** > >设置 **keyGenerateFactory**和 **key** 属性,可自动生成主键值,可自定义主键生成规则。 > >*** > >设置 **nullAble** 属性,申明此字段在新增的时候校验此属性是否可为null,默认true,可为空,如果设置为false,将不允许为空。 > >*** >@TiTable > > 主要用于关联实体和表,如果实体不添加此注解,将无法使用基本的CRUD,即接口 ***IBaseAbility.class***中的功能无法使用。 > >*** > >设置 **wrapChar**属性,基本CRUD sql中的字段将自动加上设置的字符为前后缀, > > 在mysql中如果字段中有系统字段,字段通常需要加反引号,此时即可设置为 ' **`** '。 > >*** > ### 高级使用 > 待补充... *** #### 事务控制 > 待补充... ### 扩展 #### 模版函数 > 待补充.. > #### 分页工厂 > 待补充.. > #### 匹配规则 > 待补充.. > ### 其他 > 待补充... ### 实体生成工具的使用 > _例子使用MySQL数据库_ ```SQL -- auto-generated definition create table s_user ( id int auto_increment comment '主键' primary key, name varchar(32) null comment '用户名', age int default 0 null comment '年龄', address varchar(1024) null comment '地址' ); INSERT INTO alis.s_user (id, name, age, address) VALUES (1, '掌声', 118, '大海'); INSERT INTO alis.s_user (id, name, age, address) VALUES (2, '鲜花', 118, '山坡'); INSERT INTO alis.s_user (id, name, age, address) VALUES (3, '烈阳', 11, '天空'); INSERT INTO alis.s_user (id, name, age, address) VALUES (4, '你在哪儿', 118, '我在你身边'); INSERT INTO alis.s_user (id, name, age, address) VALUES (5, '你在哪儿', 118, '我在你身边'); INSERT INTO alis.s_user (id, name, age, address) VALUES (6, '你在哪儿', 118, '我在你身边'); INSERT INTO alis.s_user (id, name, age, address) VALUES (138430, '平方', 19, '共和国'); create table k_order ( id varchar(64) not null comment '订单号' primary key, status int null comment '订单状态,0未支付,1已支付,2待发货,3已发货,4待收货,5已完成', order_time datetime null comment '下单时间', total_money decimal null comment '订单总金额', actual_amount_paid decimal null comment '实际支付金额', payment varchar(32) null comment '支付方式', user_id varchar(64) null comment '顾客ID', user_name varchar(64) null comment '顾客昵称' ) comment '订单'; INSERT INTO alis.k_order (id, status, order_time, total_money, actual_amount_paid, payment, user_id, user_name) VALUES ('1', 1, '2022-01-12 09:59:06', 188, 100, 'wx', '1', null); INSERT INTO alis.k_order (id, status, order_time, total_money, actual_amount_paid, payment, user_id, user_name) VALUES ('b61d932caf954530897fd24524a39551', 1, '2022-01-12 10:08:59', 335, 236, 'zfb', null, null); INSERT INTO alis.k_order (id, status, order_time, total_money, actual_amount_paid, payment, user_id, user_name) VALUES ('b8da1ee90d454b2f9776f77071492774', 1, '2022-01-12 12:33:39', 335, 236, 'zfb', '1', '爱德华'); INSERT INTO alis.k_order (id, status, order_time, total_money, actual_amount_paid, payment, user_id, user_name) VALUES ('fb04c149da4d422aa963634afa696d12', 1, '2022-01-12 10:06:57', 335, 236, 'zfb', null, null); ``` >配置 > ```java package com.example.tisimple; import com.mysql.cj.jdbc.MysqlDataSource; import we.us.tisimple.core.TiDBPoolManager; import we.us.tisimple.core.TiGlobalConfig; import we.us.tisimple.extra.pagefactory.mysql.MysqlPageFactory; /** * 只需要创建任何一个连接池,注册到TiDBPoolManager即可 */ public class TiConfig { public static final String url = "jdbc:mysql://localhost:3306/alis"; public static final String username = "mime"; public static final String password = "123"; public static final String driver = "com.mysql.cj.jdbc.Driver"; static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setURL(url); dataSource.setUser(username); dataSource.setPassword(password); TiDBPoolManager.register(dataSource);//注册连接池 TiGlobalConfig.setGlobalPageFactory(MysqlPageFactory.class,5);//注册全局分页工厂,设置默认分页大小 } public static long id() { return System.nanoTime(); } } ``` *** ```JAVA package com.example.tisimple; import we.us.tisimple.core.TiDBPoolManager; import we.us.tisimple.entityfactory.EntityBuilderFactory; import we.us.tisimple.entityfactory.mysql.MysqlTableInfoFactory; import we.us.tisimple.exception.ConditionNotMetException; import we.us.tisimple.exception.ObtainConnectionException; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 从表中生成实体 */ public class GenerateUser { public static final Long serialVersionUID = TiConfig.id(); public static void main(String[] args) throws ObtainConnectionException, ConditionNotMetException, SQLException, IOException { String path = new File("").getAbsoluteFile().getPath(); path = path + "/example-single/src/main/java/com/example/tisimple/domain/"; try (Connection connection = TiDBPoolManager.getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement("select * from s_user limit 1"); ResultSet resultSet = preparedStatement.executeQuery(); EntityBuilderFactory.build() .setPackName("com.example.tisimple.domain") .setClassName("User") .setTableName("s_user") .setResultSet(resultSet) .setOutPath(path) .setInfoFactory(MysqlTableInfoFactory.class)//设置获取表信息工厂 .generate(); } } } ``` *** ```java package com.example.tisimple; import we.us.tisimple.core.TiDBPoolManager; import we.us.tisimple.entityfactory.EntityBuilderFactory; import we.us.tisimple.entityfactory.mysql.MysqlTableInfoFactory; import we.us.tisimple.exception.ConditionNotMetException; import we.us.tisimple.exception.ObtainConnectionException; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 从表中生成实体 */ public class GenerateOrder { public static final Long serialVersionUID = TiConfig.id(); public static void main(String[] args) throws ObtainConnectionException, ConditionNotMetException, SQLException, IOException { String path = new File("").getAbsoluteFile().getPath(); path = path + "/example-single/src/main/java/com/example/tisimple/domain/"; try (Connection connection = TiDBPoolManager.getConnection()) { PreparedStatement preparedStatement = connection.prepareStatement("select * from k_order limit 1"); ResultSet resultSet = preparedStatement.executeQuery(); EntityBuilderFactory.build() .setPackName("com.example.tisimple.domain") .setClassName("Order") .setTableName("k_order") .setResultSet(resultSet) .setOutPath(path) .setInfoFactory(MysqlTableInfoFactory.class) .generate(); } } } ``` *** ```java package com.example.tisimple.domain; import we.us.tisimple.ability.TiEntity; import we.us.tisimple.annotation.TiColumn; import we.us.tisimple.annotation.TiTable; import we.us.tisimple.extra.keygenertefactory.UUIDFactory; import we.us.tisimple.extra.matchtypefactory.LeTypeFactory; @TiTable(value="k_order") public class Order extends TiEntity { @TiColumn(value="id",comment="订单号",nullAble=false,key=true,keyGenerateFactory = UUIDFactory.class) private java.lang.String id; @TiColumn(value="status",comment="订单状态,0未支付,1已支付,2待发货,3已发货,4待收货,5已完成") private java.lang.Integer status; @TiColumn(value="order_time",comment="下单时间",fieldMatchTypeFactory = LeTypeFactory.class)//更改默认类型匹配 private java.time.LocalDateTime orderTime; @TiColumn(value="total_money",comment="订单总金额") private java.math.BigDecimal totalMoney; @TiColumn(value="actual_amount_paid",comment="实际支付金额") private java.math.BigDecimal actualAmountPaid; @TiColumn(value="payment",comment="支付方式") private java.lang.String payment; @TiColumn(value="user_id",comment="顾客ID") private java.lang.String userId; @TiColumn(value="user_name",comment="顾客昵称") private java.lang.String userName; public void setId(java.lang.String id){this.id=id;} public java.lang.String getId(){return this.id;} public void setStatus(java.lang.Integer status){this.status=status;} public java.lang.Integer getStatus(){return this.status;} public void setOrderTime(java.time.LocalDateTime orderTime){this.orderTime=orderTime;} public java.time.LocalDateTime getOrderTime(){return this.orderTime;} public void setTotalMoney(java.math.BigDecimal totalMoney){this.totalMoney=totalMoney;} public java.math.BigDecimal getTotalMoney(){return this.totalMoney;} public void setActualAmountPaid(java.math.BigDecimal actualAmountPaid){this.actualAmountPaid=actualAmountPaid;} public java.math.BigDecimal getActualAmountPaid(){return this.actualAmountPaid;} public void setPayment(java.lang.String payment){this.payment=payment;} public java.lang.String getPayment(){return this.payment;} public void setUserId(java.lang.String userId){this.userId=userId;} public java.lang.String getUserId(){return this.userId;} public void setUserName(java.lang.String userName){this.userName=userName;} public java.lang.String getUserName(){return this.userName;} @Override public String toString() { return "Order{"+ "id="+id+","+ "status="+status+","+ "orderTime="+orderTime+","+ "totalMoney="+totalMoney+","+ "actualAmountPaid="+actualAmountPaid+","+ "payment="+payment+","+ "userId="+userId+","+ "userName="+userName+ "}"; } } ``` *** ```java package com.example.tisimple.domain; import we.us.tisimple.ability.TiEntity; import we.us.tisimple.annotation.TiColumn; import we.us.tisimple.annotation.TiTable; @TiTable(value="s_user") public class User extends TiEntity { @TiColumn(value="id",comment="主键",nullAble=false,key=true) private java.lang.Integer id; @TiColumn(value="name",comment="用户名") private java.lang.String name; @TiColumn(value="age",comment="年龄") private java.lang.Integer age; @TiColumn(value="address",comment="地址") private java.lang.String address; public void setId(java.lang.Integer id){this.id=id;} public java.lang.Integer getId(){return this.id;} public void setName(java.lang.String name){this.name=name;} public java.lang.String getName(){return this.name;} public void setAge(java.lang.Integer age){this.age=age;} public java.lang.Integer getAge(){return this.age;} public void setAddress(java.lang.String address){this.address=address;} public java.lang.String getAddress(){return this.address;} @Override public String toString() { return "User{"+ "id="+id+","+ "name="+name+","+ "age="+age+","+ "address="+address+ "}"; } } ``` ```java package com.example.tisimple.domain; import we.us.tisimple.ability.TiEntity; import we.us.tisimple.annotation.TiColumn; import we.us.tisimple.annotation.TiTable; @TiTable(value="m_type",wrapChar = "`") public class MysqlType extends TiEntity { @TiColumn(value="id",nullAble=false,key=true) private java.lang.String id; @TiColumn(value="order",nullAble=false) private java.lang.Integer order; @TiColumn(value="TINYINT") private java.lang.Integer tinyint; @TiColumn(value="SMALLINT") private java.lang.Integer smallint; @TiColumn(value="INTEGER") private java.lang.Integer integer; @TiColumn(value="BIGINT") private java.lang.Long bigint; @TiColumn(value="DECIMAL") private java.math.BigDecimal decimal; @TiColumn(value="DATE") private java.sql.Date date; @TiColumn(value="TIME") private java.lang.String time; @TiColumn(value="YEAR") private java.sql.Date year;//year类型的对应java中date类型,是无法进行正常插入的 @TiColumn(value="DATETIME") private java.time.LocalDateTime datetime; @TiColumn(value="TIMESTAMP") private java.sql.Timestamp timestamp; @TiColumn(value="CHAR") private java.lang.String char1; @TiColumn(value="VARCHAR") private java.lang.String varchar; @TiColumn(value="TINYBLOB") private byte[] tinyblob; @TiColumn(value="TINYTEXT") private java.lang.String tinytext; @TiColumn(value="BLOB") private byte[] blob; @TiColumn(value="TEXT") private java.lang.String text; @TiColumn(value="MEDIUMBLOB") private byte[] mediumblob; @TiColumn(value="MEDIUMTEXT") private java.lang.String mediumtext; @TiColumn(value="LONGBLOB") private byte[] longblob; @TiColumn(value="LONGTEXT") private java.lang.String longtext; public void setId(java.lang.String id){this.id=id;} public java.lang.String getId(){return this.id;} public void setOrder(java.lang.Integer order){this.order=order;} public java.lang.Integer getOrder(){return this.order;} public void setTinyint(java.lang.Integer tinyint){this.tinyint=tinyint;} public java.lang.Integer getTinyint(){return this.tinyint;} public void setSmallint(java.lang.Integer smallint){this.smallint=smallint;} public java.lang.Integer getSmallint(){return this.smallint;} public void setInteger(java.lang.Integer integer){this.integer=integer;} public java.lang.Integer getInteger(){return this.integer;} public void setBigint(java.lang.Long bigint){this.bigint=bigint;} public java.lang.Long getBigint(){return this.bigint;} public void setDecimal(java.math.BigDecimal decimal){this.decimal=decimal;} public java.math.BigDecimal getDecimal(){return this.decimal;} public void setDate(java.sql.Date date){this.date=date;} public java.sql.Date getDate(){return this.date;} public void setTime(java.lang.String time){this.time=time;} public java.lang.String getTime(){return this.time;} public void setYear(java.sql.Date year){this.year=year;} public java.sql.Date getYear(){return this.year;} public void setDatetime(java.time.LocalDateTime datetime){this.datetime=datetime;} public java.time.LocalDateTime getDatetime(){return this.datetime;} public void setTimestamp(java.sql.Timestamp timestamp){this.timestamp=timestamp;} public java.sql.Timestamp getTimestamp(){return this.timestamp;} public void setChar(java.lang.String char1){this.char1=char1;} public java.lang.String getChar(){return this.char1;} public void setVarchar(java.lang.String varchar){this.varchar=varchar;} public java.lang.String getVarchar(){return this.varchar;} public void setTinyblob(byte[] tinyblob){this.tinyblob=tinyblob;} public byte[] getTinyblob(){return this.tinyblob;} public void setTinytext(java.lang.String tinytext){this.tinytext=tinytext;} public java.lang.String getTinytext(){return this.tinytext;} public void setBlob(byte[] blob){this.blob=blob;} public byte[] getBlob(){return this.blob;} public void setText(java.lang.String text){this.text=text;} public java.lang.String getText(){return this.text;} public void setMediumblob(byte[] mediumblob){this.mediumblob=mediumblob;} public byte[] getMediumblob(){return this.mediumblob;} public void setMediumtext(java.lang.String mediumtext){this.mediumtext=mediumtext;} public java.lang.String getMediumtext(){return this.mediumtext;} public void setLongblob(byte[] longblob){this.longblob=longblob;} public byte[] getLongblob(){return this.longblob;} public void setLongtext(java.lang.String longtext){this.longtext=longtext;} public java.lang.String getLongtext(){return this.longtext;} @Override public String toString() { return "MysqlType{"+ "id="+id+","+ "order="+order+","+ "tinyint="+tinyint+","+ "smallint="+smallint+","+ "integer="+integer+","+ "bigint="+bigint+","+ "decimal="+decimal+","+ "date="+date+","+ "time="+time+","+ "year="+year+","+ "datetime="+datetime+","+ "timestamp="+timestamp+","+ "char="+char1+","+ "varchar="+varchar+","+ "tinyblob="+tinyblob+","+ "tinytext="+tinytext+","+ "blob="+blob+","+ "text="+text+","+ "mediumblob="+mediumblob+","+ "mediumtext="+mediumtext+","+ "longblob="+longblob+","+ "longtext="+longtext+ "}"; } } ``` *** >多表查询结果实体定义示例 ```java package com.example.tisimple.domain; import we.us.tisimple.ability.TiEntity; import we.us.tisimple.annotation.TiColumn; public class Example extends TiEntity { private Integer age; @TiColumn("order_id") private String orderId; @TiColumn("user_name") private String userName; @Override public String toString() { return "Example{" + "age=" + age + ", orderId='" + orderId + '\'' + ", userName='" + userName + '\'' + '}'; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } } ``` ### 更新 > 2022-1-10 文本版本 ***v1.0.0*** > > 2022-1-11 文本版本 ***v1.1.0*** > > 2022-1-12 文本版本 ***v1.1.1*** >