今天主要学习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();
}
}