一、JDBC相关概念介绍

  1.1  JDBC介绍

  SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC。这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库。

如下图所示:

二、编写JDBC程序

  2.1  搭建实验环境

    A. 启动mysql数据库,即开启mysql/bin/mysqld.exe。

    B. 创建数据库,并创建所需的表。如下图(在创建数据库和表的时候请对其编码设置为utf-8编码否则后期容易出错):

  2.2  创建一个web工程,并导入数据库驱动包。

  2.3  编写javabean,即PO对象又叫持久化对象,此对象的成员属性与数据库的列一一对应,本例中数据库与userName和passWd两列,则PO对象中也应该有这两个成员属性。

UserPO.java

package po;

public class UserPO {
private String userName;
private String passWd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWd() {
return passWd;
}
public void setPassWd(String passWd) {
this.passWd = passWd;
} }

解析: javabean对象中成员属性应该是private的,且必须要有get()和set()方法。

  2.4  创建DAO包,专门用于操作数据(即与数据库互动,进行增删改差操作),一般有接口类和实现类。

  • UserPOI.java
package dao;

import java.util.List;

import po.UserPO;

public interface UserPOI {
public boolean addUser(UserPO user);
public List<UserPO> gets();
}
  • UserPOImpl.java(可优化本文件代码,在第十八篇中讲解)
package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List; import po.UserPO; public class userPOImpl implements UserPOI { public boolean addUser(UserPO user) {
boolean flag=false;
Connection conn=null;
Statement stat=null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//从驱动中获取数据库的链接
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
//创建条件语句对象,即创建数据库中写入sql语句的对象
stat= conn.createStatement();
//执行sql语句,并得到如果是增删改操作都是用executeUpdate()方法返回执行成功的记录的条数,如果是查操作得到ResultSet返回值
int res=stat.executeUpdate("insert into user values('"+user.getUserName()+"','"+user.getPassWd()+"') ");
if(res!=0){ //如果res不等于0则说明sql语句执行成功。
flag=true;
} } catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && stat.isClosed()){
stat.close();
}
}catch(Exception e){
e.printStackTrace();
}
} return flag;
} public List<UserPO> gets() {
List<UserPO> list=new ArrayList<UserPO>();
Connection conn=null;
Statement stat=null;
ResultSet res=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
stat=conn.createStatement();
res=stat.executeQuery("select * from user");
while(res.next()){ //不能是if
UserPO user=new UserPO();    //注意这里的new UserPO()的位置,不能放在外面new 否则list里只有一个对象
user.setUserName(res.getString("userName"));
user.setPassWd(res.getString("passWd"));
list.add(user); } } catch (Exception e) { e.printStackTrace();
}finally{
try{
if(conn!=null && !conn.isClosed()){
conn.close();
}
if(stat!=null && stat.isClosed()){
stat.close();
}
if(res!=null && res.isClosed()){
res.close();
}
}catch(Exception e){
e.printStackTrace();
} } return list;
} }

  

  2.5  创建测试类进行测试。

  • UserTest.java
package test;

import java.util.List;

import org.junit.Test;

import dao.userPOImpl;
import po.UserPO; public class UserTest {
@Test
public void UserPOTest(){
userPOImpl im=new userPOImpl(); UserPO user=new UserPO();
user.setUserName("张三");
user.setPassWd("123");
im.addUser(user);
} @Test
public void userPOget(){
userPOImpl im=new userPOImpl();
List<UserPO> list=im.gets();
for(int i=0;i<list.size();i++)
System.out.println(list.get(i).getUserName()); }
}

结果:

三、注意

  • URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:

  • 常用数据库URL地址的写法:
  • Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
  • SqlServer写法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
  • MySql写法:jdbc:mysql://localhost:3306/sid
  • Statement类讲解
  Jdbc程序中的Statement对象用于向数据库发送SQL语句, Statement对象常用方法:
  • executeQuery(String sql) :用于向数据发送查询语句。
  • executeUpdate(String sql):用于向数据库发送insert、update或delete语句
  • execute(String sql):用于向数据库发送任意sql语句
  • addBatch(String sql) :把多条sql语句放到一个批处理中。
  • executeBatch():向数据库发送一批sql语句执行。
  • ResultSet类讲解
  Jdbc程序中的ResultSet用于代表Sql语句的执行结果。Resultset封装执行结果时,采用的类似于表格的方式。ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
  ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
  获取任意类型的数据
    getObject(int index)
    getObject(string columnName)
  获取指定类型的数据,例如:
    getString(int index)
    getString(String columnName)
  ResultSet还提供了对结果集进行滚动的方法:
  • next():移动到下一行
  • Previous():移动到前一行
  • absolute(int row):移动到指定行
  • beforeFirst():移动resultSet的最前面。
  • afterLast() :移动到resultSet的最后面。

  

  • 释放资源
  Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象,特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
  为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

(十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用的更多相关文章

  1. JDBC(Java Data Base Connectivity,java数据库连接)

    JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言 ...

  2. J2EE学习从菜鸟变大鸟之五 JDBC(Java Data Base Connectivity)

    JDBC刚开始学习这个的时候看到了,以为是ODBC呢,很是相似啊,总的来说还是基本上一类的东东,但是还有一些细微的区别,下面和大家一起分享学习. JDBC(Java Data Base Connect ...

  3. JDBC (Java DataBase Connectivity)数据库连接池原理解析与实现

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  4. 【Java】-NO.16.EBook.4.Java.1.012-【疯狂Java讲义第3版 李刚】- JDBC

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.012-[疯狂Java讲义第3版 李刚]-  JDBC Style:EBook Series:Java ...

  5. Spring Data:企业级Java的现代数据访问技术(影印版)

    <Spring Data:企业级Java的现代数据访问技术(影印版)>基本信息原书名:Spring Data:Modern Data Access for Enterprise Java作 ...

  6. 自定义的jdbc连接工具类JDBCUtils【java 工具类】

    JDBCUtils 类设计: 1. 创建私有的属性*(连接数据库必要的四个变量):dreiver url user password 2. 将构造函数私有化 3.将注册驱动写入静态代码块 4.外界只能 ...

  7. java jdbc ResultSet结果通过java反射赋值给java对象

    在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...

  8. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  9. java学习笔记41(数据库连接池 C3p0连接池)

    在之前的学习中,我们发现,我们需要频繁的创建连接对象,用完之后还需要在关闭资源,因为这些连接对象都是占资源的,但是又不得不创建,比较繁琐,为了解决这种情况,Java出现了数据库连接池: 数据库连接池的 ...

随机推荐

  1. 大数据之路week07--day04 (Linux 中查看文件内容的关键字处)

    Linux如何对文件内容中的关键字进行查找   如果是用vi打开文件后,在命令行下输入“/关键字” 如果是在没有打开文件的前提就用"cat 文件名 | grep "关键字" ...

  2. JDK源码那些事儿之PriorityBlockingQueue

    今天继续说一说阻塞队列的实现,今天的主角就是优先级阻塞队列PriorityBlockingQueue,从命名上看觉得应该是有序的,毕竟是优先级队列,那么实际上是什么情况,我们一起看下其内部实现,提前说 ...

  3. TCP三次握手,四次回收的每一步的解释

    三次握手 第一次握手:主机A发送位码为syn=1,随机产生seq number=10001的数据包到服务器,主机B由SYN=1知道,A要求建立联机,此时状态为SYN_SENT: 第二次握手:主机B收到 ...

  4. Java并发包--ConcurrentHashMap原理解析

    ConcurrentHashMap实现原理及源码分析   ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参 ...

  5. sqlplus、exp、imp不是内部或外部命令,也不是可运行的程序

    oracle 想exp导出数据库,参考网上的作业,进入CMD命令,黑屏后输入命令出现EXP后出现EXP不能内部或外部命令. 网上找到下列解决方法 摘自:http://blog.csdn.net/suz ...

  6. fiddler修改请求和返回

    一.修改请求 1.先设置请求前断点 2.设置拦截,在左下角的QuickExec命令行中输入bpu www.baidu.com/XXXX 3.选中需要修改的请求,选中Inspectors面板,使用Raw ...

  7. Vue.js 中的 v-cloak 指令

    可以使用 v-cloak 指令设置样式,这些样式会在 Vue 实例编译结束时,从绑定的 HTML 元素上被移除. 当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示 ...

  8. qt 读取xml文件中文问题

    1.保存文件格式为UTF-8 2.文件流打开时设置 QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() < ...

  9. yii2.0 模块的使用

    以高级模板为例 1.复制目录 frontend或backend 为一个新目录pro修改advanced\common\config\bootstrap.php 添加一行,加载刚才的路劲Yii::set ...

  10. gcc/g++ 链接库的编译与链接

    GCC编译步骤 gcc -E t1.c -o t1.i 预处理 gcc -S t1.i -o t1.s 转成汇编语言 gcc -c t1.s -o t1.o 转成机器码 gcc t1.o -o t1. ...