一、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

  1. package po;
  2.  
  3. public class UserPO {
  4. private String userName;
  5. private String passWd;
  6. public String getUserName() {
  7. return userName;
  8. }
  9. public void setUserName(String userName) {
  10. this.userName = userName;
  11. }
  12. public String getPassWd() {
  13. return passWd;
  14. }
  15. public void setPassWd(String passWd) {
  16. this.passWd = passWd;
  17. }
  18.  
  19. }

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

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

  • UserPOI.java
  1. package dao;
  2.  
  3. import java.util.List;
  4.  
  5. import po.UserPO;
  6.  
  7. public interface UserPOI {
  8. public boolean addUser(UserPO user);
  9. public List<UserPO> gets();
  10. }
  • UserPOImpl.java(可优化本文件代码,在第十八篇中讲解)
  1. package dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.Statement;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. import po.UserPO;
  11.  
  12. public class userPOImpl implements UserPOI {
  13.  
  14. public boolean addUser(UserPO user) {
  15. boolean flag=false;
  16. Connection conn=null;
  17. Statement stat=null;
  18. try {
  19. //加载数据库驱动
  20. Class.forName("com.mysql.jdbc.Driver");
  21. //从驱动中获取数据库的链接
  22. conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
  23. //创建条件语句对象,即创建数据库中写入sql语句的对象
  24. stat= conn.createStatement();
  25. //执行sql语句,并得到如果是增删改操作都是用executeUpdate()方法返回执行成功的记录的条数,如果是查操作得到ResultSet返回值
  26. int res=stat.executeUpdate("insert into user values('"+user.getUserName()+"','"+user.getPassWd()+"') ");
  27. if(res!=0){ //如果res不等于0则说明sql语句执行成功。
  28. flag=true;
  29. }
  30.  
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }finally{
  34. try{
  35. if(conn!=null && !conn.isClosed()){
  36. conn.close();
  37. }
  38. if(stat!=null && stat.isClosed()){
  39. stat.close();
  40. }
  41. }catch(Exception e){
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. return flag;
  47. }
  48.  
  49. public List<UserPO> gets() {
  50. List<UserPO> list=new ArrayList<UserPO>();
  51. Connection conn=null;
  52. Statement stat=null;
  53. ResultSet res=null;
  54. try {
  55. Class.forName("com.mysql.jdbc.Driver");
  56. conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8", "root", "");
  57. stat=conn.createStatement();
  58. res=stat.executeQuery("select * from user");
  59. while(res.next()){ //不能是if
  60. UserPO user=new UserPO();    //注意这里的new UserPO()的位置,不能放在外面new 否则list里只有一个对象
  61. user.setUserName(res.getString("userName"));
  62. user.setPassWd(res.getString("passWd"));
  63. list.add(user);
  64.  
  65. }
  66.  
  67. } catch (Exception e) {
  68.  
  69. e.printStackTrace();
  70. }finally{
  71. try{
  72. if(conn!=null && !conn.isClosed()){
  73. conn.close();
  74. }
  75. if(stat!=null && stat.isClosed()){
  76. stat.close();
  77. }
  78. if(res!=null && res.isClosed()){
  79. res.close();
  80. }
  81. }catch(Exception e){
  82. e.printStackTrace();
  83. }
  84.  
  85. }
  86.  
  87. return list;
  88. }
  89.  
  90. }

  

  2.5  创建测试类进行测试。

  • UserTest.java
  1. package test;
  2.  
  3. import java.util.List;
  4.  
  5. import org.junit.Test;
  6.  
  7. import dao.userPOImpl;
  8. import po.UserPO;
  9.  
  10. public class UserTest {
  11. @Test
  12. public void UserPOTest(){
  13. userPOImpl im=new userPOImpl();
  14.  
  15. UserPO user=new UserPO();
  16. user.setUserName("张三");
  17. user.setPassWd("123");
  18. im.addUser(user);
  19. }
  20.  
  21. @Test
  22. public void userPOget(){
  23. userPOImpl im=new userPOImpl();
  24. List<UserPO> list=im.gets();
  25. for(int i=0;i<list.size();i++)
  26. System.out.println(list.get(i).getUserName());
  27.  
  28. }
  29. }

结果:

三、注意

  • 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. Java类与类之间的6种关系及uml表示

    一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议 ...

  2. 《TheOne团队》团队作业三:团队项目原型设计与开发

    项目 内容 作业所属课程 http://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10761596.h ...

  3. GET和POST的区别【转载】

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  4. 遇见zTree和chrome的俩坑

    今天后台系统发现一bug,就是前几天用zTree做的树形结构,今下午突然不好使了,然后就查问题.我自己电脑装的是chrome浏览器,后台debug一看传的json数据,没毛病,想当然的断定不是数据的问 ...

  5. 洛谷P2221 高速公路【线段树】

    题目:https://www.luogu.org/problemnew/show/P2221 题意:有n个节点排成一条链,相邻节点之间有一条路. C u v val表示从u到v的路径上的每条边权值都加 ...

  6. PHP读取文件内容的方法

    下面我们就为大家详细介绍PHP读取文件内容的两种方法. 第一种方法:fread函数 <?php $file=fopen('1.txt','rb+'); echo fread($file,file ...

  7. 学到了林海峰,武沛齐讲的Day17-5 内置函数

    zip print(list(zip(('a','n','c','d'),(1,2,3))))  =====[('a', 1), ('n', 2), ('c', 3)]   一一对应====元组变列表 ...

  8. P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  9. OpenCV:Python下OpenCV安装和入门最强详细攻略

    一.关于OpenCV简介       OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效— ...

  10. manjaro 滚动更新后无法开机,Failed to start load kernel modules,nvidia驱动导致

    今天滚动后无法开机,启动时显示Faild to start load kernel modules,卡在后面无法进入登录界面 systemctl status systemd-modules-load ...