一. jdbc连接数据步骤
mysql mysql-connector-java 8.0.15
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.创建连接
Connection connection = DriverManager.getConnection(url,user,password);
参数说明:
url:jdbc:mysql://localhost:3306/studb
localhost:表示本地服务器
3306:数据库默认端口号
studb:数据库名
user:表示连接数据库的用户名
password:表示连接数据库的密码
3.创建SQL执行器
Statement statement = connection.createStatement();
4.执行SQL语句并返回结果
ResultSet resultSet = statement.executeQuery(sql);
Int i= statement.executeUpdate(sql);
5.释放资源
先创建的后关闭
/**
* 使用Statement执行sql
*/
@Test
public void statementTest() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "数据库用户名", "数据库密码");
//创建statement对象:执行sql语句,查询executeQuery(),增删改executeUpdate(),
statement = connection.createStatement();
//创建ResultSet,
resultSet = statement.executeQuery("select * from 表名");
// next()----将游标下移一行,判断是否存在。
// getInt() 获取int类型字段的值,
// getString() 获取String字段的值,
// 通过列的名字来获取字段的值或通过列的序号来获取字段的值
if (resultSet.next()) {
String Name= resultSet.getString("列名");
System.out.println(Name);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (resultSet!=null) {
resultSet.close();
}
if (statement!=null) {
statement.close();
}
if (connection!=null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二. PreparedStatement解决SQL注入问题
3.创建SQL执行器
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(int parameterIndex,String x));
preparedStatement.setLong(int parameterIndex,Long x);
4.执行SQL语句并返回结果
preparedStatement.executeQuery();
preparedStatement.executeUpdate();
/**
* 使用PrepareStatement执行sql
*/
@Test
public void prepareStatementTest() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//创建连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", "数据库用户名", "数据库密码");
//创建PreparedStatement:执行sql语句,可以防止sql注入
preparedStatement = connection.prepareStatement("select * from 表名 where lkm_id = ?");
preparedStatement.setLong(1,1);
//创建ResultSet,
resultSet = preparedStatement.executeQuery();
// next()----将游标下移一行,判断是否存在。
// getInt() 获取int类型字段的值,
// getString() 获取String字段的值,
// 通过列的名字来获取字段的值或通过列的序号来获取字段的值
if (resultSet.next()) {
String lkmName = resultSet.getString("lkm_name");
System.out.println(lkmName);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (resultSet!=null) {
resultSet.close();
}
if (preparedStatement!=null) {
preparedStatement.close();
}
if (connection!=null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三. JDBC工具类封装
1.创建配置文件:jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/stm_service
jdbc.user=root
jdbc.password=admin123
2. 编写JDBC工具类:JdbcUtils
/**
* JDBC工具类
*
* @author [email protected]
* @since 2021/11/10
*/
public class JdbcUtils {
private static String driverClass = null;
private static String url = null;
private static String user = null;
private static String password = null;
/**
* 静态代码块
*/
static {
try {
//获取jdbc.properties文件路径
String path = JdbcUtils.class.getClassLoader().getResource("jdbc.properties").getPath();
Properties properties = new Properties();
//获取properties对象
properties.load(new FileInputStream(path));
driverClass = properties.getProperty("jdbc.driverClass");
url = properties.getProperty("jdbc.url");
user = properties.getProperty("jdbc.user");
password = properties.getProperty("jdbc.password");
//加载驱动
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() {
Connection connection = null;
try {
//获取连接
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 释放资源
*/
public static void close(ResultSet rs,PreparedStatement pdst, Connection conn) {
try {
if (rs!=null) {
rs.close();
}
if (pdst!=null) {
pdst.close();
}
if (conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.使用JdbcUtils操作数据库
/**
* 使用jdbcUtils
*/
@Test
public void jdbcUtilsTest() {
//获取连接
Connection connection = JdbcUtils.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
preparedStatement = connection.prepareStatement("select * from cst_linkman where lkm_id = ?");
preparedStatement.setLong(1,1 );
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
String lkmName = resultSet.getString("lkm_name");
System.out.println(lkmName);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭资源
JdbcUtils.close(resultSet,preparedStatement ,connection);
}
}
四. DbUtils工具类(优化jdbc编程)
commons-dbutils commons-dbutils 1.7
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。尤其结合连接池使用效果更为理想。
DbUtils的核心是两个类一个接口:
1、DBUtils类:主要为关闭连接,装载JDBC驱动程序之类的常规工作提供方法,都是静态的方法。
2、QueryRunner类:为我们提供两个重要方法,调用方法之前需要先创建一个QueryRunner的对象。
为我们提供两个重要方法,调用方法之前需要先创建一个QueryRunner的对象。
QueryRunner qRunner=new QueryRunner();
QueryRunner qRunner=new QueryRunner(new ComboPooledDataSource());
创建对象时需要传入一个连接池的数据源,这里结合c3p0连接池来完成。
update()方法等价于executeUpdate(),支持DML操作
3)qRunner.query(Connection conn,String sql, ResultSetHandler rsh,Object... params)
4)qRunner.query(String sql, ResultSetHandler rsh,Object... params)
query()方法等价于executeQuery(),支持DQL操作
3、ResultSetHandler接口:用于处理ResultSet结果集,将结果集的的数据转换成不同形式。该接口的实现类有很多:
ArrayHandler |
将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值。 |
ArrayListHandler |
将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。 |
BeanHandler |
将结果集中第一条记录封装到一个指定的javaBean中。 |
BeanListHandler |
将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中。 |
ColumnListHandler |
将结果集中指定的列的字段值,封装到一个List集合中。 |
ScalarHandler |
它是用于单列数据查询。例如:select count(*) from users 操作。 |
MapHandler |
将结果集中第一条记录封装到Map集合中,Key代表列名, Value代表该列数据。 |
MapListHandler |
将结果集中每一条记录封装到Map集合中,Key代表列名, Value代表该列数据,Map集合再存储到List集合 |
4、使用DbUtils操作数据库
/**
* 使用DbUtils
*/
@Test
public void DbUtilsTest() {
// String insertSql = "INSERT INTO cst_linkman (lkm_name,lkm_phone) values (?,?)";
// String querySql = "SELECT * FROM cst_linkman WHERE lkm_name = ?;";
String queryListSql = "SELECT * FROM cst_linkman;";
//使用自己封装的工具类获取连接对象
Connection connection = JdbcUtils.getConnection();
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
try {
// 通过queryRunner对象操作数据库
// queryRunner.update(connection, insertSql, "王思聪","888888");
// CstLinkman cstLinkman = queryRunner.query(connection, querySql, new BeanHandler(CstLinkman.class), "王思聪");
List list = queryRunner.query(connection, queryListSql, new BeanListHandler(CstLinkman.class));
for (CstLinkman cstLinkman : list) {
System.out.println(cstLinkman);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
DbUtils.close(connection);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
五. 数据库连接池-c3p0连接池
1. 依赖导入项目中
com.mchange c3p0 0.9.5.2 com.mchange mchange-commons-java 0.2.11
2. 编写属性配置文件c3p0.properties
注意事项:
- 属性配置文件的名称必须叫c3p0.properties,不能改文件名
- 该属性配置文件必须放在src路径下
- 属性配置文件中的属性名必须与下表中指定的名称相同,不能随意修改,而且必须加c3p0前缀。
#基础配置
c3p0.driverClass =com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/stm_service
c3p0.user=root
c3p0.password=admin123
#选配
c3p0.maxPoolSize = 100 最大连接数 默认15
c3p0.minPoolSize = 10 是小连接数 默认3
c3p0.initialPoolSize = 10 初始化连接数 在最大和最小之间
c3p0.maxIdleTime = 30 最大空闲时间,毫秒为单位
3. 编写c3p0工具类:C3p0Utils
**
* c3p0工具类
*
* @author [email protected]
* @since 2021/11/13
*/
public class C3p0Utils {
//获取连接的方法
public static Connection getConnection() {
Connection connection = null;
//创建数据源对象
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
//通过数据源对象获取连接
try {
connection = comboPooledDataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
4. 使用c3p0操作数据库
/**
* 使用c3p0+DbUtils
*
*/
@Test
public void C3p0AndDbUtilsTest() {
String insertSql = "INSERT INTO cst_linkman (lkm_name,lkm_phone) values (?,?)";
// 创建QueryRunner时,传入一个c3p0连接池的数据源,这样可以避免使用c3p0工具类
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
try {
queryRunner.update(insertSql,"林俊杰","999999");
} catch (SQLException e) {
e.printStackTrace();
}
}