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可以提高执行效率而且他是提供占位符操作的,书写起来更简便,避免重复写相同的代码。暂时我就学习到这边看了之后有什么不懂的欢迎提问,大家共同学习进步。