JDBC(Java Data Base Connectivity:java数据库连接):它定义了一组标准的操作数据库的接口,既然是接口,那它就是一种规范,是Java操作数据库的技术规范。

Java数据库编程有两步常用操作

1.加载(或注册)JDBC驱动程序
Class.forName(“com.mysql.jdbc.Driver”); 推荐这种方式,不会对具体的驱动类产生依赖。
DriverManager.registerDriver(com.mysql.jdbc.Driver); 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

2.建立数据库Connection
Connection conn = DriverManager.getConnection(url, user, password);DriverManager是一个驱动管理器,内部有一个驱动注册表(Map结构),可以向其注册多个JDBC驱动。

举例说明1:

/*** @author lhy* @description 数据库工具类*/
public class DBUtil {// 创建连接public static Connection createConn() {Connection conn = null;try {// 加载驱动程序Class.forName("com.mysql.jdbc.Driver");// 获取连接(这里用户名为root,密码为空)conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}// 创建回话,获取预处理语句(可以防止sql语句注入)public static PreparedStatement prepare(Connection conn, String sql) {PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);} catch (SQLException e) {e.printStackTrace();}return ps;}// 关闭连接public static void close(Connection conn) {if (conn != null) {try {conn.close();conn = null;} catch (SQLException e) {e.printStackTrace();}}}// 关闭回话public static void close(Statement st) {if (st != null) {try {st.close();st = null;} catch (SQLException e) {e.printStackTrace();}}}// 关闭查询结果集public static void close(ResultSet rs) {if (rs != null) {try {rs.close();rs = null;} catch (SQLException e) {e.printStackTrace();}}}
}

下面用户表为例,调用Statement对象的executeQuery()方法或executeUpdate()方法,让DBMS 执行具体的SQL语句,以便对数据执行查询、增、删、改等操作;
我们先建好一张用户表(user,数据库为test)

创建实体类(User):

public class User {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", password=" + password + ", username="+ username + "]";}}
/*** @author lhy* @description 对用户的CRUD相关操作*/
public class UserDao {// 添加用户public void add(User u) {Connection conn = DBUtil.createConn();String sql = "insert into user values(null,?,?)";PreparedStatement ps = DBUtil.prepare(conn, sql);try {ps.setString(1, u.getUsername());ps.setString(2, u.getPassword());ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}DBUtil.close(ps);DBUtil.close(conn);}// 根据Id删除用户public void deleteById(int id) {Connection conn = DBUtil.createConn();String sql = "delete from user where id=?";PreparedStatement ps = DBUtil.prepare(conn, sql);try {ps.setInt(1, id);ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}DBUtil.close(ps);DBUtil.close(conn);}// 删除用户public void delete(User u) {deleteById(u.getId());}// 更新用户public void update(User u) {Connection conn = DBUtil.createConn();String sql = "update user set username=?,password=? where id=?";PreparedStatement ps = DBUtil.prepare(conn, sql);try {ps.setString(1, u.getUsername());ps.setString(2, u.getPassword());ps.setInt(3, u.getId());ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}DBUtil.close(ps);DBUtil.close(conn);}// 根据查询用户public User loadById(int id) {Connection conn = DBUtil.createConn();String sql = "select * from user where id=?";PreparedStatement ps = DBUtil.prepare(conn, sql);User user = null;ResultSet rs = null;try {ps.setInt(1, id);rs = ps.executeQuery();if (rs.next()) {user = new User();user.setId(rs.getInt("Id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));}} catch (SQLException e) {e.printStackTrace();}DBUtil.close(rs);DBUtil.close(ps);DBUtil.close(conn);return user;}// 查询所有用户信息public List<User> listUser() {Connection conn = DBUtil.createConn();String sql = "select * from user";PreparedStatement ps = DBUtil.prepare(conn, sql);List<User> list = new ArrayList<User>();ResultSet rs = null;try {rs = ps.executeQuery();while (rs.next()) {User user = new User();user.setId(rs.getInt("Id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));list.add(user);}} catch (SQLException e) {e.printStackTrace();}DBUtil.close(rs);DBUtil.close(ps);DBUtil.close(conn);return list;}
}

客户端(测试类):

public class TestUser {public static void main(String[] args) {User user = new User();user.setUsername("张三");user.setPassword("123");UserDao userDao = new UserDao();// userDao.add(user);//添加用户// userDao.deleteById(1);// 删除Id为1的用户// userDao.update(new User(2, "李四", "1234546"));// 更新Id为2的用户信息// System.out.println(userDao.loadById(2)); // 查询Id为2的用户信息// 列出所有的用户List<User> list = userDao.listUser();for (User u : list) {System.out.println(u);}}
}

Java的数据库编程比较简单,这里就不再赘述。
结束语
Javase基础部分就到这了,之后会更新 Java的反射、注解、代理、设计模式、jsp、Struts、Hibernate、Spring等内容。相信学完了Javase基础之后,对后面的学习会更加轻松。

Java学习系列(十九)Java面向对象之数据库编程相关推荐

  1. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  2. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  3. Java学习系列(十二)Java面向对象之序列化机制及版本

    序列化:内存中的Java对象<-->二进制流 目的:a)有时候需要把对象存储到外部存储器中持久化保存,b)还有时候,需要把对象通过网络传输. 可序列化的对象,Java要求可序列化的类实现下 ...

  4. Java学习系列(十五)Java面向对象之细谈线程、线程通信(下)

    竞争资源(共享资源):如果有多条线程需要并发访问.并修改某个对象,该对象就是"竞争资源".为了避免多个线程"自由竞争"修改共享资源所导致的不安全问题. 线程同步 ...

  5. Java学习系列(十四)Java面向对象之细谈线程、线程通信(上)

    线程与进程的关系: 进程 --运行中的程序.进程有如下特征: 1).独立性.拥有自己的资源,拥有自己独立的内存区. 通常来说,一个进程的内存空间,是不允许其他进程访问的. 但像Windows,如A进程 ...

  6. Java学习系列(十)Java面向对象之I/O流(上)

    IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...

  7. 【Java学习记录】九 Java中的“==”和equal

    "==" "=="代表比较双方是否相同.如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象.相同为true,不相同为false:基本数据类型 ...

  8. Java 基础系列(十六) --- Java中模板引擎的使用

    模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3.1 什么是模板引擎? 3.2 Thymeleaf 语法 3.3 模板引擎的使用 4 总结 1 关于动态页面的渲染   渲染就是 ...

  9. 【Python学习系列十九】基于scikit-learn库进行特征选择

    场景:特征选择在模型训练前是非常有意义的,实际上就是先期对特征相关性进行分析. 参考:http://blog.csdn.net/fjssharpsword/article/details/735503 ...

最新文章

  1. 全部编程皆为Web编程
  2. sqlite库 —— 为什么要使用 SQLite 数据库?
  3. 从C语言的角度重构数据结构系列(十二)-C语言判断语法详解(ifswitch)
  4. python基础高频_面试题(一)
  5. VS code 使用 Remote-SSH 进行python远程开发
  6. 搞定WordPress的日志自动截断
  7. 【英语学习】【Level 07】U07 Stories of my Life L2 I actually did it!
  8. android滑动基础篇 TouchView
  9. RabbitMQ入门-Topic模式
  10. Linux下java获取屏幕分辨率,关于Android如何获取屏幕分辨率的例子
  11. LCL三相pwm整流器(逆变器)
  12. scp 及 ssh 命令出错解决
  13. MySQL 5.6 免安装版(绿色版or解压版)修改编码
  14. 中国高端IC封装市场调查分析与投资趋势研究报告2022-2028年
  15. 百度地图获取河流_开车旅行少不了地图导航,高德地图和百度地图,你觉得哪个好用?...
  16. msp430中如何连续对位进行取反_如何选择护膝的尺码,手把手教你
  17. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)
  18. 【量化金融】收益率、对数收益率、年华收益、波动率、夏普比率、索提诺比率、阿尔法和贝塔、最大回撤
  19. OpenGL---GLUT教程(十) GLUT菜单
  20. 实验A---- ADFA的可判定性

热门文章

  1. Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)
  2. html中span不显示背景
  3. [转]简析 IOS 程序图标的设计
  4. Webdriver for python 入门示例2(浏览器句柄操作)
  5. Shane 版详细设计书文档模板
  6. 六步搞定RHEL5下的mysql镜像数据库配置
  7. C#面向对象名词比较(三)
  8. SEO技巧--代码优化
  9. Which path should be used jdk or jre for JAVA_HOME environment variable?
  10. Git 二分调试法,火速定位疑难Bug!