SpringBoot连接数据库的方式

1、Spring集成的服务

直接通过注入方式使用,如redis,jdbc等等服务。

spring:
  redis:
    host: localhost
    port: 6379
    password: 123456
    database: 0
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
@Autowired
private RedisTemplate<String, Object> redisTemplate;

@Autowired
private JdbcTemplate jdbcTemplate;

点击查看如何配置Mysql连接池

2、非spring集成(注册Bean服务)

iotdb:
    host: 127.0.0.1
    port: 8080
    username: root
    password: 123456
@Data
@Component
@ConfigurationProperties(prefix = "iotdb")
public class ConnUtils{

    private String ip;
    private String port;
    private String username;
    private String passwrod;

    // 通过Bean注册成长连接,启动项目就连接上
    @Bean
    public Connection connection(){
        Connection connection = new connection(ip,port,username,passwrod);
        connection.openConnection();
        return connection;
    }
}
/**
* 调用方式
**/
public class Test{
    @Autowired
    private Connection connection;
}

3、非spring集成应用(静态调用)

iotdb:
    host: 127.0.0.1
    port: 8080
    username: root
    password: 123456
@Data
@Component
@ConfigurationProperties(prefix = "iotdb")
public class ConnUtils{

    private static String ip;
    private static String port;
    private static String username;
    private static String passwrod;

    public void setIp(String ip){
        ConnUtils.ip = id;
    }
    public void setPort(String port){
        ConnUtils.port = port;
    }
    public void setUsername(String username){
        ConnUtils.username = username;
    }
    public void setPasswrod(String passwrod){
        ConnUtils.passwrod = passwrod;
    }

    // 短连接,每次需要时就手动调用
    public static Connection getConnection(){
        Connection connection = new connection(ip,port,username,passwrod);
        connection.openConnection();
        return connection;
    }
}
/**
* 调用方式
**/
public class Test{

    public void method(){
        Connection connection = ConnUtils.getConnection();
    }
}

3、使用原生JDBC连接Mysql

方式一:使用jdk连接

package com.cn.utils;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//jdbc工具类
public class JdbcUtil {
   //查询多行多列
   public static <T> List<T> list(String sql,Class<T> c){
       //创建一个集合,存放所有的对象
       List<T> tList=new ArrayList<>();
       try {
           //1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
           Class.forName("com.mysql.jdbc.Driver");
           //2、获取连接对象
           Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");

           //3、定义sql
           String sql = "select * from t_test";
           //4、需要创建statement
           Statement st = conn.createStatement();
           //5、statement 执行sql,返回 结果集
           ResultSet rs = st.executeQuery(sql);
           //结果集rs得到结果集元数据
           ResultSetMetaData md=rs.getMetaData();
           //获取结果集总列数
           var columnCount = md.getColumnCount();
           //6、解析rs
           while (rs.next()) {//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
               //根据每一行数据,封装成一个实体对象
                T t = c.newInstance();
               // 1、取出某一行的每个数据,封装到对象t的属性中
               for (int i = 1; i <= columnCount; i++) {
                   //通过列的序号,获取每一列的值
                   var value = rs.getObject(i);
                   if (value!=null){
                       //通过列的序号,获取每一列的列名
                       var columnName = md.getColumnName(i);
                       //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
                       var f = c.getDeclaredField(columnName);
                       //赋予私有属性的赋值权限
                       f.setAccessible(true);
                       //使用反射,把value给到对象t的属性中
                       f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
                   }
               }
               //把对象存入集合中
               tList.add(t);
           }
           //7、关闭资源
           st.close();
           conn.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
       return tList;
   }
}

方式二:使用com.alibaba.druid依赖

package com.cn.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.util.JdbcUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

//jdbc工具类
public class JdbcUtil {
   //查询多行多列
   public static <T> List<T> list(String sql,Class<T> c){
       //创建一个集合,存放所有的对象
       List<T> tList=new ArrayList<>();
       Connection conn = null;
       Statement st = null;
       ResultSet rs = null;
       try {
           //1、定义数据源参数
           Map<String, Object> map = new HashMap();
           map.put("driverClassName", "com.mysql.jdbc.Driver");
           map.put("url", "jdbc:mysql://localhost:3306/test?characterEncoding=utf8");
           map.put("username", "root");
           map.put("password", "123546");
           map.put("initialSize", "5");
           map.put("maxActive", "20");
           map.put("maxWait", "3000");
           DataSorce ds = DruidDataSourceFactory.createDataSource(map);
           //2、创建连接
           conn = ds.getConnection();
           //3、定义sql
           String sql = "select * from t_test";
           //4、创建statement
           st = conn.createStatement();
           //5、使用 statement 执行sql,返回 结果集
           rs = st.executeQuery(sql);
           //结果集rs得到结果集元数据
           ResultSetMetaData md=rs.getMetaData();
           //获取结果集总列数
           var columnCount = md.getColumnCount();
           //6、解析rs
           while (rs.next()) {//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
               //根据每一行数据,封装成一个实体对象
                T t = c.newInstance();
               // 1、取出某一行的每个数据,封装到对象t的属性中
               for (int i = 1; i <= columnCount; i++) {
                   //通过列的序号,获取每一列的值
                   var value = rs.getObject(i);
                   if (value!=null){
                       //通过列的序号,获取每一列的列名
                       var columnName = md.getColumnName(i);
                       //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
                       var f = c.getDeclaredField(columnName);
                       //赋予私有属性的赋值权限
                       f.setAccessible(true);
                       //使用反射,把value给到对象t的属性中
                       f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
                   }
               }
               //把对象存入集合中
               tList.add(t);
           }
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           //7、关闭资源
           JdbcUtils.close(rs);
           JdbcUtils.close(st);
           JdbcUtils.close(conn);
       }
       return tList;
   }
}
posted @ 2022-09-26 17:31  zhαojh  阅读(1992)  评论(0编辑  收藏  举报