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