您好,登錄后才能下訂單哦!
學習BeetlSQL總結(1)
一.BeetlSQL特點:
1.開發效率:
(1)無需注解,能自動使用大量的內置sql,快速完成增,刪,改,查的功能
(2)數據模型支持Pojo,也支持Map/List這種快速模型,也支持混合模型
(3)SQL模板基于B eetl實現,更容易寫和調試,以及擴展
(4)可以針對單個表(或者視圖)生成Pojo類和sql模型,甚至是整個數據庫,能有效的減少代碼的編寫量
2.維護性:
(1)SQL以更加簡潔的方式,Markdown方式集中管理,同時方便程序的開發和數據庫sql的調試
(2)可以自動將sql文件自動映射為dao接口類
(3)靈活直觀的支持一對一,一對多,多對多的關系映射而不引入復雜的OR Maping概念和技術
(4)具備Interceptor功能,可以調試,性能診斷SQL,以及擴展其他的功能
3.其他:
(1)內置支持主從數據庫支持的開源工具
(2)性能數倍于JPA,Mybatis
(3)支持跨數據庫平臺,將開發者的工作量減少到最少,目前支持的跨數據庫有mysql,postgres,oracle,sqlserver,h3,sqllite,DB2
二,以mevan工程為例(理解BeetlSQL)
因為我已經完成了本次所展示的所有代碼,所以提前展示一下代碼結構
1.創建mevan工程(BeetlSQL)
我已經創建好了mevan工程,結構如下:
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>
<!-- 單元測試 -->
<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框架相關包 -->
<!-- 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.因為我們是要對數據庫進行操作,所以第二步我們創建數據庫及數據庫表
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.接下來編寫數據表user對應的entity實體類(后面將展示代碼自動生成)
package cn.com.dhcc.beetlsql.entity;
import java.util.Date;
//用戶實體類
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.下來我們寫一個main方法來對BeetlSQL進行功能測試以及理解
(1)建立數據庫的連接,這里我們沒有寫配置文件,各項數據庫連接所需參數就在主方法中設定
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語句放于classpath的sql目錄下
SQLLoader loader=new ClasspathLoader("/sql");
//數據庫命名和java命名一樣,所以采用DefaultNameConversion,還有一個UnderlinedNameConversion下劃線風格的
UnderlinedNameConversion nc=new UnderlinedNameConversion();
//最后,創建一個SQLManager,DebugInterceptor,不是必須的,但可以通過它查看SQL的執行情況
SQLManager sqlManager=new SQLManager(mysql, loader,source,nc,new Interceptor[]{new DebugInterceptor()});
(2)接下里我們就先使用內置的sql語句對數據庫表進行操作,代碼如下
//1.使用內置的生成的sql新增用戶,如果需要獲取主鍵,可以傳入KeyHolder
System.out.println("開始使用內置sql進行用戶添加...");
User user=new User();
user.setAge(19);
user.setName("曼斯坦因");
int num=sqlManager.insert(user);
if(num>0) {
System.out.println("使用內置sql用戶添加成功!!!!");
}
//2.使用內置sql查詢用戶
int id=1;
System.out.println("開始使用內置sql進行用戶查詢...");
user=sqlManager.unique(User.class, id);
System.out.println("使用內置sql進行用戶查詢完畢!!");
//3.更新(修改)數據,僅僅根據id更新值不為null的列
System.out.println("開始使用內置sql更新用戶信息...");
User newUser=new User();
newUser.setId(1);
newUser.setName("朱可夫");
int num1=sqlManager.updateTemplateById(newUser);
if(num1>0) {
System.out.println("使用內置sql更新用戶信息成功!!!!");
}
//4.模板查詢
User query=new User();
query.setName("曼斯坦因");
System.out.println("開始進行模板查詢...");
List<User> userList=sqlManager.template(query);
System.out.println("打印查詢結果:");
for(User u:userList) {
System.out.println(u);
}
System.out.println("使用模板查詢成功...");
執行結果如下:
開始使用內置sql進行用戶添加...
┏━━━━━ Debug [user._gen_insert] ━━━
┣ SQL: insert into user
(name
,age
,create_date
) VALUES (?,?,?)
┣ 參數: [曼斯坦因, 19, null]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:52)
┣ 時間: 319ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_insert] ━━━
使用內置sql用戶添加成功!!!!
開始使用內置sql進行用戶查詢...
┏━━━━━ Debug [user._gen_selectById] ━━━
┣ SQL: select * from user
where id
= ?
┣ 參數: [1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:60)
┣ 時間: 37ms
┣ 結果: [User [id=1, age=19, roleId=null, name=朱可夫, userName=null, createDate=null]]
┗━━━━━ Debug [user._gen_selectById] ━━━
使用內置sql進行用戶查詢完畢!!
開始使用內置sql更新用戶信息...
┏━━━━━ Debug [user._gen_updateTemplateById] ━━━
┣ SQL: update user
set name
=? where id
= ?
┣ 參數: [朱可夫, 1]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:68)
┣ 時間: 168ms
┣ 更新: [1]
┗━━━━━ Debug [user._gen_updateTemplateById] ━━━
使用內置sql更新用戶信息成功!!!!
開始進行模板查詢...
┏━━━━━ Debug [user._gen_selectByTemplate] ━━━
┣ SQL: select * from user
where 1=1 and name
=?
┣ 參數: [曼斯坦因]
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:77)
┣ 時間: 91ms
┣ 結果: [10]
┗━━━━━ Debug [user._gen_selectByTemplate] ━━━
打印查詢結果:
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語句進行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數: []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時間: 78ms
┣ 結果: [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.我們先在數據庫中建立一張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 '個人角色',
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("代碼生成結束....");
執行結果:
開始生成代碼:
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 ;
/
個人角色
/
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文件進行數據庫表的操作
##1.編寫md格式的sql文件結構以及內容如下(以查詢為例)
select
====
select * from user where 1=1
@if(!isEmpty(age)){
and age=#age#
@}
@if(!isEmpty(name)){
and name=#name#
@}
##2.主方法代碼
//5.利用sql文件中sql語句進行查詢
User query2 = new User();
query.setName("xiandafu");
System.out.println("開始使用sql文件中sql語句進行查詢....");
List<User> list2 = sqlManager.select("user.select",User.class,query2);
for(User u:list2) {
System.out.println(u);
}
System.out.println("sql文件中sql語句進行查詢成功...");
執行結果:
開始使用sql文件中sql語句進行查詢....
┏━━━━━ Debug [user.select] ━━━
┣ SQL: select * from user where 1=1
┣ 參數: []
┣ 位置: main.TestBeetlSQL.main(TestBeetlSQL.java:88)
┣ 時間: 78ms
┣ 結果: [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語句進行查詢成功...
這里我們看見了sql文件,本章不做詳細說明,我們先來簡單的了解一下sql問價可能的編寫(5)簡單了解sql文件的編寫
##1.采用md格式,===上面是sql語句的唯一標示,下面則是sql語句
##2.@和回車符是定界符號,可以在里面寫beetl語句
br/>(5)簡單了解sql文件的編寫
##1.采用md格式,===上面是sql語句的唯一標示,下面則是sql語句
##2.@和回車符是定界符號,可以在里面寫beetl語句
##4.isEmpty是beetll的一個函數,用來判斷變量是否為空或者是否不存在
##5.文件名約定為類名,首字母小寫
(6)sqlId到sql文件的映射
sqlId 到sql文件的映射是通過類SQLIdNameConversion來完成的,默認提供了DefaultSQLIdNameConversion實現,即 以 "." 區分最后一部分是sql片段名字,前面轉為為文件相對路徑,如sqlId是user.select,則select是sql片段名字,user是文件名,beetlsql會在根目錄下尋找/user.sql,/user.md ,也會找數據庫方言目錄下尋找,比如如果使用了mysql數據庫,則優先尋找/mysql/user.md,/mysql/user.sql 然后在找/user.md,/user.sql.
如果sql是 test.user.select,則會在/test/user.md(sql) 或者 /mysql/test/user.md(sql) 下尋找“select”片段
【本次總結完畢】
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。