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;
}