JDBC数据库连接

最原始的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的属性值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值