java SpringBoot 直连SQL(SqlHelper)

java SpringBoot 直连SQL,封装SqlHelper,支持各种复杂SQL查询,执行存储过程等

1、pom 引入 mysql-connector-java

<dependency>
   <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
    <scope>runtime</scope>
</dependency>

2、SqlHelper 类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.sql.*;
import java.util.ArrayList;

@Component
public class SqlHelper {

    //定义需要的变量
    private static Connection ct=null;
    //在大多数情况下,使用PreparedStatement来替代Statement
    //这样可以防止sql注入
    private static PreparedStatement ps=null;
    private static ResultSet rs=null;
    private static CallableStatement cs=null;

    public static Connection getCt() {
        return ct;
    }

    public static PreparedStatement getPs() {
        return ps;
    }

    public static ResultSet getRs() {
        return rs;
    }
	
	//读取属性文件
    private static String url;
    @Value("${url}")
    public void setUrl(String value) {
        url = value;
    }

	//读取属性文件
    private static String username;
    @Value("${user}")
    public void setUsername(String value) {
        username = value;
    }

	//读取属性文件
    private static String driver;
    @Value("${driver}")
    public void setDriver(String value) {
        driver = value;
    }

	//读取属性文件
    private static String password;
    @Value("${password}")
    public void setPassword(String value) {
        password = value;
    }

    //加载驱动,只需要一次
    static{
        try {
            //指定驱动方式
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
        }
    }

    //查询封装
    public static ArrayList executeQuery(String sql){
        return executeQuery(sql,null);
    }

    //统一的select 查询封装 返回list object
    public static ArrayList executeQuery(String sql,String parameters[]){
        try {
            ct=getConnection();
            ps=ct.prepareStatement(sql);
            if(parameters!=null&&!parameters.equals("")){
                for(int i=0;i<parameters.length;i++){
                    ps.setString(i+1,parameters[i]);
                }
            }
            rs=ps.executeQuery();

            ArrayList list = new ArrayList();

            //得到结果集(rs)的结构
            ResultSetMetaData rsmd = rs.getMetaData();
            //通过rsmd可以得到该结果集有多少列  
            int columnNum= rsmd.getColumnCount();
            //从rs中取出数据,并且封装到ArrayList中  
            while(rs.next()){
                Object[] objects= new Object[columnNum];
                for(int i = 0; i < objects.length; i++){
                    objects[i]= rs.getObject(i+1);
                }
                list.add(objects);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            close(rs,ps,ct);
        }
        return null;
    }

    public static int executeUpdate(String sql) {
        return executeUpdate(sql,null);
    }

    //先写一个update/insert/delete
    public static int executeUpdate(String sql,String [] parameters){
        //1、创建一个ps
        try{
            ct=getConnection();
            ps=ct.prepareStatement(sql);
            //给?赋值
            if(parameters!=null){
                for(int i=0;i<parameters.length;i++){
                    ps.setString(i+1,parameters[i]);
                }
            }
            //执行
            return ps.executeUpdate();

        }catch (Exception e){
            e.printStackTrace();//开发阶段
            //抛出异常,抛出运行异常,可以给调用该函数的函数一个选择
            //可以处理,也可以放弃处理
        }finally{
            //关闭资源
            close(rs,ps,ct);
        }

        return 0;
    }


    //如果有多个update/delete/insert[需要考虑事务]
    public static void executeUpdate2(String sql[],String [][]parameters){
        try {
            //1、获得链接
            ct=getConnection();
            //因为这时,用户传入的可能是多个sql语句
            ct.setAutoCommit(false);
            for(int i=0;i<sql.length;i++){
                if(parameters[i]!=null){
                    ps=ct.prepareStatement(sql[i]);
                    for(int j=0;j<parameters[i].length;j++){
                        ps.setString(j+1, parameters[i][j]);
                    }
                    ps.executeUpdate();
                }
            }
            ct.commit();

        } catch (Exception e) {
            e.printStackTrace();//开发阶段

            //回滚
            try {
                ct.rollback();
            } catch (Exception e1) {
                e1.printStackTrace();
            }


            //抛出异常,抛出运行异常,可以给调用该函数的函数一个选择
            //可以处理,也可以放弃处理
            throw new RuntimeException(e.getMessage());
        }finally{
            close(rs,ps,ct);
        }
    }

    //调用存储过程
    //sql {call 过程(?,?,?)}
    public static void callPro1(String sql,String []parameters){
        try {
            ct=getConnection();
            cs=ct.prepareCall(sql);

            //?号赋值
            if(parameters!=null){
                for(int i=0;i<parameters.length;i++){
                    cs.setObject(i+1, parameters[i]);
                }
            }
            cs.execute();

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }finally{
            close(rs,cs,ct);
        }
    }

    //调用存储过程,有返回Result
    //未完成,见《韩顺平.2011最新j2ee视频教程.jdbc第4.超强SqlHelper工具类封装(2)
    public static ResultSet callPro2(String sql,String []inparameters,String []outparameters){
        try {
            ct=getConnection();
            cs=ct.prepareCall(sql);
            if(inparameters!=null){
                for(int i=0;i<inparameters.length;i++){
                    cs.setObject(i+1,inparameters[i]);
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
        }
        return null;
    }

    //打开连接
    public static Connection getConnection(){
        try {
            System.out.println(url + "    " + username + "        " + password);
            ct = DriverManager.getConnection(url,
                    username,password);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return ct;
    }

    //关闭资源的函数
    public static void close(ResultSet rs,Statement ps,Connection ct){
        if(rs!=null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs=null;
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ps=null;
        }
        if(ct!=null){
            try {
                ct.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            ct=null;
        }
    }
}

3、属性文件 application.properties

url=jdbc:mysql://127.0.0.1:3306/my_test?useUnicode=true&characterEncoding=utf-8&useSSL=true
user=root
password=123456
driver=com.mysql.jdbc.Driver

4、测试方法

public List<User> Test()
    {
        try {
            //String sql = "select * from user where user_id = 1";
            String sql = "select * from user";
            ArrayList list  = SqlHelper.executeQuery(sql);

            if(list != null){
                List<User> lisUser = new ArrayList<User>();
                for (int i = 0; i< list.size(); i++ ) {
                    User user = new User();
                    Object[] objects =(Object[])list.get(i);

                    user.setUserId(Long.parseLong(String.valueOf(objects[0])));
                    user.setUserAccount(String.valueOf(objects[1]));
                    user.setUserPass(String.valueOf(objects[2]));
                    user.setUserPhone(String.valueOf(objects[3]));
                    user.setUserPhoto(String.valueOf(objects[4]));
                    user.setUserState(Integer.parseInt(String.valueOf(objects[5])));
                    lisUser.add(user);
                }

                return lisUser;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }

注:
1、必须指定驱动 Class.forName

Class.forName("com.mysql.jdbc.Driver");

2、静态类读取属性文件,必须以set模式

private static String username;
    @Value("${user}")
    public void setUsername(String value) {
        username = value;
    }

你可能感兴趣的:(java,springboot,sqlhelper,sql)