# sqltoy-helloworld **Repository Path**: sagacity/sqltoy-helloworld ## Basic Information - **Project Name**: sqltoy-helloworld - **Description**: 这是sqltoy的开源演示项目 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 12 - **Forks**: 1 - **Created**: 2021-04-19 - **Last Updated**: 2025-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 快速搭建sqltoy项目的步骤 ## 1、创建一个springboot项目,并配置好数据源 * 创建应用入口主程序 ```java @SpringBootApplication @ComponentScan(basePackages = { "com.sqltoy.helloworld" }) @EnableTransactionManagement public class SqlToyApplication { /** * @param args */ public static void main(String[] args) { SpringApplication.run(SqlToyApplication.class, args); } } ``` * 数据库连接池使用hikari(可根据自己喜好自由选择) ```xml org.springframework.boot spring-boot-starter-jdbc 3.4.6 ``` * 配置application.yml ```yml spring: datasource: name: dataSource type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver username: helloworld password: helloworld isAutoCommit: false url: jdbc:mysql://127.0.0.1:3306/helloworld?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true sqltoy: #非必选项,设置sql.xml文件存放路径(会自动向下扫描,多路径范例:classpath:com/sqltoy/helloworld,classpath:com/sqltoy/system sqlResourcesDir: classpath:com/sqltoy/helloworld # 默认为false,debug模式将打印执行sql,并自动检测sql文件更新并重新加载 debug: true ``` ## 2、在pom.xml中引入sqltoy-orm-spring-starter * springboot场景 ```xml com.sagframe sagacity-sqltoy-spring-starter 5.6.49 ``` * solon场景 ```xml com.sagframe sagacity-sqltoy-solon-plugin 5.6.49 ``` ## 3、创建表:sqltoy_order_info ```sql DROP TABLE IF EXISTS SQLTOY_ORDER_INFO; CREATE TABLE SQLTOY_ORDER_INFO( `ORDER_ID` VARCHAR(32) NOT NULL COMMENT '订单编号' , `ORDER_TYPE` VARCHAR(32) COMMENT '订单类别' , `PRODUCT_CODE` VARCHAR(32) COMMENT '商品代码' , `UOM` VARCHAR(30) COMMENT '计量单位' , `PRICE` DECIMAL(24,6) COMMENT '价格' , `QUANTITY` DECIMAL(24,6) COMMENT '数量' , `TOTAL_AMT` DECIMAL(24,6) COMMENT '订单总金额' , `STAFF_CODE` VARCHAR(32) COMMENT '销售员' , `ORGAN_ID` VARCHAR(32) COMMENT '销售部门' , `STATUS` INT COMMENT '订单状态' , `CREATE_BY` VARCHAR(32) COMMENT '创建人' , `CREATE_TIME` DATETIME COMMENT '创建时间' , `UPDATE_BY` VARCHAR(32) COMMENT '更新人' , `UPDATE_TIME` DATETIME COMMENT '更新时间' , PRIMARY KEY (ORDER_ID) ) COMMENT = 'sqltoy订单信息演示表'; ``` ## 4、配置sqltoy生成pojo、dto的maven插件quickvo-maven-plugin * pom.xml中加入quickvo-maven-plugin ```xml com.sagframe quickvo-maven-plugin 1.0.7 ./src/main/resources/quickvo.xml ${project.basedir} com.mysql mysql-connector-j ${mysql.version} ``` * 在src/main/resources下面创建quickvo.xml 有关quickvo.xml的配置,详细请参见:[quickvo-maven-plugin](https://gitee.com/sagacity/maven-quickvo-plugin) ```xml ``` ## 5、执行quickvo,生成pojo和dto * 在项目根路径下执行:mvn quickvo:quickvo * 在src/main/java/目录下com.sqltoy.helloworld.dto包下面会生成OrderInfoVO.java * 在src/main/java/目录下com.sqltoy.helloworld.entity包下面会生成OrderInfo.java 会包含:@Entity、@Id、@Column 等描述对象跟数据库表关系的注解 ```java @Data @Accessors(chain = true) @Entity(tableName="sqltoy_order_info",comment="sqltoy订单信息演示表",pk_constraint="PRIMARY") public class OrderInfo implements Serializable { /** * */ private static final long serialVersionUID = 7200696852961513069L; /*---begin-auto-generate-don't-update-this-area--*/ /** * 订单编号 */ @Id(strategy="generator",generator="org.sagacity.sqltoy.plugins.id.impl.NanoTimeIdGenerator") @Column(name="ORDER_ID",comment="订单编号",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=false) private String orderId; /** * 订单类别 */ @Column(name="ORDER_TYPE",comment="订单类别",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String orderType; /** * 商品代码 */ @Column(name="PRODUCT_CODE",comment="商品代码",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String productCode; /** * 计量单位 */ @Column(name="UOM",comment="计量单位",length=30L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String uom; /** * 价格 */ @Column(name="PRICE",comment="价格",length=24L,scale=6,type=java.sql.Types.DECIMAL,nativeType="DECIMAL",nullable=true) private BigDecimal price; /** * 数量 */ @Column(name="QUANTITY",comment="数量",length=24L,scale=6,type=java.sql.Types.DECIMAL,nativeType="DECIMAL",nullable=true) private BigDecimal quantity; /** * 订单总金额 */ @Column(name="TOTAL_AMT",comment="订单总金额",length=24L,scale=6,type=java.sql.Types.DECIMAL,nativeType="DECIMAL",nullable=true) private BigDecimal totalAmt; /** * 销售员 */ @Column(name="STAFF_CODE",comment="销售员",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String staffCode; /** * 销售部门 */ @Column(name="ORGAN_ID",comment="销售部门",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String organId; /** * 订单状态 */ @Column(name="STATUS",comment="订单状态",length=10L,type=java.sql.Types.INTEGER,nativeType="INT",nullable=true) private Integer status; /** * 创建人 */ @Column(name="CREATE_BY",comment="创建人",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String createBy; /** * 创建时间 */ @Column(name="CREATE_TIME",comment="创建时间",length=19L,type=java.sql.Types.DATE,nativeType="DATETIME",nullable=true) private LocalDateTime createTime; /** * 更新人 */ @Column(name="UPDATE_BY",comment="更新人",length=32L,type=java.sql.Types.VARCHAR,nativeType="VARCHAR",nullable=true) private String updateBy; /** * 更新时间 */ @Column(name="UPDATE_TIME",comment="更新时间",length=19L,type=java.sql.Types.DATE,nativeType="DATETIME",nullable=true) private LocalDateTime updateTime; /** default constructor */ public OrderInfo() { } /** pk constructor */ public OrderInfo(String orderId) { this.orderId=orderId; } /*---end-auto-generate-don't-update-this-area--*/ } ``` ## 6、创建一个service和单元测试类 * 1、创建OrderInfoService接口 ```java package com.sqltoy.helloworld.service; import org.sagacity.sqltoy.model.Page; import com.sqltoy.helloworld.dto.OrderInfoVO; public interface OrderInfoService { /** * 创建订单 * * @param orderInfoVO */ public void createOrderInfo(OrderInfoVO orderInfoVO); /** * 分页查询订单信息 * * @param pageModel * @param queryMap * @return */ public Page searchOrderInfo(Page pageModel, Map queryMap); } ``` * 2、编写sql(注意这里是演示,并非一定要用xml写sql) * 参见路径:src/main/java:com.sqltoy.helloworld.sqltoy下面 ```xml =:beginTime] #[and t.create_time<=:endTime] ]]> ``` * 2、编写OrderInfoService实现类OrderInfoServiceImpl ```java /** * 订单服务逻辑实现 * * @author zhongxuchen * @date 2025/2/5 */ @Service("orderInfoService") public class OrderInfoServiceImpl implements OrderInfoService { // 注入sqltoy框架自带的LightDao @Autowired LightDao lightDao; // 所有单表操作对象化完成,类似jpa @Override @Transactional public void createOrderInfo(OrderInfoVO orderInfoVO) { // 调用框架自带的dto<-->pojo 映射方法创建Entity实例 OrderInfo orderInfoEntity = lightDao.convertType(orderInfoVO, OrderInfo.class); // 调用save完成保存 lightDao.save(orderInfoEntity); } // 复杂查询通过sql.xml 定义具体sql内容 @Override public Page searchOrderInfo(Page pageModel, Map queryMap) { String sql = """ select * from SQLTOY_ORDER_INFO t where 1=1 #[and t.status in (:statusAry)] #[and t.create_time>=:beginTime] #[and t.create_time<=:endTime] """; //sql可以是具体sql也可以是sqlId //return lightDao.findPage(pageModel, "helloworld_search_orderInfo", queryMap, OrderInfoVO.class); return lightDao.findPage(pageModel, sql, queryMap, OrderInfoVO.class); } } ``` * 3、编写单元测试类OrderInfoServiceTest ```java @SpringBootTest public class OrderInfoServiceTest { @Autowired OrderInfoService orderInfoService; @Test public void testCreateOrderInfo() { OrderInfoVO orderInfoVO = new OrderInfoVO(); orderInfoVO.setOrderType("PO"); orderInfoVO.setOrganId("T001"); orderInfoVO.setProductCode("P0001"); orderInfoVO.setPrice(BigDecimal.valueOf(100)); orderInfoVO.setQuantity(BigDecimal.valueOf(100)); orderInfoVO.setTotalAmt(BigDecimal.valueOf(10000)); orderInfoVO.setUom("KG"); orderInfoVO.setStaffCode("S0001"); orderInfoVO.setStatus(1); // 定义SqlToyUnifyFieldsHandler公共字段赋值后,就无需设置 // orderInfoVO.setCreateBy("S0001"); // orderInfoVO.setCreateTime(LocalDateTime.now()); // orderInfoVO.setUpdateBy("S0001"); // orderInfoVO.setUpdateTime(LocalDateTime.now()); orderInfoService.createOrderInfo(orderInfoVO); } @Test public void testSearchOrderInfo() { Page pageModel = orderInfoService.searchOrderInfo(new Page(10, 1), MapKit.keys("statusAry", "beginTime", "endTime").values(new Integer[] { 1 }, LocalDateTime.parse("2024-10-17T00:00:01"), null)); System.err.println(JSON.toJSONString(pageModel)); } } ```