java连接mysql数据库初体验

java 连接数据库是一项很常用的基本,这几天刚好在学习这个东西,分享下学习心得和经验

数据库:mysql

编程工具用的是 eclipse

建立连接用的驱动文件是mysql-connector-java-5.1.7-bin

以上的东西网上都能很方便的下载到

安装mysql和eclipse这边就不说了。直接到连接数据库那步。

数据库连接时主要用到的类和接口有DriverManager、Connection、Statement、ResultSet等,这些将在接下来的例子程序中介绍。

首先建立一个java工程,然后就是导入驱动文件mysql-connector-java-5.1.7-bin。 导入方法如下。右击工程文件在弹出的选项中选中Build path ->configure Build path .这是会弹出一个窗口,在窗口的右侧选择Libraries,在选择Add External Class Foldert添加驱动文件。(不知道怎么添加图片。。。。不然可以截个图);

到此为止,需要的配置工作基本完成了。剩下的工作是软件上实现连接。

 1 package Jdbc_1;
 2 
 3 import java.sql.*;
 4 
 5 
 6 public class Test_1 {
 7 
 8     /**
 9      * @param args
10      */
11     public static void main(String[] args) {
12     
13         try {
14             Class.forName("com.mysql.jdbc.Driver");
15         } catch (ClassNotFoundException e1) {
16             // TODO Auto-generated catch block
17             e1.printStackTrace();
18         }
19         
20         try (        
21             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/task11", "root", "111111");
22             Statement stmt = conn.createStatement();
23             ResultSet rst = stmt.executeQuery( "select * from food");)
24             {
25             while(rst.next()){
26                 String id = rst.getString(1);
27                 String name = rst.getString("name");
28                 String company = rst.getString("company");
29                 System.out.println(id+"\t"+ name + "\t" + company);
30             }
31         } catch (Exception e) {
32             // TODO Auto-generated catch block
33             e.printStackTrace();
34         }  
35         
36     }
37 
38 }

以上是一个简单的数据库连接程序。Class.forName();加载驱动,数据库为mysql时为 "com.mysql.jdbc.Driver"

当连接的是其他的数据库时会改变该语句具体请到网上百度去。

接下来是建立数据库和java的连接,由语句Connection conn = DriverManager.getConnection(String url, String user, String password);实现。

url为驱动文档,user和password为用户名和密码,有DBA分配。

Statement通过conn的createStatement()方法得到,通过Statement我们何以执行sql语句。

Statement的方法有很多,具体何以去查找java的API说明(官网上也有的下)。sql执行语句大致有三种分别是executeQuery、executeUpdate和execute。

executeQuery执行的是DDL语句,返回值是一个ResultSet,同过这个ResultSet我们可以对结果进行操作,如上面的程序通过while循环对结果集的操作,输出结果是数据库的id、name、company三个的具体内容这个更具查询的数据库不同而不同。以上就是一个简单的数据库连接程序。

下面我在上传几个例子好让大家体会一下

 1 package Jdbc_1;
 2 
 3 import java.io.*;
 4 import java.sql.*;
 5 import java.util.Properties;
 6 public class executeUp {
 7 
 8     /**
 9      * @param args
10      */
11     private static String driver;
12     private static String url;
13     private static String user;
14     private static String pass;
15     //用配置文件的方法实现配置更符合工程需求
16     public void initParam(String file) throws Exception{
17         Properties pro = new Properties();
18         pro.load(new FileInputStream(file));
19         driver = pro.getProperty("driver");
20         url = pro.getProperty("url");
21         user = pro.getProperty("user");
22         pass = pro.getProperty("pass");
23         
24     }
25     public static void main(String[] args) throws Exception{
26             executeUp eu = new executeUp();
27             eu.initParam("./src/mysql.ini");//程序中引用的文件也挺有讲究的,百度一下
28             Class.forName(driver);
29             try(Connection conn = DriverManager.getConnection(url,user,pass);
30                     Statement st = conn.createStatement();){
31              st.executeUpdate("drop table if exists jdbc_eu1");   //executeUpdate可处理ddl和dml语句,前者返回值0,后者返回受影响条数
32              st.executeUpdate("create table jdbc_eu1 " +
33                      "(id int primary key auto_increment ," +
34                      "name varchar(255));");
35              System.out.println("------create table successfully--------");
36              //检验executeUpdate处理DML语句时的情况
37              System.out.println("-------deal with DML-------");
38              int num = st.executeUpdate("insert into jdbc_eu1(id,name)select id,name from food where id > 2");
39              System.out.println("-------DML deal already--------");
40              System.out.println("num = "+num);//查看mysql数据库可以看到id〉2的条目有4,符合实际情况
41              //下面使用execute语句处理
42              //execut可以处理任何sql语句,返回boolean值,表明是否返回了ResultSet值
43              st.executeUpdate("drop table if exists jdbc_eu;");
44              st.executeUpdate("create table jdbc_eu(id int primary key auto_increment);");//见表方便查看
45             // boolean mark = st.execute("insert into jdbc_eu(id) select id from food where id > 4");
46              //当执行DML语句时,输出受影响语句
47              boolean mark = st.execute("select * from food ");//当执行DDL语句是输出查询到的信息
48              if(mark){
49                  try(ResultSet rs = st.getResultSet(); ){
50                      ResultSetMetaData rsmd =rs.getMetaData();//用于分析ResultSet的接口
51                      int count = rsmd.getColumnCount();//提取数据库的列数
52                      while(rs.next()){
53                          for(int i=0;i<count;i++){
54                              System.out.print(rs.getString(i+1)+"\t"); 
55                          }
56                          System.out.println();
57                      }
58                  }
59              }else{
60                  System.out.println("受影响语句数"+st.getUpdateCount());
61              }
62              
63              System.out.println("--------程序结束----------");
64             }
65     }
66 
67 }

executeUpdate()方法可以处理DDL和DML语句,区别是执行这两种语句是的返回值不同,处理DDL时返回的是0,而处理DML时返回的是影响条数

execute()方法可以处理几乎所有的sql语句,返回值是boolean类型的参数,表明得到的是否为ResultSet.我们可以用Statement的getResultSet()方法得到结果集在进行相应的操作

接下来要介绍的是一个PreparedStatement接口,他的作用和Statement类似但是更简便

 1 package Jdbc_1;
 2 
 3 import java.io.FileInputStream;
 4 import java.sql.*;
 5 import java.util.Properties;
 6 
 7 public class preSta {
 8 
 9     /**
10      * @param args
11      */
12     private  String driver;
13     private  String user;
14     private  String url;
15     private  String pass;
16     public void initProFile(String filename) throws Exception{
17         Properties pp = new Properties();
18         pp.load(new FileInputStream(filename));
19         driver = pp.getProperty("driver");
20         url = pp.getProperty("url");
21         user = pp.getProperty("user");
22         pass = pp.getProperty("pass");
23         Class.forName(driver);
24     }
25     //用statement的方法实现插入500条记录的工作并计入执行时间
26     public void statement() throws Exception{
27         long start = System.currentTimeMillis();
28         try(Connection conn = DriverManager.getConnection(url, user, pass);
29                 Statement st = conn.createStatement()){
30             for(int i=0;i<500;i++){
31                 String sql = "insert into jdbc_eu1 values" + "( null," + "'name" + i +"');";
32                 st.executeUpdate(sql);
33             }
34             //st.execute("delete from jdbc_eu1 where id > 10");
35             System.out.println("----------statement do already------------");
36             System.out.println("time :" + (System.currentTimeMillis()-start));
37         }
38     }
39     //用preparedstatement的方法进行相同的操作,记录时间
40     public void preparedSta() throws Exception{
41         long start = System.currentTimeMillis();
42         try(Connection conn = DriverManager.getConnection(url, user, pass);
43                 PreparedStatement ps = conn.prepareStatement("insert into jdbc_eu1 values(null,?);")){
44             for(int i=0;i<500;i++){
45                 ps.setString(1, "name"+i);//setString(int parameterIndex,String x),1应该是表示(null,?)里的第一个吧
46                 ps.executeUpdate();
47             }
48             System.out.println("----------preparedstatement do already------------");
49             System.out.println("time :" + (System.currentTimeMillis()-start));
50         }
51     }
52     public static void main(String[] args) throws Exception{
53             preSta pst = new preSta();
54             pst.initProFile("./src/mysql.ini");
55             pst.statement();
56             pst.preparedSta();
57             System.out.println("----------程序执行完毕----------");
58     }
59 
60 }

通过用两种方法分别执行500条插入语句,多次试验得出preparedStatement可以提高执行效率而且他是提供占位符操作的,书写起来更简便,避免重复写相同的代码。暂时我就学习到这边看了之后有什么不懂的欢迎提问,大家共同学习进步。

posted @ 2012-11-26 20:27  拙急鸟  阅读(222)  评论(0编辑  收藏  举报