前言

差不多花费了一个多月的时间来看这本书。原因是只有在晚上睡觉前才能看上半个小时左右。尽管时间略长,但是故事的情节发展还是很清楚的。不得不说,这又是一本让我喜欢的作品。不管从作者的写作手法,或者是故事的发展情节来讲,都能反映出作者高超的写作技巧,仿佛读了好几本小说,从中听到了好多故事一样。约翰·欧文的作品是第一次接触,起初选择这本书阅读的时候是因为村上村树对他作品的评价很高,村上春树说:“读欧文的书会上瘾,他的读者都变成了瘾君子。”我想当你接触这本书开始,慢慢开始阅读的时候,你就会被文字所吸引了。

第一部分

《独居的一年》可以分为三个部分,而书名的由来则是出自第二部分,露丝第一任丈夫去世之后独居一年的时间。这其中,她学会和成长了很多,理解了她母亲的做法,也找到了自己的第二份真爱。
第一部分,讲解了露丝的母亲玛丽恩和比她小十六岁的埃迪的故事。在特德和玛丽恩的两个孩子去世之后,玛丽恩和特德生下了露丝。由于家庭的破碎,玛丽恩和特德生活也没有以前那样的和谐。玛丽恩一边要忍受失去儿子的痛苦,一边还要忍受特德和其他女人勾搭,他们最终分居,轮流照顾露丝。当玛丽恩见到来自己家做做暑假工的埃迪的时候,便想起了自己死去的儿子,最后和埃迪发生了关系。而这一切都是特德知道的,或许可以说是特德安排的。原因在于特德希望以后露丝和他在一起,而不是和她的母亲。但是玛丽恩的心里却知道特德的这样的做法,原因是他不希望露丝和她在一起。在暑假工期间,埃迪见证了露丝的生活,玛丽恩对死去儿子的思恋,特德和其他人的混乱关系。暑假结束后,玛丽恩带着所有他死去儿子的照片离去了。埃迪也回家,第一部分差不多就结束了。在这部分最让我印象深刻的是作者对玛丽恩失去儿子的描写,以及露丝没有父母关心(理解为露丝是死去两个儿子的替代品)的生活。

第二部分

第二部分主要是对露丝生活的描写,从和埃迪的见面到最后见证妓女被杀,她和艾伦结婚。通过露丝的好朋友汉娜进行对比(不管是在书中的对比,还是露丝小说中的对比),对一些露丝因为玛丽恩离去,家庭破碎影响造成的性格进行了细致的描写。还描写了自己父亲和自己最好且唯一的闺蜜发生了关系,自己因为生气和父亲的球友发生关系,最后露丝父亲的死去。自己去红灯区取写作素材而见证妓女被杀的情景。描写了露丝的内心活动,自己内心的担心和自责。个人认为露丝其实不喜欢艾伦的,最后是因为自己遇到的事很多,发生了很多变故,最后选择了和艾伦结婚。直到遇到她的专属警察哈利。

第三部分

第三部分描写自己的丈夫死去,自己在这独居的一年里,她对埃迪告诉她玛丽恩离开的理由是“她不想爱露丝,因为她不能忍受失去第三个孩子的设想。”这一点有了更深的理解。在这独居的一年里,她有了更多的个人体验。37年过去了,期间玛丽恩从未与埃迪联系过。再见时,玛丽恩76岁,埃迪53岁,男未婚女未嫁,埃迪还爱着玛丽恩,两个人再次相拥而眠。这位53岁的作家做到了同时在作品和现实生活中爱一个女人。

故事结尾

正因为露丝对母亲的所做所为理解了,正如这本书写的那样,“当你找到爱的时候,也就找到了自己”。在结尾处,时隔37年,当这对母女重聚时,露丝像四岁时那样自然地喊出了“妈咪”并流下了眼泪,而她的母亲也像那时那样回应她:“别哭啦,亲爱的,不就是埃迪和我嘛。”最终前后呼应,故事完美结束!作者的写作手法更是高超。这本书带给我最大影响的仍然是家庭教育对孩子影响的问题,孩子生活在的家庭、环境,真的会影响孩子的成长、性格。对我印象很深刻的还有《人性的枷锁》里面的菲利普、《人间失格》等作品。其实这种情况是可以理解的,人与人之间总是有差异,这种差异,正是每个人所受周围环境、教育、家庭等不同而造成的。有时这种想法会让自己觉得很孤独,找不到和臭味相同的人,和朋友不能谈真心话,就算谈真心话也有保留。在我现在的认知中,认为爱情就是臭味相同的人在一起。不管咋样,该来的会来,该走的会走,你不必担心远方的路,只需掌握来明天的计划,莫要荒度。

介绍

  C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等

XML文件配置

  配置文件名称:c3p0-config.xml(固定)
  配置文件位置:src下(类路径)
  配置文件内容:命名配置

  c3p0-config.xml示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>

<named-config name="zidingyimingcheng">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/java</property>
<property name="user">root</property>
<property name="password">root</property>
</named-config>


</c3p0-config>

comboPooledDataSource对象读取配置文件

  1. 获取comboPooledDataSource对象
    ComboPooledDataSource combo = new ComboPooledDataSource();   
    或者 ComboPooledDataSource combo = new ComboPooledDataSource(“zidingyimingcheng”);
  2. 获取连接
    Connection conn = combo.getConnection();
  3. 编写SQL
    String sql = “select * from user where id=?”;
  4. 获取到执行sql的对象
    PreparedStatement prep = conn.prepareStatement(sql);
  5. 为sql语句添加参数
    prep.setInt(1, 1);
  6. 执行sql语句
    ResultSet re = prep.executeQuery();

简单代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.rexyan.c3p0;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Test {
@Test
public void JDBC_POOL_C3P0(){
try {
//加载c3p0-config.xml配置文件,实例化可以加名称,不加名称则加载默认配置
ComboPooledDataSource combo = new ComboPooledDataSource("zidingyimingcheng");
//根据配置文件的信息,连接数据库
Connection conn = combo.getConnection();
//书写sql语句
String sql = "select * from user where id=?";
//获取到执行sql的对象
PreparedStatement prep = conn.prepareStatement(sql);
//为sql语句添加参数
prep.setInt(1, 1);
//执行sql语句
ResultSet re = prep.executeQuery();
System.out.println(re.next());

} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

进行封装

工具类

  如果每次操作都需要写代码来建立数据的连接的释放连接的话,那么开发的速度和效率会很低。这时我们应该考虑将数据的连接和释放进行封装。这样就不必每次都编写连接和释放的代码了,只需调用已经编写好的即可。

普通的抽取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ToolsV1 {
/**
* 公共连接数据库
* @return Connection
*/
public static Connection Conn(){
Connection conn = null;
try {
// 1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2,获取Connection连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java", "root", "root");
} catch (Exception e) {
e.printStackTrace();
}
//3,返回获取到的连接
return conn;
}

/**
* 公共释放数据库连接
*/
public static void release(Connection conn, PreparedStatement prep, ResultSet re){
try {
if (re!=null){re.close();}
if (prep!=null){prep.close();}
if (conn!=null){conn.close();}
} catch (Exception e) {
e.printStackTrace();
}
}
}

使用配置文件

使用ResourceBundle

编写配置文件

 在src下新建db.propertie文件,【注意文件后缀要为.propertie的文件】。内容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf8
username=root
password=root

具体实现

 具体实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class ToolsV2 {
/**
* 公共连接数据库
* @return Connection
*/

private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;

//静态代码块加载配置文件
static{
//载入配置文件
ResourceBundle bund = ResourceBundle.getBundle("db");
driver = bund.getString("driver");
url = bund.getString("url");
username = bund.getString("username");
password = bund.getString("password");
}

public static Connection Conn(){
Connection conn = null;

try {
// 注册驱动
Class.forName(driver);
// 获取Connection连接
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
//返回获取到的连接
return conn;
}

/**
* 公共释放数据库连接
*/
public static void release(Connection conn, PreparedStatement prep, ResultSet re){
try {
if (re!=null){re.close();}
if (prep!=null){prep.close();}
if (conn!=null){conn.close();}
} catch (Exception e) {
e.printStackTrace();
}
}
}

使用Properties文件流

编写配置文件

 在src下新建db.propertie文件,【注意文件后缀要为.propertie的文件】。内容如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf8
username=root
password=root

具体实现

 具体实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class ToolsV3 {
/**
* 公共连接数据库
* @return Connection
*/

private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;

//静态代码块加载配置文件
static{
//通过类加载器
try {
//获取当前类的类加载器
ClassLoader classLoader = ToolsV3.class.getClassLoader();
//通过类加载器的方法获取到一个输入流
InputStream is = classLoader.getResourceAsStream("db.properties");
//实例化一个Properties对象
Properties pro = new Properties();
//加载一个输入流
pro.load(is);
//获取相关参数的值
driver = pro.getProperty("driver");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}

public static Connection Conn(){
Connection conn = null;

try {
// 注册驱动
Class.forName(driver);
// 获取Connection连接
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
//返回获取到的连接
return conn;
}

/**
* 公共释放数据库连接
*/
public static void release(Connection conn, PreparedStatement prep, ResultSet re){
try {
if (re!=null){re.close();}
if (prep!=null){prep.close();}
if (conn!=null){conn.close();}
} catch (Exception e) {
e.printStackTrace();
}
}
}

调用

 将其中的ToolsV3根据情况具体对应调用就行。例如,使用普通抽取就使用ToolsV1,使用ResourceBundle就调用ToolsV2

具体实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JDBC_Tools_Test {
@Test
public void JDBC_Test(){
Connection conn = null;
PreparedStatement prep = null;
ResultSet result = null;
try {
//1,调用刚刚写好的工具类,获取连接
conn = ToolsV3.Conn();
//2,编写SQL模版
prep = conn.prepareStatement("select * from user where id=?");
//3,为sql赋值
prep.setInt(1, 1);
//4,执行sql
result = prep.executeQuery();
if (result.next()){
System.out.println(result.getString(1));
}
//5,获取结果集
} catch (SQLException e) {
e.printStackTrace();
}finally{
ToolsV3.release(conn, prep, result);
}


}
}