您好,登錄后才能下訂單哦!
學(xué)習(xí)BeetlSQL總結(jié)(1)
一.BeetlSQL特點(diǎn):
1.開發(fā)效率:
(1)無(wú)需注解,能自動(dòng)使用大量的內(nèi)置sql,快速完成增,刪,改,查的功能
(2)數(shù)據(jù)模型支持Pojo,也支持Map/List這種快速模型,也支持混合模型
(3)SQL模板基于B eetl實(shí)現(xiàn),更容易寫和調(diào)試,以及擴(kuò)展
(4)可以針對(duì)單個(gè)表(或者視圖)生成Pojo類和sql模型,甚至是整個(gè)數(shù)據(jù)庫(kù),能有效的減少代碼的編寫量
2.維護(hù)性:
(1)SQL以更加簡(jiǎn)潔的方式,Markdown方式集中管理,同時(shí)方便程序的開發(fā)和數(shù)據(jù)庫(kù)sql的調(diào)試
(2)可以自動(dòng)將sql文件自動(dòng)映射為dao接口類
(3)靈活直觀的支持一對(duì)一,一對(duì)多,多對(duì)多的關(guān)系映射而不引入復(fù)雜的OR Maping概念和技術(shù)
(4)具備Interceptor功能,可以調(diào)試,性能診斷SQL,以及擴(kuò)展其他的功能
3.其他:
(1)內(nèi)置支持主從數(shù)據(jù)庫(kù)支持的開源工具
(2)性能數(shù)倍于JPA,Mybatis
(3)支持跨數(shù)據(jù)庫(kù)平臺(tái),將開發(fā)者的工作量減少到最少,目前支持的跨數(shù)據(jù)庫(kù)有mysql,postgres,oracle,sqlserver,h3,sqllite,DB2
二,以mevan工程為例(理解BeetlSQL)
因?yàn)槲乙呀?jīng)完成了本次所展示的所有代碼,所以提前展示一下代碼結(jié)構(gòu)
1.創(chuàng)建mevan工程(BeetlSQL)
我已經(jīng)創(chuàng)建好了mevan工程,結(jié)構(gòu)如下:
2.添加BeetlSQL框架(配置pom.xml)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.dhcc.beetl</groupId>
<artifactId>BeetlSQL</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>BeetlSQL Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 單元測(cè)試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 2.日志 -->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- Beetl SQL框架相關(guān)包 -->
<!-- https://mvnrepository.com/artifact/com.ibeetl/beetl -->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>2.8.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.ibeetl/beetlsql -->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetlsql</artifactId>
<version>2.10.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>
<build>
<finalName>BeetlSQL</finalName>
</build>
</project>
3.因?yàn)槲覀兪且獙?duì)數(shù)據(jù)庫(kù)進(jìn)行操作,所以第二步我們創(chuàng)建數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)表
CREATE DATABASE beetlsql;
USE beetlsql;
CREATE TABLE USER(
id INT(11) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(64) DEFAULT NULL,
age INT(4) DEFAULT NULL,
username VARCHAR(64) DEFAULT NULL COMMENT '用戶名',
roleId INT(11) DEFAULT NULL COMMENT '用戶角色',
create_date DATETIME NULL DEFAULT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
4.接下來編寫數(shù)據(jù)表user對(duì)應(yīng)的entity實(shí)體類(后面將展示代碼自動(dòng)生成)
package cn.com.dhcc.beetlsql.entity;
import java.util.Date;
//用戶實(shí)體類
public class User {
private Integer id;
private Integer age;
//用戶角色
private Integer roleId;
private String name;
//用戶名稱
private String userName;
private Date createDate;
public User() {
}
public User(Integer id, Integer age, Integer roleId, String name, String userName, Date createDate) {
super();
this.id = id;
this.age = age;
this.roleId = roleId;
this.name = name;
this.userName = userName;
this.createDate = createDate;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
@Override
public String toString() {
return "User [id=" + id + ", age=" + age + ", roleId=" + roleId + ", name=" + name + ", userName=" + userName
+ ", createDate=" + createDate + "]";
}
}
5.下來我們寫一個(gè)main方法來對(duì)BeetlSQL進(jìn)行功能測(cè)試以及理解
(1)建立數(shù)據(jù)庫(kù)的連接,這里我們沒有寫配置文件,各項(xiàng)數(shù)據(jù)庫(kù)連接所需參數(shù)就在主方法中設(shè)定
String mysqlDriver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/beetlsql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false";
String userName="root";
String password="qitao1996";
ConnectionSource source=ConnectionSourceHelper.getSimple(mysqlDriver, url, userName, password);
DBStyle mysql=new MySqlStyle();
//SQL語(yǔ)句放于classpath的sql目錄下
SQLLoader loader=new ClasspathLoader("/sql");
//數(shù)據(jù)庫(kù)命名和java命名一樣,所以采用DefaultNameConversion,還有一個(gè)UnderlinedNameConversion下劃線風(fēng)格的
UnderlinedNameConversion nc=new UnderlinedNameConversion();
//最后,創(chuàng)建一個(gè)SQLManager,DebugInterceptor,不是必須的,但可以通過它查看SQL的執(zhí)行情況
SQLManager sqlManager=new SQLManager(mysql, loader,source,nc,new Interceptor[]{new DebugInterceptor()});
(2)接下里我們就先使用內(nèi)置的sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)表進(jìn)行操作,代碼如下
//1.使用內(nèi)置的生成的sql新增用戶,如果需要獲取主鍵,可以傳入KeyHolder
System.out.println("開始使用內(nèi)置sql進(jìn)行用戶添加...");
User user=new User();
user.setAge(19);
user.setName("曼斯坦因");
int num=sqlManager.insert(user);
if(num>0) {
System.out.println("使用內(nèi)置sql用戶添加成功!!!!");
}
//2.使用內(nèi)置sql查詢用戶
int id=1;
System.out.println("開始使用內(nèi)置sql進(jìn)行用戶查詢...");
user=sqlManager.unique(User.class, id);
System.out.println("使用內(nèi)置sql進(jìn)行用戶查詢完畢??!");
//3.更新(修改)數(shù)據(jù),僅僅根據(jù)id更新值不為null的列
System.out.println("開始使用內(nèi)置sql更新用戶信息...");
User newUser=new User();
newUser.setId(1);
newUser.setName("朱可夫");
int num1=sqlManager.updateTemplateById(newUser);
if(num1>0) {
System.out.println("使用內(nèi)置sql更新用戶信息成功!!!!");
}
//4.模板查詢
User query=new User();
query.setName("曼斯坦因");
System.out.println("開始進(jìn)行模板查詢...");
List<User> userList=sqlManager.template(query);
System.out.println("打印查詢結(jié)果:");
for(User u:userList) {
System.out.println(u);
}
System.out.println("使用模板查詢成功...");
執(zhí)行結(jié)果如下:
開始使用內(nèi)置sql進(jìn)行用戶添加...
┏━━━━━ Debug [user._gen_insert] ━━━
┣ SQL: insert into user
(name
,age
,create_date
) VALUES (?,?,?)
┣ 參數(shù): [曼斯坦因, 19, null]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:52)
┣ 時(shí)間: 319ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_insert] ━━━
使用內(nèi)置sql用戶添加成功!!!!
開始使用內(nèi)置sql進(jìn)行用戶查詢...
┏━━━━━ Debug [user._gen_selectById] ━━━
┣ SQL: select * from user
where id
= ?
┣ 參數(shù): [1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:60)
┣ 時(shí)間: 37ms
┣ 結(jié)果: [User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]]
┗━━━━━ Debug [user._gen_selectById] ━━━
使用內(nèi)置sql進(jìn)行用戶查詢完畢!!
開始使用內(nèi)置sql更新用戶信息...
┏━━━━━ Debug [user._gen_updateTemplateById] ━━━
┣ SQL: update user
set name
=? where id
= ?
┣ 參數(shù): [朱可夫, 1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:68)
┣ 時(shí)間: 168ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_updateTemplateById] ━━━
使用內(nèi)置sql更新用戶信息成功!!!!
開始進(jìn)行模板查詢...
┏━━━━━ Debug [user._gen_selectByTemplate] ━━━
┣ SQL: select * from user
where 1=1 and name
=?
┣ 參數(shù): [曼斯坦因]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:77)
┣ 時(shí)間: 91ms
┣ 結(jié)果: [10]
┗━━━━━ Debug [user._gen_selectByTemplate] ━━━
打印查詢結(jié)果:
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
使用模板查詢成功...
開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數(shù): []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時(shí)間: 78ms
┣ 結(jié)果: [11]
┗━━━━━ Debug [user.select] ━━━
User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
(3)展示代碼生成:
##1.我們先在數(shù)據(jù)庫(kù)中建立一張person表,用以生成Pojo類以及sql
CREATE TABLE person(
id INT(11) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(64) DEFAULT NULL,
age INT(4) DEFAULT NULL,
pername VARCHAR(64) DEFAULT NULL COMMENT '人名',
roleId INT(11) DEFAULT NULL COMMENT '個(gè)人角色',
create_date DATETIME NULL DEFAULT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
##2.用以生成代碼的代碼:
//利用genPojoCodeToConsole 生成代碼
System.out.println("開始生成代碼:");
try {
sqlManager.genPojoCodeToConsole("person");
sqlManager.genSQLTemplateToConsole("person");
sqlManager.genSQLTemplateToConsole("user");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("代碼生成結(jié)束....");
執(zhí)行結(jié)果:
開始生成代碼:
package com.test;
import java.math.*;
import java.util.Date;
import java.sql.Timestamp;
import org.beetl.sql.core.annotatoin.Table;
/*
gen by beetlsql 2018-08-17*/
@Table(name="beetlsql.person")
br/>*/
@Table(name="beetlsql.person")
private Integer id ;
private Integer age ;
/
個(gè)人角色
/
private Integer roleid ;
private String name ;
/
人名
/
private String pername ;
private Date createDate ;
public Person() {
}
public Integer getId(){
return id;
}
public void setId(Integer id ){
this.id = id;
}
public Integer getAge(){
return age;
}
public void setAge(Integer age ){
this.age = age;
}
/**
public String getName(){
return name;
}
public void setName(String name ){
this.name = name;
}
/**
public Date getCreateDate(){
return createDate;
}
public void setCreateDate(Date createDate ){
this.createDate = createDate;
}
}
注釋
select #use("cols")# from person where #use("condition")#
id,NAME,age,pername,roleId,create_date
id=#id#,NAME=#name#,age=#age#,pername=#pername#,roleId=#roleid#,create_date=#createDate#
1 = 1
@if(!isEmpty(id)){
and id=#id#
@}
@if(!isEmpty(name)){
and NAME=#name#
@}
@if(!isEmpty(age)){
and age=#age#
@}
@if(!isEmpty(pername)){
and pername=#pername#
@}
@if(!isEmpty(roleid)){
and roleId=#roleid#
@}
@if(!isEmpty(createDate)){
and create_date=#createDate#
@}
sample
===
注釋
select #use("cols")# from user where #use("condition")#
id,name,age,username,roleId,create_date
id=#id#,name=#name#,age=#age#,username=#username#,roleId=#roleid#,create_date=#createDate#
1 = 1
@if(!isEmpty(id)){
and id=#id#
@}
@if(!isEmpty(name)){
and name=#name#
@}
@if(!isEmpty(age)){
and age=#age#
@}
@if(!isEmpty(username)){
and username=#username#
@}
@if(!isEmpty(roleid)){
and roleId=#roleid#
@}
@if(!isEmpty(createDate)){
and create_date=#createDate#
@}
(4)利用外部sql文件進(jìn)行數(shù)據(jù)庫(kù)表的操作
##1.編寫md格式的sql文件結(jié)構(gòu)以及內(nèi)容如下(以查詢?yōu)槔?/p>
select
====
select * from user where 1=1
@if(!isEmpty(age)){
and age=#age#
@}
@if(!isEmpty(name)){
and name=#name#
@}
##2.主方法代碼
//5.利用sql文件中sql語(yǔ)句進(jìn)行查詢
User query2 = new User();
query.setName("xiandafu");
System.out.println("開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....");
List<User> list2 = sqlManager.select("user.select",User.class,query2);
for(User u:list2) {
System.out.println(u);
}
System.out.println("sql文件中sql語(yǔ)句進(jìn)行查詢成功...");
執(zhí)行結(jié)果:
開始使用sql文件中sql語(yǔ)句進(jìn)行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數(shù): []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時(shí)間: 78ms
┣ 結(jié)果: [11]
┗━━━━━ Debug [user.select] ━━━
User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]
User [id=2, age=19, roleId=null, name=曼斯坦因, userName=mansitanying, createDate=null]
User [id=3, age=19, roleId=null, name=曼斯坦因, userName=deguoyuanshuai, createDate=null]
User [id=4, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=5, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=6, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=7, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=8, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=9, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=10, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
User [id=11, age=19, roleId=null, name=曼斯坦因, userName=null, createDate=null]
sql文件中sql語(yǔ)句進(jìn)行查詢成功...
這里我們看見了sql文件,本章不做詳細(xì)說明,我們先來簡(jiǎn)單的了解一下sql問價(jià)可能的編寫(5)簡(jiǎn)單了解sql文件的編寫
##1.采用md格式,===上面是sql語(yǔ)句的唯一標(biāo)示,下面則是sql語(yǔ)句
##2.@和回車符是定界符號(hào),可以在里面寫beetl語(yǔ)句
br/>(5)簡(jiǎn)單了解sql文件的編寫
##1.采用md格式,===上面是sql語(yǔ)句的唯一標(biāo)示,下面則是sql語(yǔ)句
##2.@和回車符是定界符號(hào),可以在里面寫beetl語(yǔ)句
##4.isEmpty是beetll的一個(gè)函數(shù),用來判斷變量是否為空或者是否不存在
##5.文件名約定為類名,首字母小寫
(6)sqlId到sql文件的映射
sqlId 到sql文件的映射是通過類SQLIdNameConversion來完成的,默認(rèn)提供了DefaultSQLIdNameConversion實(shí)現(xiàn),即 以 "." 區(qū)分最后一部分是sql片段名字,前面轉(zhuǎn)為為文件相對(duì)路徑,如sqlId是user.select,則select是sql片段名字,user是文件名,beetlsql會(huì)在根目錄下尋找/user.sql,/user.md ,也會(huì)找數(shù)據(jù)庫(kù)方言目錄下尋找,比如如果使用了mysql數(shù)據(jù)庫(kù),則優(yōu)先尋找/mysql/user.md,/mysql/user.sql 然后在找/user.md,/user.sql.
如果sql是 test.user.select,則會(huì)在/test/user.md(sql) 或者 /mysql/test/user.md(sql) 下尋找“select”片段
【本次總結(jié)完畢】
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。