最原始的JDBC数据库连接:
其核心类有四类:
DriverManager--用来得到连接
Connection--得到表明与数据库已连接
Statement--用来向服务器发送SQL语句的对象
ResultSet--表示结果集。
步骤:** 导驱动包,com.mysql.jdbc.Driver。
** 使用DriverManager得到Connection,需要四大连接参数。
注意:a.driverclassName:指定驱动类的名称,它必须是jdbc中提供的Driver接口的实现类,该实现类由驱动提供,而不是JDBC提供。
b.url
c.username
d.password
** 加载驱动类:Class.forName(driverclassName)
大体意思:加载类时会执行该类的static代码块,而驱动类的static块中把自己注册给了DriverManager。
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver;
DriverManager.registerDriver(driver);
** 使用DriverManager传递剩下的三个参数,得到Connection对象。
** 通过Connection对象得到Statement 。
** 使用Statement对象发送增删改语句。
或用Statement对象,调用executeQuery(),发送select查询语句,得到ResultSet.
资源关闭顺序:resultSet--Statement--Connection(倒着关闭)
存在的问题:1、数据库连接频繁关闭和开启,消耗资源。
2、sql语句在java中硬编码,如果将来修改sql,需要重新进行编译java文件,不利系统维护。
3、向sql中设置参数,需要人工判断调用方法setXXX(占位符的位置也需要人工判断),编程不方便。
4、遍历ResultSet,需要人工判断调用getXXX方法,如果添加字段,需要修改代码调用resultSet.getXXX获取结果。
<span style="font-size:14px;">public class JdbcTest {
private static String sql = "SELECT id,username FROM USER WHERE id=?";
public static void main(String[] args) {
//数据库连接
Connection connection = null;
//prepareStatement
PreparedStatement preparedStatement = null;
//结果集
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据库
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "mysql" );
//创建statement
preparedStatement = connection.prepareStatement(sql);
//向sql 语句中设置参数,sql 占位符位置上的参数即id的值
preparedStatement.setInt(1, 1);
//执行数据查询,取出查询结果集
resultSet = preparedStatement.executeQuery();
//遍历结果集resultSet
while(resultSet.next()){
int id = resultSet.getInt("id" );
String username = resultSet.getString("username" );
System. out.println("id=" +id+" username="+username);
}
} 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();
}
}
}
}
}
</span>
创建连接有两种方式:
1、JDBC,如上记述的就是此种方式。
2、连接池,其又有两种方式:
** 一种是DBCP,其核心类是BasicDataSource,其本身是一个JavaBean,提供了很多属性,如setDriverClassName()、setUrl()、setUserName()、setPassword().
** 一种是C3P0,其核心类是ComboPooledDataSource,其四大连接参数:setDriverClass()、setJdbcUrl()、setUser()、setPassword()
mybatis对存在的问题的解决方法:
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis在XXXXmapper.xml中定义statement使用了parameterType指定传入参数类型(也可以是pojo),同时在sql语句中使用#{}指定占位符号,且#{}指定传入值。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。Mybatis在XXXXmapper.xml中定义resultType,可以指定一个pojo类型(也可以是简单类型),Mybatis自动将sql的查询结果映射成resultType指定的java对象。通过java对象可以取出pojo的属性值。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis在XXXXmapper.xml中定义statement使用了parameterType指定传入参数类型(也可以是pojo),同时在sql语句中使用#{}指定占位符号,且#{}指定传入值。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。Mybatis在XXXXmapper.xml中定义resultType,可以指定一个pojo类型(也可以是简单类型),Mybatis自动将sql的查询结果映射成resultType指定的java对象。通过java对象可以取出pojo的属性值。