黑马程序员小鲁哥哥白话笔记-JDBC(一)
- 格式:docx
- 大小:128.42 KB
- 文档页数:4
---------------------- android培训、java培训、期待与您交流!----------------------事务(ACID):1、原子性(atomicity):组成事物处理的语句形成了一个逻辑单元,不能只执行其中的一部分;2、一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)3、隔离性(isolcation):一个事务处理对另一个事务处理的影响;4、持续性(durability):事务处理的效果能够被永久保存下来;Connection.setAutoCommit(false);--à打开事务mit( );--à提交事务Connection.rollback( );--à回滚事务保存点(SavePoint)1、当只想撤销事务中的部分操作时可使用SavePoint2、 SavePoint sp=connection.setSavePoint( );3、 Connection.rollback(sp);mit( );JTA:1、跨越多个数据源的事务,使用JTA容器实现事务;2、分成两阶段提交erTransaction tx=(UserTransaction)ctx.lookup(“jndiName”); Tx.begin( );隔离级别:读未提交(Read uncommitted)、读已提交(Read committed)、可重复读(Repeatable read)、可串行化(Serializable)--à脏读、不可重复读、幻读批处理:PreparedStatement,addBatch( );PreparedStatement.executeBatch( );可滚动的结果集:Statement st=connection.createStatement(Result.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet rs=st.executeQuery(sql);rs.beforeFirst( );rs.afterLast( );rs.first( );rs.isFirst( );st( );rs.isLast ( );rs.absolute(9);rs.moveToInsertRow( );可更新的结果集:Conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs.updataString(“col name”,”new value”);rs.updataRow( );DatabaseMetaData(数据库的元数据信息)和ParameterMetaData(参数的元数据信息)1、 DatabaseMetaData meta=connection.getMetaData( );2、通过DatabaseMetaData可以获得数据库相关的信息,如:数据库版本、数据库名、数据库厂商信息、是否支持事务、是否支持某种事务隔离级别、是否支持滚动结果集等ParameterMetaData pmd=preparedStatement.getParameterMetData( );通过ParameterMetaData可以获得参数信息;ResultSetMetaData meta=rs.getMetaData( );通过ResultSetMetaData可以获得结果有几列、各列名、各列别名、各列类型等;可以将ResultSet放入Map(key:列名 value:列值);ORM(object、relation、map):-----à利用反射做的通用模块---à将查询结果封装为对象package cn.itcast.jdbc;publicclass ORMTest {publicstaticvoid main(String[(参考:)] args)throws IllegalArgumentException, SQLException, IllegalAccessException, InvocationTargetException{User user=(User) getObject("select id as Id,name as Name,birthday as Birthday,money as Money from user where id=1",User.class);System.out.println(user);}static Object getObject(String sql,Class clazz)throws SQLException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try{conn=JDBCUtils.getConnection();ps=conn.prepareStatement(sql);rs=ps.executeQuery();ResultSetMetaData rsmd=rs.getMetaData();int count=rsmd.getColumnCount();String[] colNames=new String[count];for(int i=1;i<=count;i++){ colNames[i-1]=rsmd.getColumnLabel(i);}Object obj=null;if(rs.next()){obj=new User();for(int i=0;i<colNames.length;i++){ String colName=colNames[i];String methodName="set"+colName; Method[] ms=obj.getClass().getMethods();for(Method m:ms){if(methodName.equals(m.getName())){m.invoke(obj, rs.getObject(colName));}}}}return obj;}finally{JDBCUtils.free(conn, ps, rs);}}}----------------------android培训、java培训、期待与您交流!----------------------详细请查看:/heima。
JDBC知识点总结JDBC(Java Database Connectivity)是Java语言访问关系型数据库的标准接口。
它提供了一组方法和类,使得Java程序能够和数据库进行连接、查询和更新等操作。
下面是关于JDBC的知识点总结。
1.JDBC的工作机制JDBC通过驱动程序(Driver)将Java程序和数据库连接起来。
驱动程序的主要作用是提供与数据库通信的实现。
JDBC的工作机制可以分为以下几个步骤:- 加载驱动程序:使用Class.forName(方法加载驱动程序类。
- 建立连接:使用DriverManager.getConnection(方法建立与数据库的连接。
- 创建语句对象:使用连接对象的createStatement(方法或prepareStatement(方法创建Statement或PreparedStatement对象。
- 执行SQL语句:使用Statement或PreparedStatement对象的executeQuery(、executeUpdate(等方法执行SQL语句。
- 处理结果:对于查询操作,可以通过ResultSet对象获取结果集中的数据;对于更新操作,可以通过返回的整数值判断操作是否成功。
- 关闭连接:使用Connection对象的close(方法关闭连接。
2.JDBC的核心接口- Connection接口:表示数据库连接对象。
可以通过DriverManager.getConnection(方法获取Connection对象。
- Statement接口:用于执行静态SQL语句,不带参数。
- PreparedStatement接口:用于执行带有参数的SQL语句,可以提高SQL语句的效率和安全性。
- CallableStatement接口:用于执行存储过程。
- ResultSet接口:表示查询结果集。
可以通过Statement或PreparedStatement的executeQuery(方法获取ResultSet对象。
小鲁哥哥白话笔记-JDBC(API详解)前一章里我们让大家对JDBC的api有了一些了解,今天我们就聊一聊如何使用JDBC。
首先我们就聊一聊JDBC的注入问题:SQL注入问题假设有登录案例SQL语句如下:SELECT * FROM 用户表WHERE NAME = 用户输入的用户名AND PASSWORD = 用户输的密码;此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。
但是当用户输入的账号为XXX 密码为:XXX’OR ‘a’=’a时,则真正执行的代码变为:SELECT * FROM 用户表WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’OR ’a’=’a’;此时,上述查询语句时永远可以查询出结果的。
那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。
那么PreparedStatement是一个什么类呢,它起到了什么作用,下面给大家详细的聊一聊它是什么,他有什么作用:使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;PreparedStatement预处理对象代码:PreparedStatementpsmt = conn.prepareStatement(sql)常用方法:1.执行SQL语句:●intexecuteUpdate(); --执行insert update delete语句.●ResultSetexecuteQuery(); --执行select语句.●boolean execute(); --执行select返回true 执行其他的语句返回false.2.设置实际参数●void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。
jdbc的名词解释在现代的软件开发中,Java Database Connectivity(JDBC)是一项十分重要的技术。
JDBC是Java平台上用于访问数据库的一套API,它提供了一种与各种数据库交互的标准方式。
通过JDBC,开发人员可以方便地连接到数据库、执行SQL语句以及处理查询结果。
1. JDBC驱动程序JDBC驱动程序是连接Java程序与数据库之间的桥梁。
它负责与数据库进行通信,并将Java代码转换成数据库可以理解的请求。
不同的数据库供应商会提供相应的JDBC驱动程序,以便与特定数据库进行通信。
开发人员需要根据要访问的数据库类型选择相应的驱动程序。
2. 连接(Connection)JDBC中的Connection是一个与数据库之间的物理连接。
通过Connection对象,可以与数据库建立连接、执行SQL语句、提交或回滚事务等操作。
在使用JDBC之前,开发人员需要先通过DriverManager获取一个Connection对象。
获取Connection时,需要提供数据库的URL、用户名和密码等信息。
3. 语句(Statement)JDBC中的Statement用于执行SQL语句。
通过Statement对象,可以向数据库发送SQL语句的请求,并获取执行结果。
Statement提供了多种方法,用于执行不同类型的SQL语句,如查询(executeQuery)、插入(executeUpdate)等。
在执行SQL语句之前,需要先通过Connection对象创建一个Statement对象。
4. 结果集(ResultSet)ResultSet是JDBC用于获取查询结果的对象。
当执行一个查询语句后,如果有查询结果返回,在执行结果集方法后可以获取到查询结果的数据。
ResultSet提供了诸如getXXX()方法来获取特定字段的值,以及移动游标等操作。
通过ResultSet,可以方便地处理查询结果并将数据展示给用户。
黑马程序员JavaEE就业笔记串讲---JDBC 【JDBC的概述】JDBC:Java DataBase Connectivity Java数据库的连接.* 是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现. 驱动:两个硬件设备之间通信的桥梁.【JDBC的开发步骤】注册驱动:获得连接:获得执行SQL语句对象:释放资源:JDBC的API:【Connection】创建执行SQL的对象:进行事务管理:【Statement】执行SQL语句:执行批处理:【ResultSet】获得结果集中的数据:* getXXX(int idx);* select cname,cid from category;* getXXX(String name);默认情况下:next();* 正常的情况下结果集只能向下的.【自定义连接池】(了解)* SUN公司提供了一个连接池的接口.(javax.sql.DataSource).* 定义一个连接池:实现这个接口.* 使用List集合存放多个连接的对象.【自定义连接池的代码】public class MyDataSource implements DataSource{// 创建一个List集合用于存放多个连接对象.private List<Connection> list = new ArrayList<Connection>();// 在程序开始的时候,初始化几个连接,将连接存放到list中.public MyDataSource() {// 初始化3个连接:for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}@Override// 获得连接的方法:public Connection getConnection() throws SQLException { if(list.size() <= 0){for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}Connection conn = list.remove(0);return conn;}// 归还连接的方法:public void addBack(Connection conn){list.add(conn);}...}【自定义连接池中问题及如何解决】问题?1.如果使用自定义连接池,那么需要额外记住自定义连接池中的API.2.能不能使用面向接口的编程方式.解决:不额外提供API方法,就可以解决上述两个问题!!!能不能还调用Connection的close方法.能不能增强Connection的close方法,原有的销毁变为归还!!!如何增强Connection的close方法:* 增强一个Java类中的某个方法有几种方式???* 一种方式:继承的方式.* 能够控制这个类的构造的时候,才可以使用继承.* 二种方式:装饰者模式方式.* 包装对象和被包装的对象都要实现相同的接口.* 包装的对象中需要获得到被包装对象的引用.***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.* 三种方式:动态代理的方式.* 被增强的对象实现接口就可以.【继承和装饰者的案例】/*** 继承的方式增强一个类中某个方法:*/class Man{public void run(){System.out.println("跑....");}}class SuperMan extends Man{public void run(){// super.run();System.out.println("飞....");}}/*** 使用装饰者的方式完成类的方法的增强*/interface Waiter{public void server();}class Waiteress implements Waiter{@Overridepublic void server() {System.out.println("服务...");}}class WaiteressWrapper implements Waiter{ private Waiter waiter;public WaiteressWrapper(Waiter waiter) { this.waiter = waiter;}@Overridepublic void server() {System.out.println("微笑...");// this.waiter.server();}}【使用装饰者模式增强Connection的close方法】public class MyConnection implements Connection{private Connection conn;private List<Connection> list;public MyConnection(Connection conn,List<Connection> list) { this.conn = conn;this.list = list;}@Overridepublic void close() throws SQLException {list.add(conn);}...}连接池的getConnection方法:@Override// 获得连接的方法:public Connection getConnection() throws SQLException {if(list.size() <= 0){for(int i=1;i<=3;i++){Connection conn = JDBCUtils.getConnection();list.add(conn);}}Connection conn = list.remove(0);MyConnection myConn = new MyConnection(conn, list);return myConn;}【常见的开源的数据库连接池】:DBCP:DBCP(DataBase connection pool),数据库连接池。
小鲁哥哥白话笔记-内部类大家学完Static关键字后,马上又进入了另一项挑战,就是内部类。
What??类里面还能定义类,这不是多此一举吗?很多同学第一次听到这个名词后都有这个反应,且听小鲁哥哥慢慢道来,听完后会让你有一种“原来这就是内部类啊”,没有啥啊。
何为内部类:将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。
这是官方说法,其实就是“大房子里边套了个小单间,房间虽少但是五脏俱全”。
举个栗子:publicclass大房子{//大房子的代码class小房子{//小房子的代码}}内部类有几个分支:成员内部类,局部内部类,匿名内部类。
通过和学生的了解,大家对成员内部类和局部内部类都没有问题,就是遇到匿名内部类就难住了,不知道怎么理解,也没有头绪。
成员内部类和局部内部类就简单举个例子,重点讲一讲匿名内部类。
成员内部类:publicclass InnerDemo {publicstaticvoid main(String[] args) {//Outer o = new Outer();//o.method();Outer.Inner i = new Outer().new Inner();i.function();}}class Outer {privateint num = 10;publicvoid method() {Inner i = new Inner();i.function();}class Inner {publicvoid function() {System.out.println(num);}}}局部内部类:package com.itheima_02;/** 局部内部类* 在方法内,出了方法之后就无法使用***/publicclass InnerDemo3 {publicstaticvoid main(String[] args) {Outer o = new Outer();o.method();}}class Outer {publicvoid method() {int num = 10;class Inner {publicvoid function() {System.out.println("function");}}Inner i = new Inner();i.function();}publicvoid test() {//Inner i = new Inner();//System.out.println(num);}}好了,重点讲一下匿名内部类,这个同学学完了,脑子里第一反应就是,这怎么用??先给大家看一看匿名内部类的例子:new 父类或接口(){//进行方法重写};//已经存在的父类:public abstract class Person{public abstract void eat();}//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量Person p = new Person(){public void eat() {System.out.println(“我吃了”);}};//调用eat方法p.eat();其实很简单,匿名内部类一般应用于接口,为了不再写一个类去实现这个接口,直接在类里去通过new 接口+实体模块的方式去实现这个接口。
JDBC基础知识JDBC(Java Database Connectivity)是Java语言访问数据库的标准API。
它提供了一组用于在Java应用程序和数据库之间进行连接、执行SQL语句和处理结果的类和接口。
以下是一些JDBC的基础知识:1. 数据库驱动程序(Database Driver):JDBC需要数据库供应商提供的数据库驱动程序来连接到具体的数据库。
驱动程序实现了JDBC接口,使得Java应用程序可以与数据库进行通信。
2. 连接数据库:使用JDBC连接数据库需要提供数据库的连接URL、用户名和密码。
通过调用`DriverManager.getConnection()`方法,可以获得与数据库的连接。
3. 执行SQL语句:JDBC提供了`Statement`和`PreparedStatement`两个接口来执行SQL语句。
`Statement`用于执行静态的SQL语句,而`PreparedStatement`用于执行动态的SQL语句,可以通过参数化的方式传递参数。
4. 处理查询结果:执行SQL查询语句后,可以使用`ResultSet`对象来处理查询结果。
`ResultSet`提供了访问查询结果集的方法,可以按行遍历结果、获取特定列的值等。
5. 事务管理:JDBC支持事务处理,可以通过设置连接的自动提交模式或手动控制事务提交和回滚。
使用`Connection`对象的`commit()`和`rollback()`方法可以控制事务的提交和回滚。
6. 资源释放:在使用完数据库连接、语句和结果集等资源后,需要手动关闭它们,以释放资源。
通过调用相应对象的`close()`方法来关闭连接、语句和结果集。
7. 异常处理:JDBC操作可能会出现异常情况,如数据库连接失败、SQL语句错误等。
应该使用异常处理机制(try-catch语句块)来捕获和处理异常,以确保程序的稳定性和可靠性。
这些是JDBC的基础知识,使用JDBC可以实现Java应用程序与数据库的交互。
1JDBC1.1JDBC概念1.1.1数据库驱动:数据库厂商提供的用来操作数据库的jar包1.1.2JDBC由于各大数据库厂商提供的数据库驱动各不相同, 导致了开发人员的学习成本十分的高. SUN公司为了简化数据库的操作, 提供了一套规范, 本质上就是一大堆的接口, 要求各大数据库厂商在提供驱动时都要实现JDBC这套接口, 实现之后, 只要学会JDBC这套接口, 所有的数据库驱动就都会使用了!JDBC由两个包组成, 分别是java.sql和javax.sql, 目前已经被集成到javase规范中!需要注意的是: JDBC中包含的就是一段接口, 真实操作数据库的代码都在具体的数据库驱动中. 也就是说在开发数据库程序时, 除了要导入JDBC相关的包之外, 还需要导入具体的数据库驱动包.1.2六个步骤实现JDBC程序 (!!掌握)//1.注册数据库驱动Class.for Name(“com.mysql.jdbc.Driver”);//2.获取数据库连接Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”, “root”, “root”);//简写形式为:Connection conn = DriverManager.getConnection(“jdbc:mysql:///mydb1”, “root”, “root”);//3.获取传输器Statement stat = conn.createStatement();//4.利用传输器发送sql到数据库执行, 返回执行结果ResultSet rs = stat.executeQuery(“select * from account”);int rows = stat.executeUpdate(“insert into account values(null, ‘y’, 666)”);//5.处理结果略//6.释放资源rs.close();stat.close();conn.close();1.3JDBC的增删改查(略) (!!掌握)1.4PreparedStatement (!!掌握)1.4.1Sql注入攻击//select * from user where username='张三'#'' and password=''//select * from user where username='张三' or '2=2' and password=''由于后台的SQL是拼接而来的, 其中的参数是用户提交的, 如果用户在提交参数时, 参杂了一些SQL关键字或者特殊符号, 就有可能会导致SQL语句语意的改变, 从而造成一些意外的操作!PreparedStatement优点:(1)可以防止sql注入攻击通过PreparedStatement对象发送sql, 是先把sql语句的骨架发送给数据库编译并确定下来, 后面发送的只能是参数的值, 不能影响sql语句的骨架, 即使参数中包含sql关键字或特殊符号, 也只会当成普通的文本来处理!(2)通过方法来设置参数, 省去了拼接SQL语句的麻烦!(3)可以提高程序的效率:通过PreparedStatement对象发送的sql语句(骨架)到数据库编译后会被数据缓存下来, 如果下次执行的sql与缓存中的相匹配, 就不再编译而是直接使用缓存中的语句, 可以减少sql语句编译的次数, 提高程序执行的效率!Statement对象发送的sql语句到数据库之后也会编译, 但是Statement对象是先拼接好再发送sql到数据库, 如果每次参数不同, 整条sql也就不同. 所以每次都需要编译!2批处理 (掌握)2.1批处理概述假设现有一大堆的sql要到数据库执行, 如果一条一条发送, 有多少条就需要发送多少次, 效率低下可以通过批处理提高发送sql语句的效率: 可以将这一大堆的sql添加到一个批中, 一次性将批发送给数据库, 数据库收到后打开批, 依次执行其中sql语句, 这样可以减少sql语句发送的次数, 从而提高程序执行的效率!2.2Statement方式来实现批处理优点:可以在一次批处理中添加结构不同的sql语句缺点:不能防止sql注入攻击没有预编译机制, 效率略低当发送结构相同的sql语句时, sql语句的骨架每次都需要编写。
JDBC第一天2007年6月4日一、JDBC原理概述1,JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的掉用规范。
2,JDBC的实现是由数据库厂商提供,以驱动程序形式提供。
3,JDBC在使用前要先加载驱动。
JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。
4、driver开发必须要实现Driver接口。
JDBC驱动程序的类型目前比较常见的JDBC驱动程序可分为以下四个种类:(1)JDBC-ODBC桥加ODBC驱动程序JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。
注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。
因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
(2)本地API这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。
注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
(3)JDBC网络纯Java驱动程序这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。
这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。
所用的具体协议取决于提供者。
通常,这是最为灵活的JDBC驱动程序。
有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。
为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。
几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
(4)本地协议纯Java驱动程序这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。
小鲁哥哥白话笔记-接口大家前边学习了抽象类和抽象方法,知道了abstract这个关键字的用处,我们在了解和掌握接口之前我们先回顾一下抽象类和抽象方法。
我们从字面意思就能了解到,抽象方法肯定是抽象的,那怎么去理解抽象这个概念,一个方法的最关键的是什么,就是方法(函数)里边的逻辑代码,我们把代码去掉,只保留方法名,这样我们就不知道这个方法具体是做什么的了,这也就是抽象方法的来源。
如果一个类中有抽象方法,那这个类必须为抽象类。
下面举个栗子://如果类中有抽象方法,类也必须为抽象类,在类的前边添加abstract关键字abstractclass Instrument{privateint i; //定义一个变量publicabstractvoid play(int n);//这是一个抽象方法,public String what(){return"Instrument";}publicabstractvoid adjust();//这是一个抽象方法}我们复习了抽象类和抽象接口,下面我们来了解接口。
其实接口我们可以把它理解为更深层次的抽象类,因为抽象类还有具体的实现方法(函数),但是接口中的方法(函数)都是抽象的,没有具体的实现代码块(jdk1.8版本添加了接口可以添加非抽象方法,我就不做延伸了,我们可以把接口中都是抽象函数这个定义适用于jdk1.7及以下版本)。
接口:Interface这个关键字产生了一个完全抽象的类,它根本没有提供任何具体方式,它允许创建者确定方法名,参数列表和返回类型,但是没有任何方法体。
也就是说接口只提供了形式,而为提供任何具体的实现。
那我们如何创建一个接口呢,我们就要用到Interface这个关键字了,我们需要用Interface关键字来代替class关键字。
我们给一个例子://用关键字interface代替class关键字,而且接口中不能有带方法体的方法interface Instrument{void play(int a);//定义一个带参数的方法String adjust();//定义一个带返回值的方法void eat();//一般的方法}大家应该看到了,我的接口里边的方法没有被声明是public还是private,因为只要是接口里边的方法,默认都是public的。
小鲁哥哥白话笔记-JDBC(API详解)
前边我们讲过SQL的一些基本操作,大家都是通过图形化工具对数据本身进行操作,今天我们讲一讲如何通过java代码去操作数据库,java中定义了一种规范,叫做JDBC.
JDBC:JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL 语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
是Java访问数据库的标准规范
JDBC的使用是有标准的步骤的,大家根据固定的模式去写自己的JDBC代码就可以。
JDBC一共6个步骤:
1.注册驱动.
2.获得连接.
3.获得语句执行平台
4.执行sql语句
5.处理结果
6.释放资源.
下边给大家聊一聊JDBC里API的使用:
一、注册驱动:
代码:Class.forName("com.mysql.jdbc.Driver");
JDBC规范定义驱动接口:java.sql.Driver,MySql驱动包提供了实现类:com.mysql.jdbc.Driver
DriverManager工具类,提供注册驱动的方法registerDriver(),方法的参数是java.sql.Driver,所以我们可以通过如下语句进行注册:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
以上代码不推荐使用,存在两方面不足
1.硬编码,后期不易于程序扩展和维护
2.驱动被注册两次。
通常开发我们使用Class.forName() 加载一个使用字符串描述的驱动类。
如果使用Class.forName()将类加载到内存,该类的静态代码将自动执行。
通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册public class Driver extends NonRegisteringDriver implements java.sql.Driver { static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
……
}
二、获得链接
代码:Connection con = DriverManager.getConnection
(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);
获取连接需要方法DriverManager.getConnection(url,username,password),三个参数分别表示,url需要连接数据库的位置(网址)user用户名password 密码url比较复杂,下面是mysql的url:
jdbc:mysql://localhost:3306/mydb
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
第一部分是jdbc,这是固定的;
第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE 名称(mydb)组成。
三、获得语句执行平台
String sql = "某SQL语句";
获取Statement语句执行平台:Statement stmt = con.createStatement();
常用方法:
intexecuteUpdate(String sql); --执行insert update delete语句. ResultSetexecuteQuery(String sql); --执行select语句.
boolean execute(String sql); --执行select返回true 执行其他的语句返回false.
四、处理结果集:
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet 提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:rs.next();//指向第一行
rs.getInt(1);//获取第一行第一列的数据
常用方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
intgetInt(int index) / Object getObject(String name) 获得整形
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型五、释放资源:
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
今天先给大家介绍一下什么是JDBC以及JDBC相关的API的使用,下一次我们详细讲一讲如何使用JDBC。