JDBC-基础
2016-04-29 16:43
477 查看
一、JDBC的主要接口
获取一个Connetctionl链接
Connection
主要负责数据库的链接,事物处理,创建执行语句的Statement。
Statement、PreparedStatement、CallableStatement
都是执行语句的申明,差异在PreparedStatement可以通过setXXX来设置参数,CallableStatement主要用来调用存储过程,可以从存储过程中得到返回的值getXXX(int parm)。
ResultSet
执行查询结果返回的结果集,可以循环获取数据,最主要的方法是根据位置和根据名字获取值。
二、获取数据实例
package com.elements.myjdbc; import java.io.IOException; import org.junit.Test; import java.sql.DriverManager; import java.sql.Connection; import java.sql.Statement; import java.sql.ResultSet; import java.sql.SQLException; public class TestJDBC01 { @Test public void TestJDBCSelect() throws IOException { long aaa = System.nanoTime(); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //需要的驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //数据库连接地址、用户名、密码 String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=true&serverTimezone=UTC"; //获取数据库的链接 conn = DriverManager.getConnection(url, "mybatis", "mybatis"); //用Connection来创建执行语句的Statement stmt = conn.createStatement(); //执行查询语句,返回数据集 rs = stmt.executeQuery("select * from user"); while (rs.next()) { //根据序号获取数据 System.out.print("userId: " + rs.getInt(1)); System.out.print("\t UserName: " + rs.getString(2)); System.out.println("\tUserEmail: " + rs.getString(3)); } } catch (ClassNotFoundException e) { System.out.println("找不到指定的驱动程序类!"); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close();//关闭数据集 if (stmt != null) stmt.close();//关闭执行语句 if (conn != null) conn.close();//关闭连接 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } long bbb = System.nanoTime(); System.out.print((bbb - aaa)); } }
三、创建表、查询、新增,更新、删除、删除表
Statement stmt = conn.createStatement(); //创建表 stmt.execute("create table student(sid char(10), name char(10), age int)"); //新增数据 stmt.executeUpdate("insert into student values('J001','张三',18)"); stmt.executeUpdate("insert into student values('J002','李四',20)"); stmt.executeUpdate("insert into student values('J003','王五',19)"); //查询数据 ResultSet rs = stmt.executeQuery("select * from student"); while (rs.next()) { System.out.print("学号: " + rs.getString(1)); System.out.print("\t姓名: " + rs.getString(2)); System.out.println("\t年龄: " + rs.getInt(3)); } rs.close(); //更新数据 stmt.executeUpdate("update student set age=age+10"); //删除数据 stmt.executeUpdate("delete from student where sid='J002'"); System.out.println("--------------更新/删除数据后---------------"); rs = stmt.executeQuery("select * from student"); while (rs.next()) { System.out.print("学号: " + rs.getString("sid")); System.out.print("\t姓名: " + rs.getString("name")); System.out.println("\t年龄: " + rs.getInt("age")); } //删除创建的表 stmt.execute("drop table student");
四、PreparedStatement使用
Statement stmt = conn.createStatement(); stmt.execute("create table mytable2(id int, name char(10), age DECIMAL(20,0))"); //sql语句?的地方就是PreparedStatement后面要替换的地方 String sql = "insert into mytable2 values(?,?,?)"; PreparedStatement pst = conn.prepareStatement(sql); for(int i = 101;i<200;i++){ //根据位置设置值 pst.setInt(1,i); pst.setString(2,"Tom" + i); pst.setDouble(3,(100+i)*10); pst.executeUpdate(); } //以下雷同 System.out.println("id:\tname:\tsalary:"); pst = conn.prepareStatement("select * from mytable2 where id = ?"); pst.setInt(1,157); ResultSet rs = pst.executeQuery(); if(rs.next()){ System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3)); } int[] ids = {160,171,182}; for(int i:ids){ pst.setInt(1,i); rs = pst.executeQuery(); if(rs.next()){ System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3)); } } stmt.execute("drop table mytable2");
五、用CallableStatement调用存储过程
过程的创建及测试CREATE PROCEDURE test_procedure_01(in a int ,in b int ,inout c int) BEGIN //业务 INSERT INTO user (`UserName`, `UserEmail`) VALUES ('5', '6'); set c=a+b; END //测试,注意第三个参数是inout SET @p_out=1; CALL test_procedure_01(5, 6,@p_out); SELECT @p_out;
输出结果
- JAVA调用
//test_procedure_01是存储过程,?是需要传递的参数 CallableStatement cst = conn.prepareCall("{call test_procedure_01(?,?,?)}"); cst.setInt(1,1001); cst.setInt(2,2222); int aaaa=0; cst.setInt(3,aaaa); System.out.println(aaaa);//这里没有任何变化,需要注意 cst.execute(); //从CallableStatement 获取返回值,第三个参数是out value aaaa=cst.getInt(3); System.out.println(aaaa);
六、批量数据新增
conn.setAutoCommit(false); //这里最好是一次提交,不要设置自动提交 Statement stmt = conn.createStatement(); stmt.execute("create table mytable2(id int, name char(10), salary DECIMAL(20,0))"); //增加Batch stmt.addBatch("insert into mytable2 values(11,'Tom',2500)"); stmt.addBatch("insert into mytable2 values(12,'John',3400)"); stmt.addBatch("insert into mytable2 values(13,'Billy',3150)"); stmt.addBatch("update mytable2 set salary = salary + 88"); //对于大批量数据的提交 这种方式比较好 stmt.executeBatch(); conn.commit(); ResultSet rs = stmt.executeQuery("select * from mytable2"); while(rs.next()){ System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3)); } stmt.execute("drop table mytable2");
七、事务处理
原来数据表情况rollback 不带参数
conn.setAutoCommit(false); Statement stmt = conn.createStatement(); conn.setSavepoint("Uninsert"); stmt.executeUpdate("INSERT INTO user (UserName, UserEmail) VALUES ('1111', '11111');"); conn.setSavepoint("Insert111"); stmt.executeUpdate("INSERT INTO user (UserName, UserEmail) VALUES ('2222', '2222');"); conn.rollback();
rollback 将我们新增的2条记录全部回滚。数据库表无新增记录
rollback 带参数
conn.setAutoCommit(false); Statement stmt = conn.createStatement(); Savepoint Uninsert =conn.setSavepoint("Uninsert"); stmt.executeUpdate("INSERT INTO user (UserName, UserEmail) VALUES ('1111', '11111');"); Savepoint Insert111=conn.setSavepoint("Insert111"); stmt.executeUpdate("INSERT INTO user (UserName, UserEmail) VALUES ('2222', '2222');"); conn.rollback(Insert111); conn.commit();
在这里我们回滚到了Insert111这个保存好的事务点,这个点我们已经新增了1111记录,2222记录被回滚,查看数据我们可以得到以下结果:
conn.rollback(Uninsert );和不带参数的rollback一样既无记录新增。
八、获取数据库元数据
ResultSet rs = null; DatabaseMetaData dmd = conn.getMetaData(); if (dmd == null) { System.out.println ("No Meta available"); } else { System.out.println ("数据库名称:" + dmd.getDatabaseProductName()); System.out.println ("数据库版本:" + dmd.getDatabaseProductVersion()); System.out.println ("数据库驱动程序:" + dmd.getDriverName()); System.out.println ("驱动程序版本号:" + dmd.getDriverVersion()); System.out.println ("并发访问的用户个数" + dmd.getMaxConnections()); System.out.println ("数据类型列表:" ); rs = dmd.getTypeInfo(); while(rs.next()){ System.out.println("\t" + rs.getString(1)); } rs.close(); } //select * from information_schema.tables mysql所有表 //select * from information_schema.columns 表內所有的名字 Statement stmt = conn.createStatement(); String s = "select * from user"; rs = stmt.executeQuery(s); System.out.println("数据表user结构信息:"); ResultSetMetaData rsm = rs.getMetaData(); int columnCount = rsm.getColumnCount(); System.out.println("列序号\t列名\t数据类型"); for(int i=1;i<=columnCount;i++){ System.out.println(" " + i + " \t" + rsm.getColumnName(i) + "\t" + rsm.getColumnTypeName(i)); }
输出结果
数据库名称:MySQL 数据库版本:5.6.26-log 数据库驱动程序:MySQL Connector Java 驱动程序版本号:mysql-connector-java-6.0.2 ( Revision: c6da0fe501ad43d4ed6483b60ea796dc9fbe2d7b ) 并发访问的用户个数0 数据类型列表: BIT BOOL TINYINT TINYINT UNSIGNED BIGINT BIGINT UNSIGNED LONG VARBINARY MEDIUMBLOB LONGBLOB BLOB VARBINARY TINYBLOB BINARY LONG VARCHAR MEDIUMTEXT LONGTEXT TEXT CHAR ENUM SET DECIMAL NUMERIC INTEGER INTEGER UNSIGNED INT INT UNSIGNED MEDIUMINT MEDIUMINT UNSIGNED SMALLINT SMALLINT UNSIGNED FLOAT DOUBLE DOUBLE PRECISION REAL VARCHAR TINYTEXT DATE YEAR TIME DATETIME TIMESTAMP 数据表user结构信息: 列序号 列名 数据类型 1 userId INT 2 UserName VARCHAR 3 UserEmail VARCHAR 4 createTime VARCHAR 5 updateTime VARCHAR
如果要访问mysql的数据表和表内的字段可以通过下面2个表获取数据,也可以通过上面例子的方式
select * from information_schema.tables mysql所有表
select * from information_schema.columns 表內所有的列名
项目代码下载地址:http://pan.baidu.com/s/1skPpdVZ
相关文章推荐
- Material Design 系列 Transition
- myeclipse从数据库反射生成实体类和映射文件
- 又学一招——获得调用方法的名称
- NOIP201105铺地毯
- C++ 类型转换
- Python操作excel,及图表展示
- sqlserver各备份解释
- js模仿ios select效果
- oozie 执行examples 报80020端口拒绝访问问题解决汇总
- Hibernate注解详解
- [原创]Burp Suite web应用程序渗透测试神器
- 如何写出让hr一看就约你面试的简历?
- 单点登录系统构建之一——基础知识(Kerberous/SAML)
- 一小时包教会 —— webpack 入门指南
- 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
- 鲁大师2015官方版 v5.15.16.1005 电脑版
- web.xml详解
- spring注解详解
- Java内部类的全限定名规律
- iso开发基础——数据持久化