MySQL Python 化

      在〈MySQL Python 化〉中尚無留言

底下代碼,可以將 Java Python 化,更方便、更直覺的操控 MySQL。

完整代碼

請先新增 mysql.java,輸入如下完整代碼

package net.ddns.mahaljsp;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ArrayList;
import java.sql.*;
import java.util.List;

public final class mysql {
    public static PyConnection connect(
            String host,String user, String password, String database
    )throws SQLException{
        /*
        //Java web 才需加入
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
        }
        catch (ClassNotFoundException ex){
            System.out.println(ex);
        }
        */
        return new PyConnection(host, user, password, database);
    }
    public final static class PyConnection{
        Connection conn;
        private PyConnection(
                String host, String user, String password, String database
        )throws SQLException{
            String connStr="jdbc:mysql://%s/%s?useSSL=true&serverTimezone=Asia/Taipei"
                    .formatted(host, database);
            conn=DriverManager.getConnection(connStr,user,password);
            conn.setAutoCommit(false);
        }
        public Cursor cursor()throws SQLException{
            return new Cursor(conn);
        }
        public void close()throws SQLException{
            conn.close();
        }
        public void commit()throws SQLException{
            conn.commit();
        }
        public void rollback() throws SQLException {
            conn.rollback();
        }        
    }
    public final static class Cursor{
        Connection conn;
        private ResultSet rs;   
        private PreparedStatement ps;
        private Cursor(Connection conn){
            this.conn=conn;
        }
        public void execute(String cmd)throws SQLException{
            rs=null;
            ps = conn.prepareStatement(cmd);
            if (ps.execute())rs=ps.getResultSet();
        }
        public void close()throws SQLException{
            if (rs!=null)rs.close();
        }
        public void executemany(String cmd, List<List<Object>>datas)throws SQLException{
            ps = conn.prepareStatement(cmd);
            int count = ps.getParameterMetaData().getParameterCount();
            for(var row:datas){
                if (row.size()!=count)throw new SQLException("Parameter count mismatch");
                for(int i=0;i<count;i++){
                    ps.setObject(i+1, row.get(i));
                }
                ps.addBatch();
            }
            ps.executeBatch();
            ps.clearBatch();
        }
        public Map<String, Integer> columns()throws SQLException{
            ResultSetMetaData meta=rs.getMetaData();
            Map<String, Integer> datas=new LinkedHashMap<>();
            for(int i=1;i<=meta.getColumnCount();i++){
                datas.put(meta.getColumnLabel(i), meta.getColumnType(i));
            }
            return datas;
        }
        public List<List<Object>> fetchall()throws SQLException{
            var meta=rs.getMetaData();
            int count=meta.getColumnCount();
            List<List<Object>> datas=new ArrayList<>();
            while(rs.next()){
                List<Object> item=new ArrayList<>();
                for (int i=1;i<=count;i++){
                    item.add(rs.getObject(i));
                }
                datas.add(item);
            }
            rs=null;
            return datas;            
        }
    }     
}

查詢應用

主程式引用上面的 mysql,即可進行查詢

import java.sql.*;
import net.ddns.mahaljsp.mysql;
import net.ddns.mahaljsp.os;
public class MysqlTest {
    public static void main(String[] args) {
        os.utf8();
        var host="host";
        var user="帳號";
        var password="密碼";
        var database="資料庫";        
        try {
            var conn=mysql.connect(host, user, password, database);
            String cmd="select * from history";
            var cursor=conn.cursor();
            cursor.execute(cmd);
            var columns=cursor.columns();
            var rs=cursor.fetchall();
            conn.close();
            
            for(var r :rs){
                System.out.println(r);
            }
            for (var c : columns.keySet()){
                String type;
                switch(columns.get(c)){
                    case Types.INTEGER->type="Integer";
                    case Types.VARCHAR->type="String";
                    case Types.TIMESTAMP->type="Timestamp";
                    case Types.DATE->type="Date";
                    case Types.TIME->type="time";                    
                    case Types.DOUBLE->type="Double";
                    default->type="Other";
                }
                System.out.printf("%s : %d, %s\n",c,columns.get(c), type);
            }            
            
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }
}

新增應用

主程式引用上面的 mysql,即可快速新增多筆資料。

public static void main(String[] args) {
	try{
		var conn=mysql.connect("mahaljsp.ddns.net", "帳號", "密碼", "cloud");
		var cursor=conn.cursor();
		cursor.execute("select 日期, 買進, 賣出 from 台銀黃金");
		var rs=cursor.fetchall();
		for(var r:rs){
			System.out.println(r);
		}
		conn.close();
		
		conn=mysql.connect("localhost", "帳號", "密碼", "cloud");
		cursor=conn.cursor();
		cursor.execute("truncate table 台銀黃金");
		String cmd="insert into 台銀黃金 (日期, 買進, 賣出) values (?,?,?)";
		cursor.executemany(cmd, rs);
		conn.commit();
		conn.close();
	}
	catch(SQLException e){}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *