JDBC学习笔记

来源:互联网 发布:羊毛 知乎 编辑:程序博客网 时间:2024/05/22 15:39

JDBC完成三个基本工作:
1.建立数据库的连接
2.执行sql语句
3.获得sql语句的执行结果

MySQL使用命令:
展示数据库:
show databases;
创建数据库:
create database 数据库名;
删除数据库:
drop database 数据库名
使用数据库:
use 数据库名;
查看数据库有多少个表格:
show tables;
等…

重点:对表的数据实现增删改查
1.insert into
2.delete from
3.update
4.select

DML,DDL,DCL
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言.
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用.
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_security,admin等人员才有权力执行DCL.

JDBC的基本用法
DreiverManager:用于管理JDBC驱动,主要是用来获取Connection对象。(public static synchronized Connection getConnection(String url,String user,String pass)throws SQLException)用来获得url对应数据库的连接

Connection:代表数据库连接对象

Statement createStatement()throws SQLException:返回一个Statement对象。
PreparedStatement prepareStatement(String sql)throws SQLException: 将SQL语句提交到数据库进行预编译。
CallableStatement prepareCall(String sql)throws SQLException:返回CallableStatement对象,该对象用于调用存储过程。

Statement:用于执行SQL语句的工具接口。可以执行DDL和DCL
1. ResultSet executeQuery(String sql)throwsException:
用于执行查询语句,返回查询结果对应的ResultSet对象,只能用于执行查询语句。
2. int executeUpdate(String sql)throws SQLException:
执行DML语句,返回受影响的行数;执行DDL,返回0
3. boolean execute(String sql)throws SQLException:
可以执行任何一条SQL语句。如果执行后第一个结果为ResultSet对象,返回true,如果执行后第一个结果为受影响的行数或没有任何结果,返回false

PreparedStatement:预编译的Statement对象。使用数据库预编译SQL语句,以后每次只改变SQL命令的参数。它比Statement多了如下方法
void SetXXX(int parameterIndex,XXX value) 根据传入参数值类型不同,需要使用不同的方法,传入的值根据索引传给SQL语句中指定位置的参数。
PreparedStatement同样有executeUpdate(),executeQuery()和execute()三个方法,只是无需再接受SQL字符串。

ResultSet:结果集对象。该对象包含访问查询结果的方法。
void close():释放ResultSet对象。
boolean next():将ResultSet记录指针定位到下一行,如果指向一条有效记录,就返回true。
当记录指针移动到指定行,ResultSet通get属性名(intcolumnIndex)或get属性名(String columnLabel)方法来获取当前行,指定列的值。前者根据索引,后者根据列名。

JDBC编程步骤:

  1. 加载数据库驱动 反射的思想
    Class.forname(“com.mysql.jdbc.driver”);
  2. 通过DriverManager获取数据库链接得到Connection对象
    DriverManager.getConnection(String url,String user,String password);
    url:jdbc:mysql://hostname:port/databasename
  3. 通过Connection对象创建Statement对象
    createStatement()创建基本的Statement对象
    prepareStatement(String sql)根据传入的SQL语句创建预编译的Statement对象。
  4. 使用Statement执行SQL语句
    execute():可以执行任何SQL语句
    executeUpdate()主要用于紫恒星DML和DDL语句。执行DML返回受影响的语句,执行DDL语句返回0
    executeQuery():只能执行查询语句,执行后返回代表查询的ResultSet对象。
  5. 操作结果集
    如果执行的是查询语句则执行结果返回一个ResultSet对象。
    next()方法和getXXX( )方法。
    ResultSet实质在逻辑结构类似一个表。
    ResultSet结果集示意

使用PreparedStatement可以防止SQL注入:
利用SQL注入后生成的SQL语句
select * from jdbc_test where jdbc_name=’ ’ or true ’ ’ and jdbc_desc=’ ‘

使用连接池管理连接
根据前面,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭,频繁地打开,关闭连接将造成系统性能低下。
数据库连接池地解决方案是:当应用程序启动后,系统主动建立足够地数据库连接,并将这些连接组成一个连接池。每次应用程序请求连接数据库连接时,无须重新打开连接,而是从连接池中取出已有地连接使用,使用完后不再关闭数据库连接,而是直接将连接直接归还给连接池。通过使用连接池,将大大提高程序的运行效率。
对于共享资源的情况,有一个通用的设计模式:资源池,用于解决资源的频繁请求、释放造成的性能下降。数据库连接池是Connection对象的工厂。

JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口。
DBCP数据源:
需要两个jar文件:commons-dbcp.jar:连接池的实现;commons-pool.jar连接池实现的依赖库。
BasicDataSource ds = new BasicDataSource();
然后设置连接池所需的驱动,URL,数据库的用户名,数据库的密码,连接池的初始连接数,连接池最多活动连接数等。
通过数据源访问数据库连接:
Connection conn = ds.getConnection();
释放数据库连接:
conn.close();

原创粉丝点击