SSH框架:

Struts框架, 基于mvc模式的应用层框架技术!

Hibernate,    基于持久层的框架(数据访问层使用)!

Spring,   创建对象处理对象的依赖关系以及框架整合!

Dao代码,如何编写?

1.操作XML数据

2 使用Jdbc技术

原始的jdbc操作, Connection/Statement/ResultSet

自定义一个持久层框架, 封装了dao的通用方法

DbUtils组件, 轻量级的dao的组件;

Hibernate技术  【hibernate最终执行的也是jdbc代码!】

一、Hibernate框架

  ORM概念 :对象关系映射!

    O,  Object  对象

    R, Realtion 关系  (关系型数据库: MySQL, Oracle…),此外还有对象型数据库,存入,读取出来的都是对象,但该技术目前不成熟,使用的较少。

    M,Mapping  映射

    ORM, 解决什么问题?

   存储:   能否把对象的数据直接保存到数据库?

      获取:  能否直接从数据库拿到一个对象?

             想做到上面2点,必须要有映射!在配置文件中配置如下信息。

        1、对象与表 --实体对象与数据库表映射

          2、属性与字段--属性与字段的映射

        3、类型的对应--属性与映射的字段类型要一致

      Hibernate就实现了上面的功能。

  

  总结: Hibernate与ORM的关系?Hibernate是ORM的实现!

       ORM是一种思想,Hibernate是该思想的一种实现方式。mybatis也是一种实现方式。

Hibernate的难点在配置

Hibernate  HelloWorld案例

搭建一个Hibernate环境,开发步骤:

1. 下载源码

版本:hibernate-distribution-3.6.0.Final

2. 引入jar文件(共9个)

         hibernate3.jar  核心jar包

    lib目录下的required 必须引入的(6个)

lib目录下的jpa下的jar包,这个是事务必须用的jar包 ,hibernate必须要开启事务,所以该jar包必须要引入。

数据库驱动包

3. 写对象以及对象的映射(每个实体对象都要有个映射文件  *.hbm.xml)

         Employee.java            对象

Employee.hbm.xml      对象的映射 (映射文件)

4. src/hibernate.cfg.xml  主配置文件,在主配置文件中要加载每个实体的映射文件。

数据库连接配置

加载所用的映射(*.hbm.xml)

5. App.java  测试

Employee.java

//实体对象对象
public class Employee {
    private int empId;
    private String empName;
    private Date workDate;
    

Employee.hbm.xml  对象的映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.a_hello"> package是实体类所在的包
    <class name="Employee" table="employee">    name是实体对象,table是对应的数据库里的表
        <!-- 主键 ,映射-->
        <id name="empId" column="id">        name是实体属性,column是对应的数据库字段
            <generator class="native"/>
        </id>
        <!-- 非主键,映射 -->
        <property name="empName" column="empName"></property>
        <property name="workDate" column="workDate"></property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml    主配置文件,位于src根目录

可以参考 :hibernate下载文件/project/etc/hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <!-- 通常,一个session-factory节点代表一个数据库 ,如果是要连多个数据库,要使用多个session-factory 节点   -->
    <session-factory>
        <!-- 1. 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!--
            数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql,因为不同的数据库生成的sql语句可能不一样。
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <!-- 2. 其他相关配置 -->
        <!-- 2.1 显示hibernate在运行时候执行的sql语句 ,设置了这个会在命令行窗口中显示出对应的sql语句-->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 2.3 自动建表  -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 3. 加载所有映射-->
        <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>  mapping要放在property节点后面
</session-factory>
</hibernate-configuration>

App.java   测试类

public class App {

    @Test
    public void testHello() throws Exception {
        // 对象
        Employee emp = new Employee();
        emp.setEmpName("班长");
        emp.setWorkDate(new Date());

        // 获取加载配置文件的管理类对象
        Configuration config = new Configuration();
        config.configure();  // 默认加载src/hibenrate.cfg.xml文件
        // 创建session的工厂对象
        SessionFactory sf = config.buildSessionFactory();
        // 创建session (代表一个会话,与数据库连接的会话)
        Session session = sf.openSession();
        // 开启事务
        Transaction tx = session.beginTransaction();
        //保存-数据库
        session.save(emp);//以后会通过优化,只要写这一句代码就可以完成
        // 提交事务
        tx.commit();
        // 关闭
        session.close();
        sf.close();
    }
}

Hibernate  Api

|-- Configuration       配置管理类对象(读取配置文件,并创建sessionFactory的作用)

config.configure();    加载主配置文件的方法(hibernate.cfg.xml),默认加载src/hibernate.cfg.xml

config.configure(“cn/config/hibernate.cfg.xml”);   一般主配置文件要放在src下,如果在其他路径,要加载指定路径下指定名称的主配置文件

config.buildSessionFactory();   创建session的工厂对象

|-- SessionFactory     session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)

  所以sessionFactory只需要一个对象即可以啦,可以定义其为静态私有成员。

private static SessionFactory sf;
    static  {
        /*
        //1. 创建配置管理类对象
        Configuration config = new Configuration();
        // 加载配置文件  (默认加载src/hibernate.cfg.xml)
        config.configure();
        //2. 根据加载的配置管理类对象,创建SessionFactory对象
        sf = config.buildSessionFactory();
        */

        // 创建sf对象
        sf = new Configuration().configure().buildSessionFactory();
    }

sf.openSession();   创建一个sesison对象

sf.getCurrentSession();  创建session或取出session对象

|--Session       session对象维护了一个连接(Connection), 代表了与数据库连接的会话。

它是Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象

session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

|--Transaction  Hibernate的事物对象

更新与保存对象:

session.save(obj);   保存一个对象

session.update(emp);  更新一个对象,更新的时候一般是先查出该对象,再更新。看后面的主键查询等。

session.saveOrUpdate(emp);  保存或者更新的方法:

1. 没有设置emp类的主键,执行保存;  即 会生成insert语句

2. 有设置主键,执行更新操作; 即 会生成update语句

3. 如果设置的主键在数据库中不存在,会报错!因为有主键会执行更新操作,生成update语句,但是数据库中没有该主键值。

    //更新
    @Test
    public void testUpdate() throws Exception {
        // 对象
        Employee emp = new Employee();
        emp.setEmpId(1000000);
        emp.setEmpName("张三3");

        // 创建session
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();

        //-------执行操作-------执行操作一定要放在事物中,hibernate中不使用事务,会报错。
        // 没有设置主键,执行保存;有设置主键,执行更新操作; 如果设置主键不存在报错!
        session.saveOrUpdate(emp);

        tx.commit();
        session.close();
    }

Hibernate提供的各种查询方式:

主键查询:

session.get(Employee.class, 1);    主键查询  查询主键为1的对象。

session.load(Employee.class, 1);   主键查询 (支持懒加载)

get,load方法功能一样,get用的多一些。

HQL查询:(查询的是对象以及对象的属性)

HQL查询与SQL查询区别:

SQL: (结构化查询语句)查询的是表以及字段不区分大小写

HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言

查询的是对象以及对象的属性区分大小写。

Criteria查询:

完全面向对象的查询。

本地SQL查询:(一般不用,除非是用其他的方法实现不了,必须用原生的sql语句来实现的时候,才会使用)

复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!

(缺点: 不能跨数据库平台!)

public class App3 {
    private static SessionFactory sf;
    static  {
        // 创建sf对象
        sf = new Configuration().configure().buildSessionFactory();
    }

    //HQL查询  【适合有数据库基础的】
    @Test
    public void testQuery() throws Exception {
        
//事务环境 Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // 主键查询 get第二个参数必须实现序列化接口,1自动装箱为Integer,Integer继承Number,Number实现了Serializable接口 //Employee emp = (Employee) session.get(Employee.class, 1); // HQL查询 也叫Hibernate查询 Query q = session.createQuery("from Employee where empId=1 or empId=2"); Employee E必须大写,HQL区分大小写,empId是对象属性,不能用数据库字段id List<Employee> list = q.list(); System.out.println(list); tx.commit(); session.close(); } //QBC查询 , query by criteria 完全面向对象的查询 @Test public void testQBC() throws Exception { Session session = sf.openSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Employee.class); // 条件 criteria.add(Restrictions.eq("empId", 1)); // 查询全部 List<Employee> list = criteria.list(); System.out.println(list); tx.commit(); session.close(); } //sQL @Test public void testSQL() throws Exception { Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // 把每一行记录封装为对象数组,再添加到list集合 // SQLQuery sqlQuery = session.createSQLQuery("select * from employee"); // 把每一行记录封装为 指定的对象类型 SQLQuery sqlQuery = session.createSQLQuery("select * from employee").addEntity(Employee.class); List list = sqlQuery.list(); System.out.println(list); tx.commit(); session.close(); } }

共性问题1:

ClassNotFoundException…., 缺少jar文件!

问题2:

如果程序执行成功,hibernate也有生成sql语句,但数据没有结果影响。

问题一般是事务忘记提交…….或者没有开启事务,如果是查询的时候,可以不用提交事务,因为没有对数据库进行修改

遇到问题,一定看错误提示!

Hibernate crud

IEmployeeDao :
public interface IEmployeeDao {
    void save(Employee emp);
    void update(Employee emp);
    Employee findById(Serializable id);
    List<Employee> getAll();
    List<Employee> getAll(String employeeName);
    List<Employee> getAll(int index, int count);//分页查询
    void delete(Serializable id);
}

HibernateUtils   hibernate工具类
 
public class HibernateUtils {

    private static SessionFactory sf;
    static {
        // 加载主配置文件, 并创建Session的工厂
        sf = new Configuration().configure().buildSessionFactory();
    }

    // 创建Session对象
    public static Session getSession(){
        return sf.openSession();
    }
}

EmployeeDaoImpl :
public class EmployeeDaoImpl implements IEmployeeDao{

    @Override
    public Employee findById(Serializable id) {
        Session session = null;
        Transaction tx = null;
        try {
            // 获取Session
            session = HibernateUtils.getSession();
            // 开启事务
            tx = session.beginTransaction();
            // 主键查询
            return (Employee) session.get(Employee.class, id);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }
    }

    @Override
    public List<Employee> getAll() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            // HQL查询
            Query q = session.createQuery("from Employee");
            return q.list();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }
    }

    @Override
    public List<Employee> getAll(String employeeName) {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            Query q =session.createQuery("from Employee where empName=?");
            // 注意:参数索引从0开始
            q.setParameter(0, employeeName);
            // 执行查询
            return q.list();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }
    }

    @Override
    public List<Employee> getAll(int index, int count) {//数据库分页查询,index:起始页,count:查询多少条
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            Query q = session.createQuery("from Employee");
            // 设置分页参数,这里没有用limit,所以这里是可以跨数据库平台的,如果使用limit,就只能用在mysql中
            q.setFirstResult(index);  // 查询的起始行
            q.setMaxResults(count);      // 查询返回的行数

            List<Employee> list = q.list();
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }
    }

    @Override
    public void save(Employee emp) {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            // 执行保存操作
            session.save(emp);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }

    }

    @Override
    public void update(Employee emp) {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            session.update(emp);

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }

    }

    @Override
    public void delete(Serializable id) {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();
            // 先根据id查询对象,再判断删除
            Object obj = session.get(Employee.class, id);
            if (obj != null) {
                session.delete(obj);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            tx.commit();
            session.close();
        }
    }
}

 Hibernate.cfg.xml 主配置

Hibernate.cfg.xml

主配置文件中主要配置:数据库连接信息、其他参数、映射信息!

常用配置查看源码:

hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties

 

数据库连接参数配置

例如:

## MySQL

#hibernate.dialect org.hibernate.dialect.MySQLDialect

#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect

#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect

#hibernate.connection.driver_class com.mysql.jdbc.Driver

#hibernate.connection.url jdbc:mysql:///test

#hibernate.connection.username gavin

#hibernate.connection.password

映射配置

1. 普通字段类型

2. 主键映射

单列主键映射

多列作为主键映射

主键生成策略,查看api:   5.1.2.2.1. Various additional generators

数据库:

一个表能否有多个主键?   不能。

为什么要设置主键?       数据库存储的数据都是有效的,必须保持唯一。

(为什么把id作为主键?)

因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!

联合/复合主键

如果找不到合适的列作为主键,除了用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。

属性映射

Employee.hbm.xml

<!-- 映射文件: 映射一个实体类对象;  描述一个对象最终实现可以直接保存对象数据到数据库中。  -->
<!--
    package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
    auto-import 默认为true, 在写hql的时候自动导入包名
                如果指定为false, 再写hql的时候必须要写上类的全名;
                  如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
 -->
<hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true">
    

<!-- class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点) name 指定要映射的对象的类型 table 指定对象对应的表;如果没有指定表名,默认与对象名称一样 --> <class name="Employee" table="employee"> <!-- 主键 ,映射--> <id name="empId" column="id"> <!-- 主键的生成策略 identity 自增长(mysql,db2) sequence 自增长(序列), oracle中自增长是以序列方法实现 native 自增长【会根据底层数据库自增长的方式选择identity或sequence】 如果是mysql数据库, 采用的自增长方式是identity 如果是oracle数据库, 使用sequence序列的方式实现自增长 increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。) assigned 指定主键生成策略为手动指定主键的值 uuid 指定uuid随机生成的唯一的值 foreign (外键的方式, one-to-one讲) --> <generator class="uuid"/> </id> <!-- 普通字段映射 property name 指定对象的属性名称 column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。 length 指定字符的长度, 默认为255 type 指定映射数据库表的字段的类型,如果不指定会匹配属性的类型 可以用java类型: 必须写全名 java.lang.String 或者用hibernate类型: 直接写类型,都是小写 string
             建议用java类型,因为用hibernate类型,框架还会做转换去匹配实体类的类型。 --> <property name="empName" column="empName" type="java.lang.String" length="20"></property> <property name="workDate" type="java.util.Date"></property> <!-- 如果列名称为数据库关键字,需要用反引号或改列名。 --> <property name="desc" column="`desc`" type="java.lang.String"></property> </class> </hibernate-mapping>

复合主键映射(复合主键即:多个列做为一个主键)

t1,t2作为联合主键。

create table t(

  t1 int,

  t2 int,

  msg varchar(100),

  primary key(t1,t2)

)

// 复合主键类
public class CompositeKeys implements Serializable{
    private String userName;
    private String address;
   // .. get/set
}
public class User {

    // 名字跟地址,不会重复
    private CompositeKeys keys;
    private int age;
}

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true">
    <class name="User">
        <!-- 复合主键映射 -->
        <composite-id name="keys">
            <key-property name="userName" type="string"></key-property>
            <key-property name="address" type="string"></key-property>
        </composite-id>
        <property name="age" type="int"></property>
    </class>
</hibernate-mapping>
public class App2 {

    private static SessionFactory sf;
    static  {
        // 创建sf对象
        sf = new Configuration()
            .configure()
            .addClass(User.class)  //(测试) 会自动加载映射文件:Employee.hbm.xml
            .buildSessionFactory();
    }

    //1. 保存对象
    @Test
    public void testSave() throws Exception {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();

        // 对象
        CompositeKeys keys = new CompositeKeys();
        keys.setAddress("广州棠东");
        keys.setUserName("Jack");
        User user = new User();
        user.setAge(20);
        user.setKeys(keys);

        // 保存
        session.save(user);

        tx.commit();
        session.close();
    }

    @Test
    public void testGet() throws Exception {
        Session session = sf.openSession();
        Transaction tx = session.beginTransaction();

        //构建主键再查询
        CompositeKeys keys = new CompositeKeys();
        keys.setAddress("广州棠东");
        keys.setUserName("Jack");

        // 主键查询
        User user = (User) session.get(User.class, keys);
        // 测试输出
        if (user != null){
            System.out.println(user.getKeys().getUserName());
            System.out.println(user.getKeys().getAddress());
            System.out.println(user.getAge());
        }

        tx.commit();
        session.close();
    }
}

Hibernate框架--配置,映射,主键的更多相关文章

  1. (转)Hibernate框架基础——映射主键属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52740744 本文我们学习映射文件中的主键属性,废话不多说,直接开干. 我们首先在cn.itc ...

  2. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

  3. hibernate框架学习之主键生成策略generator

    1)手工控制 assigned(不限制类型) 2)数据库自动生成 uuid(字符串类型) increment(整型数值类型) identity (整型数值类型) sequence (整型数值类型) n ...

  4. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  5. Hibernate 表映射 主键生成策略与复合主键

    主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据 ...

  6. Hibernate之:各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  7. Hibernate开发之二 映射主键-

    <class name="cn.itcast.e_hbm_id.User" table="user">            <!-- 映射主 ...

  8. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

  9. Hibernate——(3)主键生成方式

    一.Hibernate中常用的主键生成方式有如下几种: 1)identity: 用于自动生成主键方式,除了 Oracle 不支持,其他数据库一般都支持(较常用) 2)sequence: Oracle ...

随机推荐

  1. wf跟webx开源我见

    今天看WF的时候突然想到了WEBX!一个是58同城的优秀框架,一个是阿里巴巴集团的开源结晶,但是差距在哪里!随便在网上一搜webx,看到推广最上方的是一个网站,关于webx的官方认证网站,但是wf也开 ...

  2. Oracle 表空间和用户权限管理【转】

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  3. 使用SQL Server临时表来实现字符串合并处理

    处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 union ALL SELECT 'a',2 union ...

  4. UNICODE与ANSI的区别

    什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.(对于字符来说ANSI以单字节存放英文字符,以双字节存放 ...

  5. Angular DirtyChecking(脏值检查) $watch, $apply, $digest

    Dirty Checking (脏值检查) Digest cycle and $scope Digest cycle and $scope First and foremost, AngularJS ...

  6. 树:BST、AVL、红黑树、B树、B+树

    我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操 ...

  7. overthewire朝花夕拾

    bandit: cat特殊字符文件名 - cat ./- 空格 cat "abc def"  or cat abc\ def 列出隐藏文件:ll du -ab 递归列出文件大小,以 ...

  8. 修改虚拟机内容导致oracle不能启动

    虚拟机内存目前设置为4G,想要改变成2G,数据库启动时导致报targetmomory错误,解决办法如下: 1.查看分配的memory_target和memory_max_target大小 SQL> ...

  9. mac 配置快捷键快速锁屏

    mac下锁屏方式有很多: 快捷键control+shift+power 在其他中打开钥匙串访问,讲屏幕锁定按钮显示在menu bar中 这两种方法存在弊端: 按三个键去锁定屏幕太费劲,况且让使用外接键 ...

  10. zoj 1718 poj 2031 Building a Space Station

    最小生成树,用了Kruskal算法.POJ上C++能过,G++不能过... 算出每两个圆心之间的距离,如果距离小于两半径之和,那么这两个圆心之间的距离直接等于0,否则等于距离-R[i]-R[j]. # ...