07-连接MySQL

nobility 发布于 2022-08-28 1513 次阅读


连接MySQL

Java连接MySQL

需要引入相关jar包,需要引入相关jar包,从maven官网中查找MySQL Connector并下载,导入项目即可

直连方式

Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
  String url = "jdbc:mysql://122.51.213.160:3306/test"; //url连接协议
  String user = "root"; //用户名
  String password = "root"; //密码
  connection = DriverManager.getConnection(url, user, password);  //根据url、用户名和密码获取连接
  preparedStatement = connection.prepareStatement("select username from user where username = ?");//创建sql执行对象,使用问号做占位符
  preparedStatement.setString(1, "zhangsan");  //设置占位符字段内容
  resultSet = preparedStatement.executeQuery(); //执行sql并返回结果
  while (resultSet.next()) { //游标下移
    String string = resultSet.getString(1); //获取第一列返回结果
    System.out.println(string); //处理一行数据
  }
} catch (SQLException e) {
  e.printStackTrace();
} finally {
  try {
    if (resultSet != null) {
      resultSet.close();  //关闭结果集资源
    }
    if (preparedStatement != null) {
      preparedStatement.close();  //关闭sql预处理资源
    }
    if (connection != null) {
      connection.close(); //关闭连接
    }
  } catch (SQLException e) {
    e.printStackTrace();
  }
}

数据库连接池

由于申请数据库课连接是向数据库服务器的系统调用,频繁的系统调用导致程序的效率降低,所以需要在程序初始化时,一次申请多个连接对象,保存在一个连接池中,每次需要连接对象时从连接池中拿,用完放回池中,减少了系统调用,提高了程序效率

java定义了DataSource接口作为连接池的标准,由各大数据库厂商实现具体的连接池类,该接口方法Connection getConnection()用来从连接池中获取连接对象

连接池中的连接类与数据库厂商提供的连接类是不同的,他们重新写了一个连接类,所以在连接池中申请的连接对象调用void close()方法不在将连接释放掉,而是归还到连接池中

C3P0
  1. 需要引入相关jar包,需要引入相关jar包,从maven官网中查找c3p0并下载,以及下载相关依赖(mchange-commons-java),将包导入项目即可

  2. 在用户classPath下创建配置文件:c3p0.properties或c3p0-config.xml

<c3p0-config>
    <!-- 使用默认的配置读取连接池对象 -->
    <default-config>
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property><!-- & 使用&amp;转义 -->
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property><!--连接池初始化连接对象数量-->
        <property name="acquireIncrement">2</property><!--向数据库服务器一次申请的连接数量-->
        <property name="minPoolSize">2</property><!--连接池最少的连接数量,不够会向数据库申请-->
        <property name="maxPoolSize">10</property><!--连接池可存放最大的连接数量-->
        <property name="checkoutTimeout">3000</property><!--向连接池申请连接对象等待超时时间-->
    </default-config>
  
		<!--  使用test配置文件信息读取连接池对象 -->
    <named-config name="test">
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/dome</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property><!--连接池初始化连接对象数量-->
        <property name="acquireIncrement">2</property><!--向数据库服务器一次申请的连接数量-->
        <property name="minPoolSize">2</property><!--连接池最少的连接数量,不够会向数据库申请-->
        <property name="maxPoolSize">10</property><!--连接池可存放最大的连接数量-->
        <property name="checkoutTimeout">3000</property><!--向连接池申请连接对象等待超时时间-->
    </named-config>
</c3p0-config>
  1. 手工方式使用:此方法配合Properties可以使用任意的配置文件名
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://122.51.213.160:3306/test");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");

comboPooledDataSource.setAcquireIncrement(5);
//若数据库中连接数不足时, 一次向数据库服务器申请多少个连接
comboPooledDataSource.setInitialPoolSize(5);
//初始化数据库连接池时连接的数量
comboPooledDataSource.setMinPoolSize(2);
//数据库连接池中的最小的数据库连接数
comboPooledDataSource.setMaxPoolSize(10);
//数据库连接池中的最大的数据库连接数
Connection connection = comboPooledDataSource.getConnection();
//获取连接对象
  1. 获取连接对象
    1. new ComboPooledDataSource().getConnection()使用默认配置文件的连接池,获取连接对象
    2. new ComboPooledDataSource("test").getConnection()使用指定配置文件的连接池,获取连接对象
Druid
  1. 需要引入相关jar包,需要引入相关jar包,从maven官网中查找druid并下载,该包无依赖,将包导入项目即可
  2. 定义配置文件:可以是任意名字
# 连接参数
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=root

# 连接池参数
initialSize=5
# 初始化连接数量
maxActive=10
# 最大连接数量
minIdle=2
# 最小连接数量
maxWait=3000
# 连接申请超时时间
  1. 加载配置文件,获取连接对象
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("druid.properties");
//反射获取配置文件输入流
Properties properties = new Properties();
properties.load(inputStream);
//将配置文件输入流加载到properties
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//将properties作为参数利用DruidDataSourceFactory工厂类创建连接池
Connection connection = dataSource.getConnection();
//从连接池中获取连接对象

数据库操作

DButils

需要引入相关jar包,需要引入相关jar包,从maven官网中查找DButils并下载,导入项目即可

有多种模板类对象,都实现了ResultSetHandler接口,若为JavaBean模板则要求JavaBean必须有无参构造,和每个对应属性的Seter/Geter方法,以及基本类型都使用包装类

处理类 功能
BeanHandler(Class clazz) 处理成JavaBean,接收一个JavaBean类对象
BeanListHandler(Class clazz) 处理成JavaBean的List集合,接收一个JavaBean类对象
MapHandler() 处理成Map集合
MapListHandler() 处理成Map的List集合
KeyedHandler() 处理成Map的Map集合
ColumnListHandler(int columnIndex) 处理成指定单个列的List集合,也可指定字符串的单个列名
ScalarHandler(int columnIndex) 处理成指定单个字段值对象,也可指定字符串字段名

创建QueryRunner对象,该构造方法接收一个DataSource 数据源对象,即数据库连接池对象,之后就可以使用该对象中的方法执行SQL了,至于连接对象的获取和收回,该对象内部会自动完成

方法名 描述
update(String sql,Object ...params) 执行插入或更新的SQL语句,params为SQL中的占位符内容,返回影响行数
delete(String sql,Object ...params) 执行删除的SQL语句,params为SQL中的占位符内容,返回影响行数
query(String sql,ResultHandler rh,Object ...params) 执行查询的SQL语句,rh为处理类用来决定返回的查询结果类型,params为SQL中的占位符内容
Spring JDBC

需要引入相关jar包,需要引入相关jar包,从maven官网中查找Spring JDBC并下载,以及下载相关依赖(spring-beans、spring-core和spring-tx)包导入项目,虽然并没有显示指出依赖commons-logging,但是还是需要自行搜索并下载该jar包的

创建JdbcTemplate对象,该构造方法接收一个DataSource 数据源对象,即数据库连接池对象,之后就可以使用该对象中的方法执行SQL了,至于连接对象的获取和收回,该对象内部会自动完成

方法名 描述
update(String sql,Object ...args) 执行插入、删除和更新的SQL,args为SQL中的占位符内容,返回影响行数
queryForMap(String sql,Object ...args) 执行查询SQL,并将结果处理成Map集合
queryForList(String sql,Object ...args) 执行查询SQL,并将结果处理成Map的List集合
query(String sql,RowMapper rm,Object ...args) 执行查询SQL,并将结果处理成JavaBean的List集合,一般使用BeanPropertyRowMapper(Class clazz)对象,该类构造接收一个JavaBean类对象
queryForObject(String sql,Class clazz) 执行SQL,返回单个字段值对象,类型由clazz参数指定

Node连接MySQL

使用npm install mysql --save在项目中安装node-mysql驱动

在连接MySQL8时,报Client does not support authentication protocol requested by server; consider upgrading MySQL client错误,原因是:MySQL8中用户默认使用的密码验证插件为caching_sha2_password,更改为之前旧版本中的密码验证插件mysql_native_password即可

select host,user,plugin from user;	-- 查看用户,访问列表和密码验证插件
alter user 'root'@'%' identified with mysql_native_password by 'root';	-- 通过修改密码方式修改密码验证插件

代码

const mysql = require("mysql"); //导入mysql模块
const connect = mysql.createConnection({ //创建连接对象
    host: "127.0.0.1",
    port: "3306",
    charset: "UTF8", //字符集要大写
    multipleStatements: true, //是否许一个query中有多条sql语句
    connectTimeout: 10000, //连接超时时间为10秒
    user: 'root',
    password: "root",
    database: "test"
})
connect.connect((err) => {
    if (err) throw err
    console.log("连接成功,连接ID为", connect.threadId);
}); //连接
connect.query("select * from user where username=?", //使用问号做占位符
    ["zhangsan"], //预处理拼接sql变量,防止拼接sql时,sql注入漏洞
    (err, result) => {
        if (err) throw err;
        console.log(result); //处理返回结果
    });
//执行sql,虽然该函数名叫query但可以执行更新语句的sql
connect.end(); //关闭连接
此作者没有提供个人介绍
最后更新于 2022-08-28