JOOQシリーズ(一)CRUD操作を実現
13468 ワード
一、JOOQとは
JOOQは、Javaアクセスリレーショナル・データベースに基づくツール・パッケージです.JOOQは、従来のORM操作データの単純性と安全性を吸収し、ORMSとJDBCの中間層のようなオリジナルsqlの柔軟性を維持しています.sqlを書くのが好きな私たちにとって、JOOQはあなたの制御欲を完全に満たすことができて、Javaコードでsqlを書く感じです.公式サイトが言ったように:
二、JOOQの長所DSL(Domain Specific Language)スタイル、コードは簡単ではっきりしている.書けないsqlに遭遇するとIDEAコードプロンプト機能を活用して簡単に完了できます.従来のORMの利点、シンプルな操作性、セキュリティ、タイプセキュリティなどが保持されています.複雑な構成を必要とせず、Java 8 Stream APIを利用してより複雑なデータ変換を行うことができます.主流のRDMSとself-joins,union,ストレージプロシージャ,複雑なサブクエリなど、より多くの特性をサポートします.豊富なFluent APIと完全なドキュメント.runtime schema mappingは、複数のデータベースschemaアクセスをサポートします.簡単に言えば1つの接続プールを使ってN個のDB schemaにアクセスでき、比較的多く使われているのがSaaSアプリケーションのマルチテナントシーンです.
三、例
オリジナルSQL:
JOOQの文法は、
四、JOOQ実現の添削
POM.XMLには、次の依存関係が追加されます.
druid.propertiesデータベース接続情報:
Druid接続クラス:
Druidツールクラス:
JOOQ試験類:
JOOQは、Javaアクセスリレーショナル・データベースに基づくツール・パッケージです.JOOQは、従来のORM操作データの単純性と安全性を吸収し、ORMSとJDBCの中間層のようなオリジナルsqlの柔軟性を維持しています.sqlを書くのが好きな私たちにとって、JOOQはあなたの制御欲を完全に満たすことができて、Javaコードでsqlを書く感じです.公式サイトが言ったように:
get back in control of your sql ( SQL)
二、JOOQの長所DSL(Domain Specific Language)スタイル、コードは簡単ではっきりしている.書けないsqlに遭遇するとIDEAコードプロンプト機能を活用して簡単に完了できます.従来のORMの利点、シンプルな操作性、セキュリティ、タイプセキュリティなどが保持されています.複雑な構成を必要とせず、Java 8 Stream APIを利用してより複雑なデータ変換を行うことができます.主流のRDMSとself-joins,union,ストレージプロシージャ,複雑なサブクエリなど、より多くの特性をサポートします.豊富なFluent APIと完全なドキュメント.runtime schema mappingは、複数のデータベースschemaアクセスをサポートします.簡単に言えば1つの接続プールを使ってN個のDB schemaにアクセスでき、比較的多く使われているのがSaaSアプリケーションのマルチテナントシーンです.
三、例
オリジナルSQL:
select * from `product` as `prod`
left outer join
(select `comment`.`product_id`,count(*) as `comment_num` from `comment`
where `commment`.`product_id`=?
group by `comment`.`product_id`
)
as `c1`
on `prod`.`id`=`c1`.`product_id`
where `prod`.`id`=?;
JOOQの文法は、
List products = dslContext.select()
.from(Tables.PRODUCT)
.leftJoin(DSL.table(
DSL.select(Comment.COMMENT.PRODUCT_ID, DSL.count().as("comment_num"))
.from(Tables.COMMENT)
.where(Comment.COMMENT.PRODUCT_ID.in(ids))
.groupBy(Comment.COMMENT.PRODUCT_ID)
).as("c1")
)
.on(Product.PRODUCT.ID.eq(DSL.field(DSL.name("c1",
Comment.COMMENT.PRODUCT_ID.getName()),UInteger.class)))
.where(Product.PRODUCT.ID.in(ids))
.fetch()
.map(record -> {
MyProduct product = record.into(MyProduct.class);
return product;
});
四、JOOQ実現の添削
POM.XMLには、次の依存関係が追加されます.
com.alibaba
druid
1.1.8
org.jooq
jooq
3.10.5
druid.propertiesデータベース接続情報:
#============================#
#===== =====#
#============================#
# MySQL
#driverClassName=com.mysql.jdbc.Driver
#url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false&useInformationSchema=true
#username=root
#password=root
# Oracle
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@106.14.160.67:1521:test
username=test
password=Eru43wPo
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
#validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
Druid接続クラス:
/**
* projectName: mybatis-generator-oracle
* fileName: DruidConnection.java
* packageName: com.fendo.gui.util
* date: 2018 2 27 9:16:36
* copyright(c) 2017-2020 fendo
*/
package com.fendo.gui.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
/**
* @title: DruidConnection.java
* @package com.fendo.gui.util
* @description: Druid
* @author: fendo
* @date: 2018 2 27 9:16:36
* @version: V1.0
*/
public class DruidConnection {
private static Properties properties = null;
private static DataSource dataSource = null;
private volatile static DruidConnection instatce = null;
private Connection connection = null;
public static String dbType = null;
// ,
private DruidConnection() {
}
static {
try {
properties = new Properties();
// 1. properties
InputStream is = DruidConnection.class.getClassLoader().getResourceAsStream("druid.properties");
// 2.
properties.load(is);
String propertiesString = properties.toString();
if(propertiesString.contains("oracle")) {
dbType = "oracle";
properties.put("remarksReporting","true");
}else {
dbType = "mysql";
}
// 3.
dataSource = getDatasource();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*
* @return
*/
public static DruidConnection getInstace() {
if (instatce == null) {
synchronized (DruidConnection.class) {
if (instatce == null) {
instatce = new DruidConnection();
}
}
}
return instatce;
}
//
public DataSource getDataSource() {
return dataSource;
}
//
public Connection getConnection() {
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//
private static DataSource getDatasource() {
DataSource source = null;
try {
source = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
return source;
}
/**
*
* @param string
*
* @return Properties
*/
private static Properties loadPropertiesFile(String fullFile) {
String webRootPath = null;
if (null == fullFile || fullFile.equals("")) {
throw new IllegalArgumentException("Properties file path can not be null" + fullFile);
}
webRootPath = DruidConnection.class.getClassLoader().getResource("").getPath();
webRootPath = new File(webRootPath).getParent();
InputStream inputStream = null;
Properties p = null;
try {
inputStream = new FileInputStream(new File(webRootPath + File.separator + fullFile));
p = new Properties();
p.load(inputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return p;
}
}
Druidツールクラス:
/**
* projectName: mybatis-generator-oracle
* fileName: DruidUtil.java
* packageName: com.fendo.gui.util
* date: 2018 2 27 9:15:55
* copyright(c) 2017-2020 fendo
*/
package com.fendo.gui.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
/**
* @title: DruidUtil.java
* @package com.fendo.gui.util
* @description: Druid
* @author: fendo
* @date: 2018 2 27 9:15:55
* @version: V1.0
*/
public class DruidUtil {
private static Connection connection = null;
//
public static DataSource getDatasource() {
DataSource dataSource = DruidConnection.getInstace().getDataSource();
return dataSource;
}
//
public static Connection getConnection() {
connection = DruidConnection.getInstace().getConnection();
return connection;
}
//
public void close() {
try {
if(connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs,Connection conn){
close(rs);
close(conn);
}
public static void close(ResultSet rs, Statement stmt,Connection conn){
close(rs);
close(stmt);
close(conn);
}
//
public static void close(Object o){
if (o == null){
return;
}
if (o instanceof ResultSet){
try {
((ResultSet)o).close();
} catch (SQLException e) {
e.printStackTrace();
}
} else if(o instanceof Statement){
try {
((Statement)o).close();
} catch (SQLException e) {
e.printStackTrace();
}
} else if (o instanceof Connection){
Connection c = (Connection)o;
try {
if (!c.isClosed()){
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JOOQ試験類:
/**
* projectName: mybatis-generator-oracle
* fileName: JooqDao.java
* packageName: com.fendo.gui.jooq
* date: 2018 2 27 9:27:02
* copyright(c) 2017-2020 fendo
*/
package com.fendo.gui.jooq;
import java.util.Map;
import java.util.Set;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SelectQuery;
import org.jooq.Table;
import org.jooq.UpdateQuery;
import org.jooq.impl.DSL;
import com.fendo.gui.util.DruidUtil;
/**
* @title: JooqDao.java
* @package com.fendo.gui.jooq
* @description: Jooq
* @author: fendo
* @date: 2018 2 27 9:27:02
* @version: V1.0
*/
public class JooqDao {
private DSLContext dslContext= null;
/**
*
*@title getdslContext
*@description: DSLContext
*@author: fendo
*@date: 2018 2 27 9:30:55
*@return
*@throws
*/
private DSLContext getdslContext()
{
//
dslContext = DSL.using(DruidUtil.getConnection());
return dslContext;
}
/**
*
*@title select
*@description: -
*@author: fendo
*@date: 2018 2 27 10:01:35
*@param add
*@throws
*/
public void select(String add)
{
DSLContext getdslContext = getdslContext();
Table table = DSL.table("user");
SelectQuery selectQuery = getdslContext.selectQuery(table);//
Condition eq = DSL.field("name").eq(add);//
selectQuery.addConditions(eq);//
Result fetch = selectQuery.fetch();
for (Object aResult : fetch) {
Record record = (Record) aResult;
System.out.println(record);
System.out.println(record.getValue("name"));
}
}
/**
*
*@title update
*@description:
*@author: fendo
*@date: 2018 2 27 10:01:07
*@param name
*@throws
*/
public void update(String name)
{
DSLContext getdslContext = getdslContext();
Table table = DSL.table("user");
UpdateQuery updateQuery = getdslContext.updateQuery(table);//
updateQuery.addValue(DSL.field("name"), "new-name");// email new-email
Condition eq = DSL.field("name").eq(name);// username name email
updateQuery.addConditions(eq);
int execute = updateQuery.execute();
System.out.println(execute);
select("dreamlu");
}
/**
*
*@title getVal
*@description: sql
*@author: fendo
*@date: 2018 2 27 10:01:15
*@throws
*/
public void getVal()
{
DSLContext getdslContext = getdslContext();
Table table = DSL.table("user");//
// Result fetch = getdslContext.select().from(table).where("status = 0").and("id > 1").orderBy(DSL.field("create_time").asc()).fetch();
// for (Object aResult : fetch) {
// Record record = (Record) aResult;
// System.out.println(record);
// }
Map fetchAnyMap = getdslContext.select().from(table).where("status = 0").and("id > 1").orderBy(DSL.field("create_time").asc()).fetchAnyMap();
Set keySet = fetchAnyMap.keySet();
for(String s:keySet)
{
System.out.println("key--"+s+"--val:"+fetchAnyMap.get(s));
}
}
/**
*
*@title exits
*@description: DSL.exists
*@author: fendo
*@date: 2018 2 27 10:01:24
*@throws
*/
public void exits()
{
DSLContext getdslContext = getdslContext();
Condition condition = DSL.exists(DSL.select(DSL.field("name")));
Table table = DSL.table("user");
SelectQuery selectQuery = getdslContext.selectQuery(table);
selectQuery.addConditions(condition);
Result fetch = selectQuery.fetch();
for (Object aResult : fetch) {
Record record = (Record) aResult;
System.out.println(record);
System.out.println(record.getValue("name"));
}
}
public static void main(String[] args) {
JooqDao jooqDao = new JooqDao();
jooqDao.select("admin");
// jooqDao.update("shangfox1");
// jooqDao.exits();
// jooqDao.getVal();
}
}