`
cyw
  • 浏览: 31718 次
  • 来自: 广州
社区版块
存档分类
最新评论

MySQL-JDBC

阅读更多

MySQL-JDBC

   JDBC是一种java数据库连接Api接口。JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果

   接下来便是开发步骤:

 1、     创建项目

 2、     右键项目,添加mysql-connector-java-5.1.29-bin.jar包。可以从MySQL官网下载mysql-connector-java-5.1.29.zip,解压后直接获得。

 3、     创建数据库。现在已经假定各位已经创建好自己的数据库了。

 4、     进行编程。编程完成之后,右键运行即可。

 

下面探讨一下核心代码:

 1、     连接数据库

 

Connection conn = null;
		String dburl = "jdbc:mysql://localhost:3306/cyw";
		String username = "cyw";
		String password = "";
		String driver = "com.mysql.jdbc.Driver";
		
		//先动态加载驱动,然后进行实例化
		Class.forName(driver).newInstance();
		//链接数据库
		conn = DriverManager.getConnection(dburl, username, password);

 

  

 2、     连结对象创建成功后,即可通过连结对象创建 statement 对象,以执行 SQL 语句。我们可将要执行的 SQL 语句分为两类,一类为需要返回结果表的 select 语句;一类为执行 insert update delete 操作的语句,因用程序只需要这类语句返回操作所生效的行数即可;对于这两种 SQL 操作, Statement 在执行时可采用不同的方法,如是 select 语句,则使用 executeQuery(sql)方法返回一个 ResultSet 对象,其中包含查询到的数据;如是另外三种,则使用 executeUpdate(sql)方法,返回一个 int 型值,代表语句所影响的行数。

 

关于查询方式,有三种,分别是statementprepareStatementCallableStatement。其中PrepareStatementStatement的子类、CallableStatementPrepareStatement的子类。

   Statement,又叫做拼装SQL语句。可以直接从conn链接对象获得,直接编译执行。

   PrepareStatement,又称预编译SQl语句。顾名思义,有一个预编译过程。数据库可以先将这些格式固定的SQL语句进行编译,存入数据库的缓存池里面。此时,并没与执行编译后的SQL语句,等到我们需要的时候,我们为?占位符赋值之后,就不用再次进行编译,而是直接运行。这是一种延迟加载的机制。能够有效的提高数据库的效率(毕竟只有在需要的时候才会进行运行,节省了资源),当然也克服了StatementSQL注入风险。

   CallableStatement是关于存储过程的,可下回分解。

 

//查询
     public  void query(String table, String colName, String temp) throws SQLException{
         String sql = "select * from "+table+" where "+colName+"=?";
        
         //一般使用预编译SQL语句,
         PreparedStatement ps = conn.prepareStatement(sql);
        
         //为每一个占位符?设置参数
         ps.setString(1, temp);
         ResultSet rs = ps.executeQuery();
        
         //进行显示
         while(rs.next()){
              int id = rs.getInt("id");
              System.out.println("id:"+id);
         }
}
 
//添加
     publicvoid add(String table) throws SQLException{
         String sql = null;
         if("datatable".equals(table)){
              sql = "insert into "+table+"(AT_id,type_id,data) values (?,?,?)";
         }
        
         PreparedStatement ps = conn.prepareStatement(sql);
         ps.setInt(1, 11);
         ps.setInt(2, 2);
         ps.setInt(3, 66);
 
         int count = ps.executeUpdate();
         if(count>0){
              System.out.println("插入数据成功!影响的记录条数是"+count);
         }else{
              System.out.println("插入数据失败!");
         }
     }

 

 

 

其他的类似。

 3、       结果集提取



 

如以上例子。

 4、      批处理

Statement提供了一个 addBatch(String sql)的方法将sql 加入批处理; PreparedStatement 对象的 addBatch()方法直接将预编译的 sql 加入批处理,最后可通过 executeBatch()方法一次性执行所有 sql。注意,这里 executeBatch()方法返回为一个 int[],数组的第 i 个元素的值代表加入批处理的第 i sql 所影响的行数。

     

//测试批量处理
     publicvoid bacthInsert(){
         try {
              String sql = "insert into datatable(AT_id,type_id,data) values(?,?,?)";
              PreparedStatement ps = conn.prepareStatement(sql);
              for(int i=0;i<10;i++){
                   ps.setInt(1, i);
                   ps.setInt(2, i);
                   ps.setInt(3, i);
                   ps.addBatch();
              }
              int[] result = ps.executeBatch();
              for(int i : result)
                   System.out.println(i);
         } catch (SQLException e) {
              System.out.println("批量处理失败");
              e.printStackTrace();
         }
}
 

 

 5、       事务

事务是指一个单元的工作,要么全部执行,要么就是全部不执行,非01.

Mysql可以通过手动提交进入事务机制。

详细以后再讲,以下是核心代码:

Conn.setAutoCommit();   //false,设置为手动提交,否则为自动提交

Conn.rollback()       //回滚到起始状态。    

关于事务级别:

Conn.setTransactionIsolation(事务级别常量);

Conn.getTransactionIsolation();

关于SavePoint接口(类似于存档点):

Java.sql.Savepoint txpoit = conn.setSavePoint(String SavePoint的名字);

Conn.rollback(txpoint);         //回滚到上一个SavePoint

Conn.releaseSavePoint(String SavePoint的名字);        //释放SavePoint

 6、       数据库连接池

为了减少运行过程中,数据库频繁创建、销毁连接,而消耗的资源,设立了数据库连接池,相当于一个数组或者集合类,存放了一些数据库连接。当需要时,便可以从连接池取得连接,不需要时便返回到连接池里面。

Connection 的建立较之线程更为费时,不但要建立底层的 TCP/IP 链路,还要通过复杂的数据库安全认证计算,这就有必要采用“连结池”技术。

网上有很多关于数据库连接池的开源实现,比如DBCPHibernateC3P0组件等等。

 7、    元数据查询

元数据,可以理解为数据的数据,如数据库版本号、表的列数,列名,某列数据类型等, JDBC 中可以得到两种元数据类型,一种是通过 Connection 对象的 getMetaData()方法得到 DatabaseMetaData对象用来取得数据库的相关信息;另一种是通过 ResultSet 对象的 getMetaData()方法得得结果集的元数据 ResultSetMetaData 对象用来取得结果集,如列个数等相关信息。

核心代码:

//取得数据库的元数据对象
DatabaseMetaData dmd=conn.getMetaData();
String dbName=dmd.getDatabaseProductName();
String dbVersion= dmd.getDatabaseProductVersion();

 

//得到结果集的元数据对象
ResultSetMetaData rmd=rs.getMetaData();
//结果集有几列
int columCount=rmd.getColumnCount();
//打印出每一列的标题
for(int i=1;i<=columCount;i++){
System.
out.print(rmd.getColumnName(i)+"\t");
}

 

 



 

  • 大小: 41.7 KB
  • 大小: 54.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics