连接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
-
需要引入相关jar包,需要引入相关jar包,从maven官网中查找c3p0并下载,以及下载相关依赖(mchange-commons-java),将包导入项目即可
-
在用户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><!-- & 使用&转义 -->
<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>
- 手工方式使用:此方法配合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();
//获取连接对象
- 获取连接对象
new ComboPooledDataSource().getConnection()
使用默认配置文件的连接池,获取连接对象new ComboPooledDataSource("test").getConnection()
使用指定配置文件的连接池,获取连接对象
Druid
- 需要引入相关jar包,需要引入相关jar包,从maven官网中查找druid并下载,该包无依赖,将包导入项目即可
- 定义配置文件:可以是任意名字
# 连接参数
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
# 连接申请超时时间
- 加载配置文件,获取连接对象
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(); //关闭连接
Comments NOTHING