JDBC

tech2022-09-11  96

今天整理一下JDBC

1.数据的状态 (1)瞬时状态:存放在内存中的数据,程序运行时存在,停止丢失 (2)持久状态:存放在硬盘中的数据,程序运行与否都存在 2.持久化:数据在瞬时状态和持久状态转换的机制 (1)技术 ① jdbc ② IO流 ③ xml (2)框架 ① mybatis ② Hibernate ③ JPA:是一个标准 ④ EJB ⑤ Jfinal 3.jdbc:java的数据库链接,用java语言编写的用于链接各种数据库的API(应用进程编程接口),使用持久化框架的基础 4.数据链接池:就是程序运行时创建n个链接,提供给用户使用,减少频繁创建链接的资源消耗,特别是在web项目中。类似于10086 5.jdbc的层次结构 a.JDBC API 对java程序提供类和接口方便统一操作数据库 b.JDBC Driver Interface:驱动接口 专门对接各种数据库,不需要关注 6.常用类和接口 (1)类 ①SQLException:编译时异常 ②DriverManager:驱动管理,负责根据用户提供的数据库地址,用户名和密码完成数据库的链接 (2)接口 ①Connection:代表是根据数据库的链接(会话) ②Statement:执行SQL语句的对象,而是SQL语句传递给数据库并获取结果(运输队长) ③ResultSet:结果集,存放SQL语句查询的结果,可能没数据,但是一定有列信息 ④PreparedStatement:执行预编译的SQL语句,SQL语句中带有“ ?” ⑤CallableStatement:用于执行存储过程和函数的SQL语句 7.操作数据库的步骤(三个准备和七个步骤) (1)三个准备 ①数据库 1)注意编码格式 utf8 2)创建表(是否需要修改引擎),采用合理的表结构存放数据 ②添加数据库的驱动jar文件到项目中,自己创建一个lib目录进行存放 ③把jar文件添加到类路径中 (2)七个步骤 ①生命数据库链接需要的参数 String driver = “com.mysql.jdbc.Driver”; String url = “jdbc:mysql://localhost:3306/DataBase_Name?userUnicode=true&characterEncoding=utf8”; String user = “root”; String password = “pwd”; ②加载驱动类:通过名称找对应的类,需要处理ClassNotFoundException Class.forName(driver);//反射 ③根据用户提供参数获取数据库的链接,需要处理SQLException异常 Connection conn = DriverManager.getConnection(url,user,password); ④编写SQL语句,根据功能编写SQL语句 CRUD insert、delete、update都属于修改操作,返回影响的行数 select 查询操作返回查询的结果 ⑤创建一个执行SQL语句的对象(把SQL语句发送给数据库DBMS并获取结果) ⑥执行SQL语句并处理结果 如果是insert、delete、update获取影响的行数 如果是select获取的是ResultSet ⑦释放资源

ReadUtil

package com.neu.util; import java.util.ResourceBundle; public final class ReadUtil { //绑定名称为 db 的资源文件 //jdk提供的用于读取 资源文件的工具 //资源文件必须放在src的目录中 private static ResourceBundle rb=ResourceBundle.getBundle("db"); public static String getDriver(){ String str=rb.getString("driver"); return str; } public static String getUrl(){ String str=rb.getString("url"); return str; } public static String getUser(){ String str=rb.getString("user"); return str; } public static String getPassword(){ String str=rb.getString("password"); return str; } public static void main(String[] args) { System.out.println(getUser()); } }

DBUtil

package com.neu.util; import java.sql.*; //静态引入,可以引入类中 被static修饰的内容 import static com.neu.util.ReadUtil.*; /** * 只负责进行数据库的链接和关闭 */ public final class DBUtil { private static final String driver=getDriver(); private static final String url=getUrl(); private static final String user=getUser(); private static final String password=getPassword(); static { try { Class.forName(driver); } catch (ClassNotFoundException e) { //把异常信息抛出 throw new RuntimeException(e); } } private DBUtil(){ } public static Connection getConnection() throws SQLException { Connection conn= DriverManager.getConnection(url,user,password); return conn; } public static void close(ResultSet rst, Statement stmt,Connection conn){ if(rst!=null){ try { rst.close(); } catch (SQLException e) { e.printStackTrace(); } finally { rst=null; } } if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { stmt=null; } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } finally { conn=null; } } } }

BaseDao

package com.neu.dao; import com.neu.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class BaseDao { protected Connection conn; protected PreparedStatement stmt; protected ResultSet rst; protected final void close(){ DBUtil.close(rst,stmt,conn); } protected final void getConnection() throws SQLException { conn=DBUtil.getConnection(); } /** * @param sql * @param args * @return */ protected final int executeUpdate(final String sql,String...args){ int row=0; try { getConnection(); stmt=conn.prepareStatement(sql); if(args!=null){ for(int i=0;i<args.length;i++){ stmt.setString(i+1,args[i]); } } row=stmt.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); }finally{ close(); } return row; } /** * * @param sql * @param args * @return */ protected final List<Map<String,Object>> executeQuery(final String sql,String...args){ List<Map<String,Object>> list=new ArrayList<>(); try { getConnection(); stmt=conn.prepareStatement(sql); if(args!=null){ for(int i=0;i<args.length;i++){ stmt.setString(i+1,args[i]); } } rst=stmt.executeQuery(); ResultSetMetaData data=rst.getMetaData(); int n=data.getColumnCount(); //存放查询的列名,不是真正的列名可能是别名 String[] names=new String[n]; for(int i=0;i<n;i++){ names[i]=data.getColumnLabel(i+1); } while(rst.next()){ Map<String,Object> map=new HashMap<>(); for(int i=0;i<n;i++){ String key=names[i]; Object value=rst.getObject(key); map.put(key,value); } list.add(map); } } catch (SQLException e) { e.printStackTrace(); } finally { close(); } return list; } }

把以上三段代码打包成jar包,以后做项目把jar包导入到项目中,每个DaoImpl继承BaseDao,数据库链接文件在property文件中配置

最新回复(0)