这篇文章主要讲解了如何使用Java中的JDBC,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
成都创新互联公司是一家集网站设计制作、成都网站制作、网站页面设计、网站优化SEO优化为一体的专业网站建设公司,已为成都等多地近百家企业提供网站建设服务。追求良好的浏览体验,以探求精品塑造与理念升华,设计最适合用户的网站页面。 合作只是第一步,服务才是根本,我们始终坚持讲诚信,负责任的原则,为您进行细心、贴心、认真的服务,与众多客户在蓬勃发展的市场环境中,互促共生。什么是JDBC:
- JDBC全称Java Database Connectivity
- JDBC可以通过载入不同的数据库的“驱动程序”而与不同的数据库进行连接。
JDBC的优点:
- 使用的驱动不同,即可连接不同的数据库。
- 使用同一套操作来操作不同的数据库
- 如果每一个数据库java都制订一套连接方式,那么当不同的数据库更新的时候,java也需要更新自己的代码,而使用jdbc,使用同一套代码来操作,使用不同的驱动程序(驱动程序由数据库厂商提供)来连接,这使得可以连接不同的数据库。
JDBC的使用:
导入对应数据库的驱动类:
- 1.在对应的数据库厂商网站获取对应的jar包
- 2.将对应的jar包添加到引用。
- 在eclipse中可以将jar包导入一个文件夹后,右键Build Path -> add to path就可以将jar包添加到当前项目引用的库里面。
加载驱动:
PS:
- 在上面的forName中,执行了注册驱动,注册驱动这个代码被定义在驱动类的静态代码块中。
- 对于一些新手,使用的方法可能是,对于这种情况,那么他可以使用driver或DriverManager.getConnection来获取数据库连接对象;而对于另外一些新手,他们可能会使用,然后再通过DriverManager.getConnection来获取数据库连接对象。但本质上,这是一种浪费,因为静态代码块中已经静态生成了一个驱动对象并使用DriverManager.registerDriver注册了,所以上面两种都是浪费。使用forName后,可以使用DriverManager.getConnection来获取数据库连接对象。
获取连接:
- 在考虑使用forName节省资源后,下面介绍的获取连接的方法使用的是DriverManager.getConnection
- getConnection需要参数
- url:定义了连接的数据库的路径
- jdbc协议:数据库子协议:主机[:端口][/连接的数据库] 【[]代表可选的】
- 例如:jdbc:mysql://localhost:3306/test
- 配置流Properties:定义了连接数据库的方式,一般至少包含user和password
- 不使用配置流时,传入user和password
- 如果使用匿名登录,则只传入url
- url:定义了连接的数据库的路径
执行SQL语句:
JDBC执行SQL语句的方式主要有三种:
1.使用Statement
执行sql语句
2.使用PreparedStatement执行sql语句
3.使用CallableStatement
执行sql语句
上面的Statement、PerPareStatement、Callalestatement都可以使用连接对象来获取。
- 使用
Statement
执行语句Statement
对象的获取可以使用createStatement()
来获取- 获取
Statement
对象后,对于查询类的sql语句使用:executeQuery(sql)
,sql是一个字符串sql语句,返回结果是一个结果集【如果获取结果看下面的结果部分】 - 对于更新类(插入、修改、删除、更新)的语句使用:
executeUpdate(sql)
,sql是一个字符串sql语句,返回结果是一个整数(受影响的行数)
- 使用PreparedStatement执行语句
PreparedStatement
对象的获取可以使用prepareStatement(sql)
来获取,注意的是需要传入一条sql语句- PreparedStatement的功能类似
Statement
,但不同的是PreparedStatement
可以使用占位符,它是由占位符标识需要输入数据的位置,然后再逐一填入数据。当然,PreparedStatement
也可以执行没有占位符的sql语句- 使用占位符后,使用
setString
或setInt
等方法来设置每一位的数据。【有各种对应数据类型的设置方法,比如还有setFloat
】setXXX
方法中,第一个参数是位置,第二个是数据
- 使用占位符后,使用
- 获取
Statement
对象后,对于查询类的sql语句使用:executeQuery()
,返回结果是一个结果集【如果获取结果看下面的结果部分】 - 对于更新类(插入、修改、删除、更新)的语句使用:
executeUpdate()
,返回结果是一个整数(受影响的行数) - 补充:
- 对于有sql缓存池的数据库,
PreparedStatement
的效率要高于Statement
【有兴趣的自查】
- 对于有sql缓存池的数据库,
- 使用
CallableStatement
执行语句CallableStatement
主要用来调用存储过程- 对于输出参数,需要使用registerOutParameter注册,第一个参数是位置,第二个参数是参数类型(使用Types.xxx)
- 注册之后,想要获取输出参数,可以使用
CallableStatement
对象自身的getXXX
方法来获取
定义的存储过程示例:
使用:
获取返回:
- 返回结果是一个结果集,它有一个光标指向结果的每一行,最开始它不指向结果,第一次执行next()后,它指向第一行结果,继续执行next(),他会继续指向下一行。next的返回结果是布尔值,它可以用来判断是否有下一行。
- 对于每一行结果,可以使用getXXX方法(参照下面)来获取某一列的结果,getXXX方法的参数可以为字段名,也可以为索引号(从1开始)
关闭连接:
- 后开启的需要先关闭,Statement、Connection、ResultSet都是需要关闭的
- 注意:关闭之前需要留心检查是否为null
事务
不了解事务是什么的,可以看一下我的另外一篇博文:mysql之事务管理
设置事务管理:
连接对象.setAutoCommit(boolean)【当参数为true时,代表允许自动提交(事务管理是关闭的,每一条命令都会自动提交);当为false时,代表不允许自动提交,命令会在执行commit之后再统一提交(开启事务管理的)】
提交事务:
连接对象.commit()
回滚事务:
连接对象.rollback()
例子:
以银行转账为例,张三转给李四100元,执行事务后,如果运行出错将不会提交数据到数据库:
补充:
- 有些时候,在开发中是不会把两个操作放到一个地方的(在Javaweb中开发中存在service层和dao层。可以这么说,servlet是饭店前台,service层就是包厢里点菜的服务员(客户需要什么菜,他负责告诉后厨),dao层就是真正做菜的后厨(dao层通常是数据库方面的操作)。服务员一次性把需要的菜告诉后厨),这样耦合性较高,通常需要把它们放到单独的地方去(就好比一个大厨做好几样菜会很忙,通常都会分工好),比如加钱是一个函数,减钱是一个函数。把他们分开后,两个函数之间的Connection不同的话,就会无法统一进行事务管理。通常有两个解决方法:1.把同一个Connection对象传给这两个参数。2.利用Threadlocal类,把Connection对象存进去,两个要用的时候再取,取的是同一个对象。【这里可能不容易理解,只是做个提醒,可以不理解。】
数据库连接池
- 连接池的意义就是提前创建连接,避免需要使用时再申请连接造成的重复申请资源造成的浪费。
- 连接池负责在需要的时候分发连接,使用者释放连接时需要放回到连接池中。
连接池可以自定义,当然常用的一般都是选择采用第三方开源的连接池,想了解如何自定义连接池的可以自查,下面给出的是两个常用的连接池的用法。
DBCP:
首先,使用DBCP连接池需要导入包:commons-dbcp.jar和commons-pool.jar【如果需要日志功能,还需要commons-logging-1.2.jar ,这里不讲述】
DBCP根据配置方式,下面给出两种使用方法:
1.手动配置法:
- 创建BasicDataSource对象: BasicDataSource dataSource = new BasicDataSource();
- 配置BasicDataSource对象:(少用)调用对应函数配置,例如dataSource.setDriverClassName("com.mysql.jdbc.Driver");
- 得到连接对象:Connection conn = ds.getConnection();
- 操作数据库。(得到数据库连接对象后,就可以像以前一样去操作数据库了)
2.配置文件配置法:
- 创建BasicDataSourceFactory对象:BasicDataSourceFactory factory = new BasicDataSourceFactory();
- 利用BasicDataSourceFactory对象的createDataSource函数读取配置文件配置DataSource对象:DataSource dataSource = factory.createDataSource(properties);【配置文件能用哪些参数可以参考这个文档:http://commons.apache.org/proper/commons-dbcp/configuration.html】
- 得到连接对象:Connection conn = ds.getConnection();
- 操作数据库。(得到数据库连接对象后,就可以像以前一样去操作数据库了)
当使用完毕后,像往常一样调用close关闭连接即可【这里通过连接池获取的Connection对象已经封装过了,使用close函数相当于放回连接池中】
常用的dbcp.properties的配置信息:
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=#
initialSize=10#大连接数量
maxActive=50#
maxIdle=20#
minIdle=5#
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
C3P0:
首先,使用C3P0连接池需要导入包:c3p0-0.9.1.2.jar【还有扩展包如c3p0-oracle-thin-extras-0.9.1.2.jar,这里不讲】
手动配置法:
- 创建ComboPooledDataSource对象:ComboPooledDataSource dataSource = new ComboPooledDataSource();
- 调用对应函数配置对应属性
配置文件配置法:
- 创建配置文件,c3p0的配置文件名字是固定的,必须是c3p0.properties或c3p0-config.xml,否则识别不了。配置文件的写法看下面【配置文件存储的位置:1.能在classpath中获取到的目录(比如工程的src目录)、2.WEB-INF/classes、3.某些类似功能的路径】
- 创建ComboPooledDataSource对象【如果有配置文件,那么会读取配置文件来配置ComboPooledDataSource对象】
- 获取连接
- 执行sql语句
当你使用完后,Connection对象调用close函数,就会把连接释放会连接池中【这里通过连接池获取的Connection对象已经封装过了,使用close函数相当于放回连接池中】
配置文件c3p0-config.xml的写法:
com.mysql.jdbc.Driver jdbc:mysql://localhost/bank root 123456 com.mysql.jdbc.Driver jdbc:mysql://localhost/student root 123456
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前标题:如何使用Java中的JDBC-创新互联
本文链接:http://scgulin.cn/article/gogoi.html