MyBatis学习之原生JDBC总结分析
原生JDBC连接数据库
- 加载数据库驱动
- 通过驱动管理类
Connection获得数据库连接 - 创建JDBC Statement对象
- 编写SQL语句并设置参数(使用preparedStatement)
- 通过
PreparedStatement执行SQL并获取ResultSet结果集 - 对结果进行解析处理
- 释放资源
resultSet–>preparedStatement–>connection
Demo程序
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author FeiEr
*
*/
public class JDBCTest {
public static void main(String[] args) {
Connection connection = null;
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
try {
String url = "jdbc:mysql://localhost:3306/mybatis";
String user = "root";
String password = "123456";
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
connection = DriverManager.getConnection(url, user, password);
String sql = "select * from user where id = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"10");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString("id")+" : "+resultSet.getString("username"));
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
try {
if(resultSet != null)
resultSet.close();
}catch (SQLException e){
e.printStackTrace();
}
try{
if(preparedStatement != null)
preparedStatement.close();
}catch (SQLException e){
e.printStackTrace();
}
try {
if(connection != null)
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
原生JDBC存在的问题
-
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能
解决:在
SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库连接 -
SQL语句在代码中硬编码,造成代码不易维护
解决:将SQL语句配置在
XXXmapper.xml文件中与Java代码分离 -
使用
preparedStatement向占有位符号传参存在硬编码,因为SQL语句的where条件不一定,修改SQL还要修改代码,系统不易维护解决:MyBatis自动将Java对象映射至SQL语句,通过
statement中的parameterType定义输入参数的类型 -
对结果集解析存在影编码(查询列名),SQL变化导致解析代码变化,系统不易维护
解决:MyBatis自动将SQL执行结果映射至Java对象,通过
statement中的resultType定义输出结果的类型