java中级阶段 - 连接数据库(JDBCDao)

Posted 辉常努腻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中级阶段 - 连接数据库(JDBCDao)相关的知识,希望对你有一定的参考价值。

1.JDBC基本使用

导读补充

1.1.JDBC是什么?

java DataBase Connectivity (Java语言连接数据库)

1.2.JDBC的本质是什么?

JDBC是sun公司制定的一套接口(interface)

接口都有调用者和实现者。

面向接口调用、面向接口写实现类,这都属于面向接口编程。

  • 为什么要面向接口编程?
    • 解耦合:降低程序的耦合度,提高程序的扩展力。
    • 多态机制就是非常典型的:面向抽象编程。(不要面向具体编程)
      在这里插入图片描述

1.3.JDBC七步走

package com.Li.JDBCs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @Description: JDBC七步走
 * @auther:Li Ya Hui
 * @Time:2021年5月20日下午3:41:38
 */
public class Test {
	public static void main(String[] args) throws ClassNotFoundException, SQLException{
		//连库四要素
		String driverName =  "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/class2021change?useUnicode=true&characterEncoding=utf-8";
		String userName = "root";
		String Password = "root";
		String sql_query = "select * from student";
		//1.加载驱动
		Class.forName(driverName);
		//2.指定URL/用户名+密码
		Connection conn = DriverManager.getConnection(url, userName, Password);
		//3.获取链接
		if(!conn.isClosed()) 
		{
			System.out.println("连接成功了");
			//4.创建stmt对象
			Statement stmt = conn.createStatement();
			//5.执行sql语句
			ResultSet rs = stmt.executeQuery(sql_query);
			//6.循环结果集对象 
			while (rs.next()) {
System.out.println(rs.getString("sno")+"\\t"+rs.getString("sname")+"\\t"+rs.getInt("sage")+"\\t"+rs.getString("ssex"));
			}
			//7.关闭连接
			rs.close();
			stmt.close();
			conn.close();
		}
	}
}

2.Dao

把jdbc的七步走 以及增删改查操作封装成自己的类

package com.Li.dao;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description:  利用JDBC重构获取一个Dao工具
 * @auther:Li Ya Hui
 * @Time:2021年5月20日下午6:40:12
 */
public class Dao {
	
	//连库四要素
	private String driverName =  "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://localhost:3306/class2021change?useUnicode=true&characterEncoding=utf-8";
	private String userName = "root";
	private String Password = "root";
	
	/**
	 * @return 1.获取链接
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	private  Connection getConnection() throws ClassNotFoundException, SQLException {
		//1.加载驱动
		Class.forName(driverName);
		//2.指定URL/用户名+密码
		Connection conn = DriverManager.getConnection(url, userName, Password);
		return conn;
	}
	
	/**
	 * @desc 2.释放连接
	 * @param conn
	 * @param stmt
	 * @param rs
	 * @throws SQLException
	 */
	private  void releaseConnection(Connection conn, Statement stmt, ResultSet rs) throws SQLException {
		//7.关闭连接
		if (rs!=null) {
			rs.close();
		}
		if (stmt!=null)
		{
			stmt.close();			
		}
		if(conn!=null&!conn.isClosed()) 
		{			
			conn.close();
		}
		System.out.println("releaseConnection");
	}
	
	//ps:我们对数据库的操作,可以最终归纳为四个动作:增删改查
	/**
	 * @desc 3.查询全部
	 * @param sql
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public List<Map< String , Object >> executeQueryForList(String sql) throws ClassNotFoundException, SQLException{
		System.out.println("查询全部sql语句"+sql);
		Connection conn = this.getConnection();
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		List<Map<String ,Object>> list = rsToList(rs);
		this.releaseConnection(conn, stmt, rs);
		return list;
	}

	/**
	 * //5.查询单条记录
	 * @param sql
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public Map<String, Object> executeQueryForMap(String sql) throws ClassNotFoundException, SQLException{
		System.out.println("查询一条信息");
		Connection conn = null ;
		Statement stmt = null;
		ResultSet rs = null;
		List<Map<String, Object>> list;
		try {
			conn = this.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			list = this.rsToList(rs);
			if(!list.isEmpty()) {
				return list.get(0);
			}
		} 
		//释放资源
		finally {
			this.releaseConnection(conn, stmt, rs);
		}
		return null;
	}
	/**
	 * @desc 6.查询一共有多少条
	 * @param sql
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public int executeQueryForCount(String sql) throws SQLException, ClassNotFoundException 
	{
		System.out.println("查询一共有多少条的sql:"+sql);
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			conn = this.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			if(rs.next()) 
			{
				System.out.println("ss");
				return rs.getInt(1);
			}
		}finally {
			releaseConnection(conn, stmt, rs);
		}
		return 0;
	}
	/**
	 * @desc 7.执行添加、删除、修改操作
	 * @param sql
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public int  executeUpdate(String sql) throws ClassNotFoundException, SQLException 
	{
		System.out.println("执行添加、修改、删除、等操作的sql"+sql);
		Connection conn = this.getConnection();
		Statement stmt = conn.createStatement();
		//执行sql语句
		int count = stmt.executeUpdate(sql);
		this.releaseConnection(conn, stmt);
		return 0;
	}
	/**
	 * @desc 关闭连接
	 * @param conn
	 * @param stmt
	 * @throws SQLException 
	 */
	private void releaseConnection(Connection conn, Statement stmt) throws SQLException {
		if (stmt!=null)
		{
			stmt.close();			
		}
		if(conn!=null&!conn.isClosed()) 
		{			
			conn.close();
		}
		System.out.println("releaseConnection");
	}

	/**
	 * 4.将rs结果集转变为List 
	 * @param rs
	 * @return
	 * @throws SQLException
	 */
	private List<Map<String, Object>> rsToList(ResultSet rs) throws SQLException {
		List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
		System.out.println("表中有:"+rs.getMetaData().getColumnCount()+"列");
		while (rs.next()) //控制循环行
		{
			//创建一个map 收集数据
			Map<String, Object> colsMap = new HashMap<String, Object>();
			//根据
			for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
				switch (rs.getMetaData().getColumnType(i)) {
				
				case Types.VARCHAR:
					colsMap.put(rs.getMetaData().getColumnName(i), rs.getString(i));
					break;
					
				case Types.INTEGER:
					colsMap.put(rs.getMetaData().getColumnName(i), rs.getInt(i));
					break;
					
				case Types.BLOB://二进制  图片类型
					InputStream in = rs.getBinaryStream(i);
					colsMap.put(rs.getMetaData().getColumnName(i), in);
					break;
				default:
					colsMap.put(rs.getMetaData().getColumnName(i), rs.getString(i));
					break;
				}
			}
			rows.add(colsMap);
		}
		return rows;
	}
	public static void main(String[] args) throws Exception{
		Dao dao = new Dao();
        //执行查询表
		System.out.println(dao.executeQueryForList("select * from student"));
		//执行单条记录
		System.out.println(dao.executeQueryForMap("select * from student where sno='s001' "));
		//执行查询条数
		System.out.println(dao.executeQueryForCount("select count(*) from student  "));
		//执行修改
		System.out.println(dao.executeUpdate("update student set sname='李亚辉' where sname='张三'"));
	}
}

以上是关于java中级阶段 - 连接数据库(JDBCDao)的主要内容,如果未能解决你的问题,请参考以下文章

CloudX云智能学院丨Alibaba Java 技术图谱第三阶段——Java中级工程师!

在 Hibernate 的 SessionFactory 和 JDBC DAO 之间共享连接的最佳方式是啥?

干货丨 进阶中级Java程序员知识点汇总

JAVA学习路线

JDBC DAO - 有啥好的参考实现吗?

Java程序员的级别定义: 对号入座, 你在哪个阶段心里要有点数