Java精进

前言

本文适合有一定java基础的同学,通过自定义持久层框架,可以更加清楚常用的mybatis等开源框架的原理。

JDBC操作回顾及问题分析

学习java的同学一定避免不了接触过jdbc,让我们来回顾下初学时期接触的jdbc操作吧

以下代码连接数据库查询用户表信息,用户表字段分别为用户id,用户名username。

Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; User user = new User(); try { // 加载数据库驱动 //Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.cj.jdbc.Driver"); // 通过驱动管理类获取数据库链接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mimashi3124"); // 定义sql语句?表示占位符 String sql = "select * from user where username = ?"; // 获取预处理statement preparedStatement = connection.prepareStatement(sql); // 设置参数,第⼀个参数为sql语句中参数的序号(从1开始),第⼆个参数为设置的参数值 preparedStatement.setString(1, "盖伦"); // 向数据库发出sql执⾏查询,查询出结果集 resultSet = preparedStatement.executeQuery(); // 遍历查询结果集 while (resultSet.next()) { int id = resultSet.getInt("id"); String username = resultSet.getString("username"); // 封装User user.setId(id); user.setUsername(username); } System.out.println(user); } catch ( Exception e) { e.printStackTrace(); } finally { // 释放资源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }

数据库连接池我们可以直接使用c3p0提供的ComboPooledDataSource即可

为了解决sql硬编码问题,我们要把sql写到xml文件中,那自然是要定义一个xml文件了。

光有sql肯定不行,毕竟我们要先连接数据库,sql语句才有存在的意义。所以xml中得先定义数据配置信息,然后才是sql语句。

1.定义配置xml文件

我们新建一个sqlMapConfig.xml,定义数据源信息、并且增加两个sql语句,parameterType为sql执行参数,resultType为方法返回实体。

代码如下(数据库不同版本使用驱动类可能不同):

select * from user where id = #{id} and username =#{username} select * from user