/**JDBC的标准用法：
 *1）加载数据库驱动
 *2）获取数据库连接
 *3）创建Statement\PreparedStatement对象
 *4）执行SQL语句操作数据库
 */

@file:Suppress("SqlResolve")

package main.kotlin

import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import java.sql.Statement
import java.util.*

private const val JDBC_URL = "jdbc:h2:~/test"  //test.h2.db

//连接数据库时使用的用户名
private const val USER = "sa"

//连接数据库时使用的密码
private const val PASSWORD = "sa"

//连接H2数据库时使用的驱动类，org.h2.Driver这个类是由H2数据库自己提供的，在H2数据库的jar包中可以找到
private const val DRIVER_CLASS = "org.h2.Driver"

fun uuid()=UUID.randomUUID().toString()

fun main() {
    // 加载H2数据库驱动
    Class.forName(DRIVER_CLASS)
    // 根据连接URL，用户名，密码获取数据库连接
    val conn: Connection = DriverManager.getConnection(JDBC_URL, USER, PASSWORD)
    val stmt: Statement = conn.createStatement()
    //如果存在USER_INFO表就先删除USER_INFO表
    stmt.execute("DROP TABLE IF EXISTS USER_INFO")
    //创建USER_INFO表
    stmt.execute("CREATE TABLE USER_INFO(id INT(5) PRIMARY KEY,name VARCHAR(20),sex VARCHAR(4),age INT(5))")
    //新增
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(1 , '张三1','男',21)")
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(2 , '张三2','女',22)")
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(3 , '张三3','男',23)")
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(4 , '张三4','女',24)")
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(5 , '张三5','男',25)")
    stmt.executeUpdate("INSERT INTO USER_INFO VALUES(6 , '张三6','女',26)")
    //删除
    stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='张三6'")
    //修改
    stmt.executeUpdate("UPDATE USER_INFO SET name='张三55' WHERE name='张三5'")
    //查询
    val sql="select * from USER_INFO where age > ?"
    val ptmt = conn.prepareStatement(sql) //预编译SQL，减少sql执行时间
    ptmt.setInt(1, 23)
    val rs:ResultSet=ptmt.executeQuery()
    /*可选替代
    val rs: ResultSet = stmt.executeQuery("SELECT * FROM user_info")*/
    //遍历结果集
    while (rs.next()) {
        println("${rs.getInt("id")},${rs.getString("name")},${rs.getString("sex")},${rs.getInt("age")}")
    }

    //调用存储过程
    val rss = stmt.executeQuery("CALL MYQUERY('SELECT * FROM USER_INFO')")
    while (rss.next()) {
        println("${rss.getInt("id")},${rss.getString("name")},${rss.getString("sex")},${rss.getInt("age")}")
    }
    /*数据库已有下列存储过程：
    CREATE ALIAS myQUERY AS $$
    ResultSet myquery(Connection conn, String sql) throws SQLException {
        return conn.createStatement().executeQuery(sql);}
    $$;*/

    //释放资源
    stmt.close()
    //关闭连接
    conn.close()
}
