09月14日学习杂记(用两种模式操作数据库[模板模式与策略模式])

今天主要学习JDBC,从配置文件中读取连接数据库的相关信息,以及两个模式(策略与模板)的代码的讲解.

*******************************************注意********************************************************
在DOS命令下的时候登陆MYSQL系统,会把中文显示成乱码,为了避免这种情况的发生,需要设置MYSQL的字符集编码格式,服务器与客户端都需要设置,只设置服务器的时候,虽然服务器的编码格式可以存储中文,但示客户端显示不出来,如果服务器不设置,则根本没有用中文形式存储.
为服务设置编码格式:(如下设置只是设置三个属性为GBK[一种比GB2132要大的存储格式,可以存储繁体字],需要用SHOW VARIABLES查看运行环境的其它编码格式,只有文件系统属性为只读,其余全应该设置成为中文格式)
mysql -C GBK --character-set-filesystem=GBK
为客户端设置编码格式:
mysql -uroot --default-character-set=GBK
********************************************************************************************************

杂记:
一个CONNECTION可以有多个STATEMENT,一个STATEMENT只能有一个RESULTSET,有的数据库驱动只允许一个连接保持一个打开的STATEMENT,例如:SQLSERVER
最差实践:没有关闭连接或关闭连接的代码不一定被执行.
最佳实践:标准的JDBC程序范本.

STATEMENT主要方法介绍:
EXECUTEQUERY方法用于执行SQL查询,EXECUTEUPDATE方法用于执行INSERT,UPDATE,DELETE语句以及DDL语句.EXECUTE方法执行不确定是什么类型的语句或要返回多个结果集的语句,GETMORERESULTS和GETUPDATECOUNT和GETRESULTSET等方法.ADDBATCH与EXECUTEBATCH方法.GETGENERATEKEYS要结合DATABASEMETADATA.SUPPORTGETGENERATEKEYS方法判断.

PREPAREDSTATEMENT:避免雷同SQL语句的频繁语法检查,语义分析,选择优化器并创建相应的执行计划.相关CONNECTION对象关闭之后,PREPAREDSTATEMENT对象也就无效了.不过,许多驱动程序都会自动缓存预备语句.

================================================================================================================

代码实例:(课堂老师写的两种模式(模板模式与策略模式))(见程序清单0914/MySqlCharsetDemo.java)
import java.sql.*;
//最差实践
//以下用两种来实现:一.利用模板模式,二.利用策略模式
public class  MySqlCharsetDemo
{
 MyPolicy mp = null;
 public static void main(String [] args)
 {
  //利用模式板模式实现(用星号表示)*********************
  //new ChildClass().execute();
  //***************************************************
  
  
  MySqlCharsetDemo md = new MySqlCharsetDemo();
  md.setPolicy(new MyPolicyImpl());
  md.execute();
 }
 
 public void setPolicy(MyPolicy mp)
 {
  this.mp = mp;
 }
 
 public void execute()
 {
  Connection cn = null;
  Statement stmt = null;
  ResultSet rs = null;
  try
  {
   cn = DriverManager.getConnection("jdbc:mysql://localhost/itcast","root","");
   stmt = cn.createStatement();
   System.out.println("before execute!!!");
   mp.execute(stmt);

   //**********************************************************************
   //stmt.executeUpdate("insert into student values(null,'abc')"); 
   //doExecute(stmt);
         
   /*rs = stmt.executeQuery("select * from student");
   
   while(rs.next())
   {
    System.out.printf("%s:%s/n",rs.getString(1),rs.getString("name"));
   }*/
   //**********************************************************************
   
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  finally
  {
   if(rs != null)  
    try{rs.close();}catch(Exception e){}
   if(stmt != null)
    try{stmt.close();}catch(Exception e){}
   if(cn != null) 
    try{cn.close();}catch(Exception e){}
  }
 }
 
 //********************************************************************
 //abstract void doExecute(Statement stmt);
 //********************************************************************
 
}

//**********************************************************************
/*class ChildClass extends MySqlCharsetDemo
{
  public void doExecute(Statement stmt)
  {
   stmt.executeUpdate("insert into student values(null,'abc')"); 
  }
}*/
//**********************************************************************

interface MyPolicy
{
 public void execute(Statement stmt);
}

class MyPolicyImpl implements MyPolicy
{
 public void execute(Statement stmt)
 {
  try
  {
   System.out.println("execute!!!");
   stmt.executeUpdate("insert into student values(null,'abc')"); 
   stmt.executeUpdate("insert into student values(null,'中国')");  
   ResultSet rs = stmt.executeQuery("select * from student");
   
   while(rs.next())
   {
    System.out.printf("%s:%s/n",rs.getString(1),rs.getString("name"));
   }
   rs.close();
  }catch(Exception e){e.printStackTrace();} 
 }
}

 


==============================================================================================================

自己定的从配置文件中读取数据为配置信息的实例(见程序清单0914/JdbcJin.java)
import java.sql.*;
import java.io.*;
import java.util.Properties;
class JdbcJin{
 public static void main(String args[]) throws Exception{
  String drivers = null;
  String url = null; 
  String user = null;
  String password = null;
 
  InputStream isp = JdbcJin.class.getResourceAsStream("/prop.properties" );
  Properties pro = new Properties();
  pro.load(isp);
  isp.close();
  
  drivers = pro.getProperty("drivers");
  url = pro.getProperty("url"); 
  user = pro.getProperty("user");
  password = pro.getProperty("password");
 
  Class.forName(drivers);
  //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  Connection con = DriverManager.getConnection(url,user,password); 
  Statement stmt = con.createStatement();
  String sql = "select * from student";
  ResultSet rs = stmt.executeQuery(sql);
  System.out.println ("显示表的内容信息如下:");
  while(rs.next()){
   System.out.printf("%s:%s:%s/n",rs.getString(1),rs.getString(2),rs.getString(3));
  }
  System.out.println ();
  System.out.println ("正向表中更新记录........:");
  System.out.println ();
  System.out.println ();
  sql="insert into student values(6,'式样',200,'工棚')";
  stmt.executeUpdate(sql);
  
  System.out.println ("更新表的数据以后的信息如下:");
  sql = "select * from student";
  ResultSet rs2 = stmt.executeQuery(sql);
  while(rs2.next()){
   System.out.printf("%s:%s:%s/n",rs2.getString(1),rs2.getString(2),rs2.getString(3));
  }
   
  rs.close();
  stmt.close();
  con.close();
 }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值