1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/calvinwilliams-sqlaction

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

sqlaction — Инструмент для работы с базой данных на основе автоматически сгенерированного кода JDBC.

Основные преимущества sqlaction:

  1. Поддержка нескольких систем управления базами данных (DBMS): MySQL, PostgreSQL, Oracle, SQLite, SQL Server.
  2. Абстрактное конфигурирование синтаксиса получения последнего вставленного ID строки или последовательности.
  3. Абстрактное конфигурирование синтаксиса физического пейджинга SQL.
  4. Более высокая производительность на 20% по сравнению с MyBatis.
  5. Поддержка сложных запросов в продвинутом режиме.

2. Пример использования

2.1. Создание таблицы DDL

Пример для MySQL

ddl.sql

CREATE TABLE `sqlaction_demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 'Название',
  `address` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Адрес',
  PRIMARY KEY (`id`),
  KEY `sqlaction_demo` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

2.2. Создание Java проекта

Добавьте JAR "mysql-connector-java-X.Y.Z.jar".

Создайте dbserver.conf.json в папке Java проекта.

{
	"driver": "com.mysql.jdbc.Driver",
	"url": "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT",
	"user": "calvin",
	"pwd": "calvin"
}

Создайте sqlaction.conf.json в папке Java проекта.

{
	"database": "calvindb",
	"tables": [
		{
			"table": "sqlaction_demo",
			"sqlactions": [
				"SELECT * FROM sqlaction_demo",
				"SELECT * FROM sqlaction_demo WHERE name = ?",
				"INSERT INTO sqlaction_demo",
				"UPDATE sqlaction_demo SET address = ? WHERE name = ?",
				"DELETE FROM sqlaction_demo WHERE name = ?"
			]
		}
	],
	"javaPackage": "xyz.calvinwilliams.sqlaction"
}
```## 2.3. Выполнение sqlaction

pp.bat```
java -Dfile.encoding=UTF-8 -classpath "D:\Work\mysql-connector-java-8.0.15\mysql-connector-java-8.0.15.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\okjson\0.0.9.0\okjson-0.0.9.0.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\sqlaction\0.2.7.0\sqlaction-0.2.7.0.jar" xyz.calvinwilliams.sqlaction.SqlActionGencode
пауза
```Выполнение pp.bat

```markdown
//////////////////////////////////////////////////////////////////////////////
/// sqlaction v0.2.9.0
/// Copyright © calvin <calvinwilliams@163.com, calvinwilliams@gmail.com>
//////////////////////////////////////////////////////////////////////////////
--- dbserverConf ---
  dbms[mysql]
driver[com.mysql.jdbc.Driver]
   url[jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT]
  user[calvin]
   pwd[calvin]
--- sqlactionConf ---
 database[calvindb]
        table[sqlaction_demo]
                sqlaction[SELECT * FROM sqlaction_demo]
                sqlaction[SELECT * FROM sqlaction_demo WHERE name=?]
                sqlaction[INSERT INTO sqlaction_demo]
                sqlaction[UPDATE sqlaction_demo SET address=? WHERE name=? @@METHOD(updateAddressByName)]
                sqlaction[DELETE FROM sqlaction_demo WHERE name=?]
SqlActionTable.getTableInDatabase[sqlaction_demo] ...
...
*** Уведомление: Создание файла SqlactionDemoSAO.java завершено!!!

Автоматическое создание кода в

SqlactionDemoSAO.java

// Этот файл сгенерирован sqlaction v0.2.9.0
// ВНИМАНИЕ: НЕ МЕНЯЙТЕ ЭТОТ ФАЙЛ

package xyz.calvinwilliams.sqlaction;

import java.math.*;
import java.util.*;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class SqlactionDemoSAO {

    int id; // ID // Первичный ключ
    String name; // Имя
    String address; // Адрес

    int _count_; // Определение для 'SELECT COUNT(*)'
``````java
    // SELECT * FROM sqlaction_demo
    public static int SELECT_ALL_FROM_sqlaction_demo(Connection conn, List<SqlactionDemoSAU> sqlactionDemoListForSelectOutput) throws Exception {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM sqlaction_demo");
        while(rs.next()) {
            SqlactionDemoSAU sqlactionDemo = new SqlactionDemoSAU();
            sqlactionDemo.id = rs.getInt(1);
            sqlactionDemo.name = rs.getString(2);
            sqlactionDemo.address = rs.getString(3);
            sqlactionDemoListForSelectOutput.add(sqlactionDemo);
        }
        rs.close();
        stmt.close();
        return sqlactionDemoListForSelectOutput.size();
    }
    // SELECT * FROM sqlaction_demo WHERE name=?
    public static int SELECT_ALL_FROM_sqlaction_demo_WHERE_name_E_(Connection conn, List<SqlactionDemoSAU> sqlactionDemoListForSelectOutput, String _1_SqlactionDemoSAU_name) throws Exception {
        PreparedStatement prestmt = conn.prepareStatement("SELECT * FROM sqlaction_demo WHERE name=?");
        prestmt.setString(1, _1_SqlactionDemoSAU_name);
        ResultSet rs = prestmt.executeQuery();
        while(rs.next()) {
            SqlactionDemoSAU sqlactionDemo = new SqlactionDemoSAU();
            sqlactionDemo.id = rs.getInt(1);
            sqlactionDemo.name = rs.getString(2);
            sqlactionDemo.address = rs.getString(3);
            sqlactionDemoListForSelectOutput.add(sqlactionDemo);
        }
        rs.close();
        prestmt.close();
        return sqlactionDemoListForSelectOutput.size();
    }
``````markdown
## Описание метода

Метод `SELECT_ALL_FROM_sqlaction_demo_WHERE_name_E_` выполняет запрос к базе данных, выбирающий все записи из таблицы `sqlaction_demo`, где значение поля `name` равно переданному значению.

### Параметры

- **conn**: Подключение к базе данных.
- **sqlactionDemoListForSelectOutput**: Список объектов типа `SqlactionDemoSAU`, который будет заполнен полученными данными.
- **_1_SqlactionDemoSAU_name**: Значение поля `name`, которое используется в условии выборки.

### Возвращаемое значение

Количество записей, найденных в результате выполнения запроса.

### Пример использования

```java
try {
    int count = SELECT_ALL_FROM_sqlaction_demo_WHERE_name_E_(connection, list, "exampleName");
    System.out.println(count + " records found.");
} catch (Exception e) {
    e.printStackTrace();
}
// Вставка в sqlaction_demo
public static int ВСТАВКА_В_sqlaction_demo(Connection conn, SqlactionDemoSAU sqlactionDemo) throws Exception {
    PreparedStatement prestmt;
    Statement stmt;
    ResultSet rs;
    prestmt = conn.prepareStatement("INSERT INTO sqlaction_demo (name, address) VALUES (?, ?)");
    prestmt.setString(1, sqlactionDemo.name);
    prestmt.setString(2, sqlactionDemo.address);
    int count = prestmt.executeUpdate();
    prestmt.close();
    return count;
}

// Обновление sqlaction_demo SET address=? WHERE name=?
public static int ОБНОВЛЕНИЕ_sqlaction_demo_SET_address_E_WHERE_name_E_(Connection conn, String _1_address_ForSetInput, String _1_name_ForWhereInput) throws Exception {
    PreparedStatement prestmt = conn.prepareStatement("UPDATE sqlaction_demo SET address=? WHERE name=?");
    prestmt.setString(1, _1_address_ForSetInput);
    prestmt.setString(2, _1_name_ForWhereInput);
    int count = prestmt.executeUpdate();
    prestmt.close();
    return count;
}
// Подключение к базе данных
try {
	Class.forName("com.mysql.jdbc.Driver");
	conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT", "calvin", "calvin");
} catch (ClassNotFoundException e1) {
	e1.printStackTrace();
} catch (SQLException e) {
	e.printStackTrace();
}

try {
	conn.setAutoCommit(false);

	// Удаление записей с указанным именем
	nret = SqlactionDemoSAU.УДАЛЕНИЕ_ИЗ_sqlaction_demo_WHERE_name_E_("Calvin");
	if (nret < 0) {
		System.out.println("SqlactionDemoSAU.УДАЛЕНИЕ_ИЗ_sqlaction_demo_WHERE_name_E_ failed [" + nret + "]");
		conn.rollback();
		return;
	} else {
		System.out.println("SqlactionDemoSAU.УДАЛЕНИЕ_ИЗ_sqlaction_demo_WHERE_name_E_ ok, строки [" + nret + "] затронуты");
	}
}
```	// Вставка записи
	sqlactionDemo = new SqlactionDemoSAU();
	sqlactionDemo.name = "Calvin";
	sqlactionDemo.address = "My address";
	nret = SqlactionDemoSAU.INSERT_INTO_sqlaction_demo(conn, sqlactionDemo);
	if (nret < 0) {
		System.out.println("SqlactionDemoSAU.INSERT_INTO_sqlaction_demo failed [" + nret + "]");
		conn.rollback();
		return;
	} else {
		System.out.println("SqlactionDemoSAU.INSERT_INTO_sqlaction_demo ok");
	}```markdown
## 2.5. Выполнение вашего приложения

```
SqlactionDemoSAU.DELETE_FROM_sqlaction_demo_WHERE_name_E_ ok, строки[1] затронуты
SqlactionDemoSAU.INSERT_INTO_sqlaction_demo ok
SqlactionDemoSAU.UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_ ok, строки[1] затронуты
SqlactionDemoSAO.SELECT_ALL_FROM_sqlaction_demo ok
	id[20] имя[Калвин] адрес[Мой адрес 2]
```

# 3. Справочник

## 3.1. Процесс выполнения

```
                                        sqlaction
dbserver.conf.json/sqlaction.conf.json ---------> XxxSao.java/XxxSau.java --\
                                                                               ---> App.jar
                                                                   App.java --/
```

# 4. Различия нагрузки между MyBatis и sqlaction
```| | |
|---|---|
| **MyBatis** | **sqlaction** |
| Конфигурация проекта один раз | Конфигурация проекта один раз |
| Настройка соединения с базой данных <img src="mybatis-config.xml.png" /> | Настройка соединения с базой данных <img src="dbserver.conf.json.png" /> |
| Настройка каждого столбца | Настройка каждого столбца |
| Настройка маппера таблицы <img src="mybatis-mapper.xml.png" /> | Настройка действия таблицы <img src="sqlaction.conf.json.png" /> |
| Класс сущности таблицы <img src="SqlactionBenchmarkSAO.java.png" /> | Автоматическое создание sqlaction |
| Интерфейс класса таблицы <img src="SqlactionBenchmarkSAOMapper.java.png" /> | Нет необходимости |
| Нет необходимости | Выполнение команды sqlaction? <br /> java -Dfile.encoding=UTF-8 -classpath "D:\Work\sqlaction\sqlaction.jar;D:\Work\mysql-connector-java-8.0.15\mysql-connector-java-8.0.15.jar" xyz.calvinwilliams.sqlaction.gencode.SqlActionGencode |# 5. Различия в тестировании производительности между MyBatis и sqlaction

Процессор: Intel Core i5-7500 3.4GHz  
Память: 16 ГБ  
Операционная система: Windows 10  
IDE Java: Eclipse 2018-12  
База данных: MySQL 8.0.15 Community Server  
Адрес подключения к базе данных: 127.0.0.1:3306  

DDL
```
CREATE TABLE `sqlaction_benchmark` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер',
  `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 'Английское имя',
  `name_cn` varchar(128) COLLATE utf8mb4_bin NOT NULL COMMENT 'Китайское имя',
  `salary` decimal(12,2) NOT NULL COMMENT 'Зарплата',
  `birthday` date NOT NULL COMMENT 'Дата рождения',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42332 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
``` 

## 5.1. Подготовка sqlaction

Создайте `dbserver.conf.json`

```json
{
	"driver": "com.mysql.jdbc.Driver",
	"url": "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT",
	"user": "calvin",
	"pwd": "calvin"
}
```

Создайте `sqlaction.conf.json`

```json
{
	"database": "calvindb",
	"tables": [
		{
			"table": "sqlaction_benchmark",
			"sqlactions": [
				"INSERT INTO sqlaction_benchmark",
				"UPDATE sqlaction_benchmark SET salary=? WHERE name=?" ,
				"SELECT * FROM sqlaction_benchmark WHERE name=?" ,
				"SELECT * FROM sqlaction_benchmark",
				"DELETE FROM sqlaction_benchmark WHERE name=?" ,
				"DELETE FROM sqlaction_benchmark"
			]
		}
	],
	"javaPackage": "xyz.calvinwilliams.sqlaction.benchmark"
}
``````java
/*
 * sqlaction - SQL action object auto-generate code tool based on JDBC for Java
 * author    : calvin
 * email     : calvinwilliams@163.com
 *
 * See the file LICENSE in base directory.
 */

package xyz.calvinwilliams.sqlaction.benchmark;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class SqlActionBenchmarkCrud {
```
```java
    public static void main(String[] args) {
        Connection                    conn = null ;
        SqlactionBenchmarkSAO         sqlactionBenchmark ;
        List<SqlactionBenchmarkSAO>   sqlactionBenchmarkList ;
        long                          beginMillisSecondStamp ;
        long                          endMillisSecondStamp ;
        double                       elapsedSecond ;
        long                         i, j, k ;
        long                         count, count2, count3 ;
        int                           rows = 0 ;

        // Подключение к базе данных
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT", "calvin", "calvin") ;
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
```        try {
            conn.setAutoCommit(false);
            sqlactionBenchmark = new SqlactionBenchmarkSAO();
            sqlactionBenchmark.name = "Calvin";
            sqlactionBenchmark.nameCn = "Калвин";
            sqlactionBenchmark.salary = new BigDecimal(0);
            long time = System.currentTimeMillis();
            sqlactionBenchmark.birthday = new java.sql.Date(time);
            count = 500;
            count2 = 5;
            count3 = 1000;
            rows = SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark(conn);
            conn.commit();

            // Бенчмарк для вставки
            beginMillisSecondstamp = System.currentTimeMillis();
            for (i = 0; i < count; i++) {
                sqlactionBenchmark.name = "Calvin" + i;
                sqlactionBenchmark.nameCn = "Калвин" + i;
                rows = SqlactionBenchmarkSAO.INSERT_INTO_sqlaction_benchmark(conn, sqlactionBenchmark);
                if (rows != 1) {
                    System.out.println("SqlactionBenchmarkSAO.INSERT_INTO_sqlaction_benchmark failed[" + rows + "]");
                    return;
                }
                if (i % 10 == 0) {
                    conn.commit();
                }
            }
            conn.commit();
            endMillisSecondstamp = System.currentTimeMillis();
            elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
            System.out.println("Все операции SQL вставки завершены, количество записей [" + count + "] затраченное время [" + elapsedSecond + "] секунд");
        } catch (Exception e) {
            e.printStackTrace();
        }```markdown
            // Бенчмарк для обновления
            beginMillisSecondstamp = System.currentTimeMillis();
            for (i = 0; i < count; i++) {
                rows = SqlactionBenchmarkSAO.UPDATE_sqlaction_benchmark_SET_salary_E_WHERE_name_E_(conn, new BigDecimal(i), "Calvin" + i);
                if (rows != 1) {
                    System.out.println("SqlactionBenchmarkSAO.UPDATE_sqlaction_benchmark_SET_salary_E_WHERE_name_E_ failed[" + rows + "]");
                    return;
                }
                if (i % 10 == 0) {
                    conn.commit();
                }
            }
```

Продолжение кода:
```java
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
``````markdown
                     }
                 }
                 conn.commit();
                 endMillisSecondstamp = System.currentTimeMillis();
                 elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
                 System.out.println("Все операции SQL обновления завершены, количество записей [" + count + "] затраченное время [" + elapsedSecond + "] секунд");
             }
         } finally {
             if (conn != null) {
                 try {
                     conn.close();
                 } catch (SQLException e) {
                     e.printStackTrace();
                 }
             }
         }
     }
 ``` 
```markdown
}
conn.commit();
long endMillisSecondstamp = System.currentTimeMillis();
double elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
System.out.println("Обновление всех записей завершено, количество обновлённых записей [" + count + "] затраченное время [" + elapsedSecond + "] секунд");
//benchmark для SELECT ... WHERE ...
beginMillisSecondstamp = System.currentTimeMillis();
for (int j = 0; j < count2; j++) {
    for (int i = 0; i < count; i++) {
        sqlactionBenchmarkList = new LinkedList<SqlactionBenchmarkSAO>();
        int rows = SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark_WHERE_name_E(conn, sqlactionBenchmarkList, "Calvin" + i);
        if (rows != 1) {
            System.out.println("SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark_WHERE_name_E failed[" + rows + "]");
            return;
        }
    }
}
endMillisSecondstamp = System.currentTimeMillis();
elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
System.out.println("Запрос SELECT WHERE выполнен, количество запросов [" + count2 + "] количество записей [" + count + "] затраченное время [" + elapsedSecond + "] секунд");
//benchmark для SELECT
beginMillisSecondstamp = System.currentTimeMillis();
for (int k = 0; k < count3; k++) {
    sqlactionBenchmarkList = new LinkedList<SqlactionBenchmarkSAO>();
    int rows = SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark(conn, sqlactionBenchmarkList);
    if (rows != count) {
        System.out.println("SqlactionBenchmarkSAO.");
``````markdown
SELECT_ALL_FROM_sqlaction_benchmark failed[" + rows + "]";
         return;
     }
 }
 endMillisSecondstamp = System.currentTimeMillis();
 elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
 System.out.println("Запрос SELECT в список выполнен, количество запросов [" + count3 + "] затраченное время [" + elapsedSecond + "] секунд");
 //benchmark для DELETE
 beginMillisSecondstamp = System.currentTimeMillis();
 for (int i = 0; i < count; i++) {
     int rows = SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark_WHERE_name_E(conn, "Calvin" + i);
     if (rows != 1) {
         System.out.println("SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark_WHERE_name_E failed[" + rows + "]");
         return;
     }
     if (i % 10 == 0) {
         conn.commit();
     }
 }
 conn.commit();
 endMillisSecondstamp = System.currentTimeMillis();
 elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
 System.out.println(
```
```markdown
"Удаление всех записей выполнено, количество удалённых записей [" + count + "] затраченное время [" + elpaseSecond + "] секунд");
```

```markdown
println("Все операции SQL с действием DELETE завершены, количество [" + count + "] затрат времени [" + elpaseSecond + "] секунд");
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (Exception e2) {
e.printStackTrace();
return;
}
}
finally {
try {
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
return;
}
}
return;
}
```

### 5.2. Подготовка MyBatis

Создайте `mybatis-config.xml`

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="cacheEnabled" value="false" />
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT" />
                <property name="username" value="calvin" />
                <property name="password" value="calvin" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis-mapper.xml" />
    </mappers>
</configuration>
```

Создайте `mybatis-mapper.xml`
``````xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAOMapper">
    <insert id="insertOne" parameterType="xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO">
        INSERT INTO sqlaction_benchmark (name, name_cn, salary, birthday) VALUES(#{name}, #{name_cn}, #{salary}, #{birthday})
    </insert>
    <update id="updateOneByName" parameterType="xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO">
        UPDATE sqlaction_benchmark SET salary = #{salary} WHERE name = #{name}
    </update>
    <select id="selectOneByName" parameterType="java.lang.String" resultType="xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO" flushCache="true" useCache="false">
        SELECT * FROM sqlaction_benchmark WHERE name = #{name}
    </select>
    <select id="selectAll" resultType="xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO" flushCache="true" useCache="false">
        SELECT * FROM sqlaction_benchmark
    </select>
    <delete id="deleteOneByName" parameterType="java.lang.String">
        DELETE FROM sqlaction_benchmark WHERE name = #{name}
    </delete>
    <delete id="deleteAll">
        DELETE FROM sqlaction_benchmark
    </delete>
</mapper>
``````markdown
## Класс `SqlactionBenchmarkSAO`

```java
public class SqlactionBenchmarkSAO {

    int id;
    String name;
    String name_cn;
    BigDecimal salary;
    java.sql.Date birthday;

    int _count_; // Определено для 'SELECT COUNT(*)'
}
```

### Создайте `SqlactionBenchmarkSAOMapper.java`

```java
package xyz.calvinwilliams.mybatis.benchmark;

import java.util.*;

public interface SqlactionBenchmarkSAOMapper {
    public void insertOne(SqlactionBenchmarkSAO sqlactionBenchmark);
    public void updateOneByName(SqlactionBenchmarkSAO sqlactionBenchmark);
    public SqlactionBenchmarkSAO selectOneByName(String name);
    public List<SqlactionBenchmarkSAO> selectAll();
    public void deleteOneByName(String name);
    public void deleteAll();
}
```

### Создайте `MyBatisBenchmarkCrud.java`

```java
/*
 * sqlaction - Автоматически сгенерированный объект SQL действия на основе JDBC для Java
 * автор : calvin
 * email : calvinwilliams@163.com
 *
 * Увидеть файл LICENSE в базовой директории.
 */

package xyz.calvinwilliams.mybatis.benchmark;

import java.io.FileInputStream;
import java.math.BigDecimal;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO;
import xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAOMapper;

public class MyBatisBenchmarkCrud {
```

```java
public static void main(String[] args) {
    SqlSession                    session = null;
    SqlactionBenchmarkSAOMapper   mapper;
    List<SqlactionBenchmarkSAO>   sqlactionBenchmarkList;
    long                          beginMillisSecondstamp;
    long                          endMillisSecondstamp;
    double                       elapsedSecond;
    long                         i, j, k;
    long                         count, count2, count3;

    try {
        FileInputStream in = new FileInputStream("src/main/java/mybatis-config.xml");
        session = new SqlSessionFactoryBuilder().build(in).openSession();
```        SqlactionBenchmarkSAO sqlactionBenchmark = new SqlactionBenchmarkSAO();
        sqlactionBenchmark.id = 1;
        sqlactionBenchmark.name = "Calvin";
        sqlactionBenchmark.name_cn = "Калвин";
        sqlactionBenchmark.salary = new BigDecimal(0);

        long time = System.currentTimeMillis();
        sqlactionBenchmark.birthday = new java.sql.Date(time);

        count = 500;
        count2 = 5;
        count3 = 1000;

        mapper = session.getMapper(SqlactionBenchmarkSAOMapper.class);
        mapper.deleteAll();
        session.commit();

        // тестирование вставки
        beginMillisSecondstamp = System.currentTimeMillis();
        for (i = 0; i < count; i++) {
            sqlactionBenchmark.name = "Calvin" + i;
            sqlactionBenchmark.name_cn = "Калвин" + i;
            mapper.insertOne(sqlactionBenchmark);
            if (i % 10 == 0) {
                session.commit();
            }
        }

        session.commit();
        endMillisSecondstamp = System.currentTimeMillis();
        elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
        System.out.println("Все операции MyBatis INSERT завершены, количество [" + count + "] затраченное время [" + elapsedSecond + "] сек");

        // тестирование обновления
        beginMillisSecondstamp = System.currentTimeMillis();
        for (i = 0; i < count; i++) {
            sqlactionBenchmark.name = "Calvin" + i;
            sqlactionBenchmark.salary = new BigDecimal(i);
            mapper.updateOneByName(sqlactionBenchmark);
            if (i % 10 == 0) {
                session.commit();
            }
        }

        session.commit();
        endMillisSecondstamp = System.currentTimeMillis();
        elapsedSecond = (endMillisSecondstamp - beginMillisSecondstamp) / 1000.0;
        System.out.println("Все операции MyBatis UPDATE завершены, количество [" + count + "] затраченное время [" + elapsedSecond + "] сек");        // тестирование выборки
        beginMillisSecondstamp = System.currentTimeMillis();
        for (j = 0; j < count2; j++) {
            for (i = 0; i < count; i++) {
                sqlactionBenchmark = mapper.;
                sqlActionBenchmark = selectOneByName(sqlactionBenchmark.name);
                if (sqlActionBenchmark == null) {
                    System.out.println("mapper.selectOneByName failed");
                    return;
                }
            }
        }```md
## 5.3. Пример

ЗАПИСЬ таблицы для 500 записей  
ОБНОВЛЕНИЕ таблицы для 500 записей  
SELECT таблицы для 500*5 записей  
SELECT таблицы в список для 1000 записей  
УДАЛЕНИЕ таблицы для 500 записей  

## 5.4. Результат

Все действия SQL записи завершены, количество [500], затраченное время [4.742] с Все действия SQL обновление WHERE завершены, количество [500], затраченное время [5.912] с Все действия SQL выборка WHERE завершены, количество [5], количество [500], затраченное время [0.985] с Все действия SQL выборка в список завершены, количество [1000], затраченное время [1.172] с Все действия SQL удаление WHERE завершены, количество [500], затраченное время [5.001] с

Все действия MyBatis Обновление Where завершены, количество [500], затраченное время [6.921]с
Все действия MyBatis Select Where завершены, количество2 [5], количество [500], затраченное время [1.239]с
Все действия MyBatis Select в список завершены, количество3 [1000], затраченное время [1.792]с
Все действия MyBatis Удаление Where завершены, количество [500], затраченное время [5.382]с

Все действия SQL Запись завершены, количество [500], затраченное время [5.392]с
Все действия SQL Обновление Where завершены, количество [500], затраченное время [5.821]с
Все действия SQL Select Where завершены, количество2 [5], количество [500], затраченное время [0.952]с
Все действия SQL Select в список завершены, количество3 [1000], затраченное время [1.15]с
Все действия SQL Удаление Where завершены, количество [500], затраченное время [5.509]с

Все действия MyBatis Запись завершены, количество [500], затраченное время [6.066]с
Все действия MyBatis Обновление Where завершены, количество [500], затраченное время [6.946]с
Все действия MyBatis Select Where завершены, количество2 [5], количество [500], затраченное время [1.183]с
Все действия MyBatis Select в список завершены, количество3 [1000], затраченное время [1.804]с
Все действия MyBatis Удаление Where завершены, количество [500], затраченное время [5.958]сВсе действия SQL записи завершены, количество [500], затраченное время [5.236] с
Все действия SQL обновление WHERE завершены, количество [500], затраченное время [5.84] с
Все действия SQL выборка WHERE завершены, количество2 [5], количество [500], затраченное время [0.985] с
Все действия SQL выборка в список завершены, количество3 [1000], затраченное время [1.222] с
Все действия SQL удаление WHERE завершены, количество [500], затраченное время [4.91] сВсе действия MyBatis записи завершены, количество [500], затраченное время [5.448] с
Все действия MyBatis обновления WHERE завершены, количество [500], затраченное время [7.287] с
Все действия MyBatis выборки WHERE завершены, количество [5], количество [500], затраченное время [1.149] с
Все действия MyBatis выборки в список завершены, количество [1000], затраченное время [1.873] с
Все действия MyBatis удаления WHERE завершены, количество [500], затраченное время [6.035] с


`sqlaction` работает быстрее на 20% чем `MyBatis`

# 6. TODO

1. Eclipse плагин для выполнения sqlaction
1. Поддержка кэша
1. Оптимизация под Oracle

# 7. Об проекте

Исходный код доступен по адресам: [gitee](https://gitee.com/calvinwilliams/sqlaction), [github](https://github.com/calvinwilliams/sqlaction)

Apache Maven
```xml
<dependency>
  <groupId>xyz.calvinwilliams</groupId>
  <artifactId>sqlaction</artifactId>
  <version>0.2.9.0</version>
</dependency>

8. Об авторе

Контактная информация: netease или Gmail


Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Инструмент для создания постоянного слоя базы данных с автоматической генерацией кода JDBC. Развернуть Свернуть
Java и 2 других языков
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/calvinwilliams-sqlaction.git
git@api.gitlife.ru:oschina-mirror/calvinwilliams-sqlaction.git
oschina-mirror
calvinwilliams-sqlaction
calvinwilliams-sqlaction
release