简谈Java中的数据交互

简谈Java中的数据

对于程序而言,数据与算法是最关键的两个部分,这两个部分支撑着整个程序的运行。在这里,我们简单聊一聊基于Java和数据打交道的那些事

保存对象的手段 – 序列化

Java序列化简介

首先抛出一个简单的定义:Java序列化是将Java对象保存为二进制字节码的过程,Java反序列化是把二进制码重新转换成Java对象的过程。

通过定义,我们不难理解,通过序列化与反序列化,我们可以将当前的对象保存,在需要的时候,可以恢复该对象

那么,通常在什么时候需要这么做呢?

第一种情况,当我们需要持久化一个Java对象的时候,就需要序列化对象,然后将其保存
第二种情况,需要把Java对象通过网络进行传输的时候。因为数据只能够以二进制的形式在网络中传输,因此需要将对象序列化成二进制数据,并在接收端将数据反序列化为原来的对象

Java序列化的实现

什么样的对象可以序列化?

    1. 该类实现java.io.Serializable接口
    2. 该类所有属性必须时可序列化的,如果其中的某一属性不是可序列化的,应注明其实短暂的(使用transient关键字)

关于Serializable接口

Serialzable接口内未定义任何内容,本身只起一个标注的作用,注明可序列化。

序列化

    /**
     * Person类对象user序列化实现
     * @param person  User类的对象
     * @param outPath   序列化后输出路径
     */
    public static void doSerial(Person person, String outPath){
        try {
            FileOutputStream out = new FileOutputStream(outPath);
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(person);
            oos.flush();
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

反序列化

    /**
     * 反序列化Person类获取person对象
     * @param inPath 序列化文件路径
     * @return user
     */
    public static Person deSerial(String inPath){
        Person person = null;
        try {
            FileInputStream in = new FileInputStream(inPath);
            ObjectInputStream ois = new ObjectInputStream(in);
            person = (Person)ois.readObject();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return person;
    }

关于ObjectOutputStream 与 ObjectInputStream

oos与ois是FileOutputStream与FileInputStream的装饰器,增加了对于目标对象序列化的实现并且将序列化的结果输出,达到持久化的目的

小结

Java序列化可以实现对象的持久化,在Java跨平台的特性下,具有一定的灵活性。但是,由于其序列化方式由Java本身实现,当我们需要在网络环境下与其他语言产生的服务进行交互时,显然是行不通的,这时,我们需要一些统一的规范来完成新的要求。

可扩展标记语言 – XML

XML 简介
  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

详情参考W3school

<?xml version="1.0" encoding="UTF-8"?>
<person id="161630321">
    <name>ToMax</name>
    <sex>M</sex>
    <age>21</age>
    <hobbies sum="3">
        <item index="1">CS</item>
        <item index="2">Basketball</item>
        <item index="3">Guitar</item>
    </hobbies>
</person>
XML解析方法和工具

XML DOM

    XML Document Object Model : XML文档对象模型
    定义了访问和处理XML文档的标准方法
    用于 XML 的标准对象模型
    用于 XML 的标准编程接口
    中立于平台和语言
    W3C 的标准

详情参考W3school

XPath

    XPath 使用路径表达式在 XML 文档中进行导航
    XPath 包含一个标准函数库
    XPath 是 XSLT 中的主要元素
    XPath 是一个 W3C 标准

详情参考W3school

Java对于XML的支持

Java完全支持对于XML的解析,并提供了很多解决方案,其中包括:DOM解析、SAX解析、JDOM解析、DOM4J解析,这里,我们仅讨论DOM4J这个解析方案

DOM4J是一个开源的XML解析库,用于XML,XPath,XSTL, 完全支持DOM、SAX、JAXP

  • dom4j的依赖

下面看一些例程

    /**
     * 读取xml,返回document
     * @param fileName
     * @return
     * @throws MalformedURLException
     * @throws DocumentException
     */
    public static Document read(String fileName) throws MalformedURLException, DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(fileName));
        return document;
    }
    /**
     * 获取根节点
     * @param doc
     * @return
     */
    public static Element getRootElement(Document doc){
        return doc.getRootElement();
    }
    /**
     * 通过节点参数索引节点
     * @param root
     * @param attrName
     * @param attrValue
     * @return
     */
    public static Node findNodeByAttr(Element root, String attrName, String attrValue){
        return root.selectSingleNode("//*[@"+attrName+"='"+attrValue+"']");
    }
    /**
     * 通过标签名获取节点
     * @param root
     * @param tagName
     * @return
     */
    public static List<Node> findNodeByName(Element root, String tagName){
        return root.selectNodes("//"+tagName);
    }
    /**
     * 输出document,即更新xml文件
     * @param document
     * @param filePath
     * @throws IOException
     */
    public static void writeDocument(Document document,String filePath) throws IOException {
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer = new XMLWriter(new FileWriter(filePath),format);
        writer.write(document);
        writer.close();
    }

详情可参考文章

JS 对象标记 – JSON

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言 *
  • JSON 具有自我描述性,更易理解
  • JSON 是存储和交换文本信息的语法。类似 XML。
  • JSON 比 XML 更小、更快,更易解析。
    {
        id : "161630321",
        name : "ToMax",
        age : 21,
        sex : 'M',
        hobbies : [
            "CS","Basketball","Guitar"
        ]
    }

详情参考W3school

java对于JSON的支持
  • 依赖

下面看一些例程

    /**
     * person对象转json
     * @param person
     * @return
     */
    public static JSONObject person2JSON(Person person){
        JSONObject json = new JSONObject();
        json.put("id",person.getId());
        json.put("name",person.getName());
        json.put("age",person.getAge());
        json.put("sex",person.getSex());
        JSONArray jArray = new JSONArray();
        for (String in : person.getHobbies()){
            jArray.add(in);
        }
        json.put("hobbies",jArray);
        return json;
    }
    /**
     * json 转 person 对象
     * @param json
     * @return
     */
    public static Person parsePersonJson(JSONObject json){
        List<String> hobbies = new ArrayList<>();
        JSONArray array = json.getJSONArray("hobbies");
        for (int i=0; i<array.size(); i++){
            hobbies.add(array.getString(i));
        }
        return new Person(json.getString("id"),
                          json.getString("name"),
                          json.getInt("age"),
                          json.getString("sex").charAt(0),
                          hobbies);
    }

Database – 关系型数据库

这里,我们主要谈SQL以及其一个流行的关系型数据库管理系统–MySQL

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • Mysql是开源的,所以你不需要支付额外的费用。
  • Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL使用标准的SQL数据语言形式。
  • Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

详情参考菜鸟教程

Java对于SQL的支持 – JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

详情参考易百教程

  • 依赖

下面看一些例程

    private static String URL = "jdbc:mysql://localhost:3306/train";
    private static String USER = "root";
    private static String PASSWORD = "";

    /**
     * 测试
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static void test() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM USER");
        while (rs.next()){
            System.out.println(rs.getString("username"));
        }
    }

非关系型数据库 – NOSQL

NoSQL(not only sql),指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

详情参考菜鸟教程

这里,我们仅了解key-value数据库,其中非常典型的代表为 redis

Redis

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

详情参考菜鸟教程

java对于redis的支持

Jedis – redis的java客户端

  • 依赖

下面看一些例程

    /**
     * 插入数据
     * @param value
     * @param key
     */
    public static void setData(String key, String value){
        Jedis jedis = new Jedis("localhost");
        jedis.set(key,value);
    }

    /**
     * 获取数据
     * @param value
     * @param key
     * @param sec
     */
    public static void setData(String key, String value, int sec){
        Jedis jedis = new Jedis("localhost");
        jedis.set(key,value);
        jedis.expire(key,sec);
    }

    /**
     * 获取数据
     * @param key
     * @return
     */
    public static String getData(String key){
        Jedis jedis = new Jedis("localhost");
        return jedis.get(key);
    }

相关博客
使用Jedis操作redis 缓存
Redis客户端:Jedis

总结

持久化数据的方式有很多种,灵活的选择与数据交互的方式,可以极大地提高我们对于数据地利用率,降低数据的操作难度。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值