数据库持久化+JDBC数据库连接

打印 上一主题 下一主题

主题 849|帖子 849|积分 2547

数据持久化

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。
瞬时状态

保存在内存的程序数据,程序退出,数据就消失了
持久状态

保存在磁盘上的程序数据,程序退出后依然存在
数据持久化技术

Hibernate、JPA、==JDBC(Java Datebase Connectivity)==等
JDBC框架

Driver 接口

java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
在程序中不需要直接去访问实现了 Driver 接口的类,而是由**驱动程序管理器类(java.sql.DriverManager)**去调用这些Driver实现
连接、操作数据库步骤
  1. Connection conn = null;
  2. Statement st=null;
  3. ResultSet rs = null;
  4. try {
  5. //获得Connection
  6. //创建Statement
  7. //处理查询结果ResultSet
  8. }catch(Exception e){
  9.     e.printStackTrance();
  10. } finally {
  11.     //释放资源ResultSet, Statement,Connection
  12. }
复制代码
一、获取数据库连接对象步骤

1、导入jar包

1、在项目中创建lib文件夹
2、将jar文件放置到lib文件夹
3、集成到项目中,右键build(eclipse)、add as library(idea)
2、注册驱动(Java代码中加载驱动类)

将com.mysql.jdbc包下的Driver类的字节码文件从本地磁盘加载到方法区中
==Oracle的驱动==:oracle.jdbc.driver.OracleDriver
==mySql的驱动==: com.mysql.jdbc.Driver
方式一:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
  1. //将com.mysql.jdbc包下的Driver类的字节码文件从本地磁盘加载到方法区中
  2. Class.forname("com.mysql.jdbc.Driver")
复制代码
方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序
  1. DriverManager.registerDriver(com.mysql.jdbc.Driver);
复制代码
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,原因:
1、该方法,过于依赖jar包的存在
2、该方法,会造成二次注册
3、使用Class.forname可以降低耦合性
3、获取连接对象
  1. //本机IP:localhost 本机端口号:3306
  2. String url = "jdbc:mysql://IP地址:端口号/库名?serverTimezone=Asia/Shanghai&characterEncoding=utf-8";
  3. String user = "用户名";
  4. String passWord = "密码";
  5. Connection conn = DriverManager.getConnection(url,user,passWord);
复制代码
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
几种常用数据库的JDBC URL

对于 Oracle 数据库连接,采用如下形式:
  1. jdbc:oracle:thin:@localhost:1521:库名
复制代码
对于 SQLServer 数据库连接,采用如下形式:
  1. jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=库名
复制代码
对于 MYSQL 数据库连接,采用如下形式:
  1. jdbc:mysql://localhost:3306/库名
复制代码
二、执行sql语句

1、获取Statement对象
  1. Statement statement = conn.createStatement();
复制代码
2、执行sql语句
  1. int result = statement.executeUpdate("sql语句字符串对象")
复制代码
Statement类方法分类


  • int executeUpdate(sql);

    • 针对数据库的增(insert into)、删(delete from)、改(update set)操作
    • 返回值类型:实际影响的行数

  • ResultSet executeQuery(sql);

    • 针对数据库的查询(select from)操作
    • 返回值类型:一个结果集类型

  • boolean execute(sql);

    • 针对数据库的增删改查操作,一般我们不会使用,jdbc的底层代码会使用
    • 如果执行的sql语句是增删改,返回false
    • 如果执行的sql语句是查询,返回true

3、处理执行结果(ResultSet)
  1. //使用Statement类的方法ResultSet executeQuery(String sql);获得结果集类型的对象
  2. ResultSet set = statement.executeQuery(sql);
  3. while(set.next()){
  4.     //形参可以直接写字段名,字段名不区分大小写
  5.     String id = set.getInt("book_id");
  6.     //也可以写字段索引,索引从1开始
  7.     String id = set.getInt(1);   
  8. }
复制代码
4、释放资源
  1. resultSet.close();
  2. statement.close();
  3. connection.close();
复制代码
实现JDBC工具类

将获取连接和关闭资源等公共、重复的代码封装成一个工具类
[code]import java.sql.*;public class JDBCUtil {    private static String driver;    private static String url;    private static String user;    private static String passWord;    //解析配置文件.properties    static {        try {             Properties properties = new Properties();            properties.load(new FileInputStream(".properties文件路径"));            driver = (String) properties.get("driver");            url = (String) properties.get("url");            user = (String) properties.get("user");            passWord = (String) properties.get("passWord");        }catch (Exception e){            e.printStackTrace();        }    }    //获得Connection对象    public static Connection getConnection(){        Connection connection = null;        try{            Class.forName(driver);            connection = DriverManager.getConnection(url,user,passWord);        }catch (Exception e){            e.printStackTrace();        }        return connection;    }    //关闭资源 -- 针对查询    public static void close(ResultSet resultset,Statement statement,Connection connection){        try {            if (resultset != null) {                resultset.close();            }            if (statement != null) {                statement.close();            }            if (connection != null) {                connection.close();            }        }catch (Exception e){            e.printStackTrace();        }    }    //关闭资源 -- 针对增删改    public static void close(Statement statement,Connection connection){        close(null,statement,connection);    }    //针对DML语句--增删改    public static boolean executeUpdate(String sql,List list){        Connection connection = getConnection();        PreparedStatement pre = null;        try {            pre = connection.prepareStatement(sql);            for (int i = 0;i < list.size();i++){                pre.setObject(i + 1,list.get(i));            }            return (pre.executeUpdate() > 0)? true : false;        }catch (Exception e){            e.printStackTrace();        }finally {            close(pre,connection);        }        return false;    }    //针对查DQL语句    public static  List executeQuery(String sql,List list,Class tClass){        Connection connection = getConnection();        PreparedStatement statement = null;        ResultSet resultSet = null;        List li = new ArrayList();        try {            statement = connection.prepareStatement(sql);            for (int i = 0;i < list.size();i++){                statement.setObject(i + 1,list.get(i));            }            resultSet = statement.executeQuery();            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();            //获取列数            int count = resultSetMetaData.getColumnCount();            //遍历所有行            while (resultSet.next()){                T t = tClass.newInstance();                for (int i = 1;i
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表