这篇还是在回顾知识。主要是关于java连接Sqlserver2012数据库的一些方式记录,以便以后查询。
十一之内复习完这些知识就可以新学Hibernate啦(*^▽^*)
1.普通方式
注意,在连接数据库之前要导入JDBC驱动。因为我用的是sqlserver,所以我导入了sqljdbc4.jar
import java.sql.*;importjava.util.ResourceBundle;//注意:dbinfo.properties要和该加载文件放到一个目录下,不用写全称,只需要写dbinfo即可
public classDBUtils {private staticString driverClass;private staticString url;static{//此对象是用来加载properties文件数据的
ResourceBundle rb = ResourceBundle.getBundle("dbinfo");
driverClass= rb.getString("driverClass");
url= rb.getString("url");try{
Class.forName(driverClass);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
}public static Connection getConnection() throwsException {returnDriverManager.getConnection(url);
}public static voidcloseAll(ResultSet resultSe, Statement statement, Connection connection){if (resultSe != null){try{
resultSe.close();
}catch(SQLException e) {
e.printStackTrace();
}
}//resultSe = null;
if (statement != null){try{
statement.close();
}catch(SQLException e) {
e.printStackTrace();
}
}//statement = null;
if (connection != null){try{
connection.close();
}catch(SQLException e) {
e.printStackTrace();
}
}//connection = null;
}
}
连接代码
driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;databaseName=你的数据库名字;username=用户名;password=密码
dbinfo.properties
2.DBCP连接
需导入commons-dbcp-1.4.jar,commons-pool-1.5.6.jar。dbcpconfig.properties里面有关于线程池的内容。
1 importorg.apache.commons.dbcp.BasicDataSourceFactory;2 importjavax.sql.DataSource;3 importjava.sql.Connection;4 importjava.sql.PreparedStatement;5 importjava.sql.ResultSet;6 importjava.sql.SQLException;7 importjava.util.Properties;8
9 public classDBCPUtils {10 private static DataSource ds = null;11 static{12 Properties prop = newProperties();13 try{14 prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));15 ds = BasicDataSourceFactory.createDataSource(prop);//得到一个数据源,自动实现了装饰模式
16 } catch(Exception e) {17 throw new ExceptionInInitializerError("初始化错误请检查配置文件");18 }19 }20 public staticConnection getConnectin(){21 try{22 returnds.getConnection();23 } catch(SQLException e) {24 throw new RuntimeException("连接失败");25 }26
27 }28 public static voidrelease(Connection connection, PreparedStatement statement, ResultSet resultSe){29 if (resultSe != null){30 try{31 resultSe.close();32 } catch(SQLException e) {33 e.printStackTrace();34 }35 }36 //resultSe = null;
37 if (statement != null){38 try{39 statement.close();40 } catch(SQLException e) {41 e.printStackTrace();42 }43 }44 //statement = null;
45 if (connection != null){46 try{47 connection.close();48 } catch(SQLException e) {49 e.printStackTrace();50 }51 }52 }53 }
DBCP连接
1 #连接设置2 driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver3 url=jdbc:sqlserver://localhost:1433;databaseName=数据库名;username=用户名;password=密码
4
5
6 #
7 initialSize=10
8
9 #最大连接数量10 maxActive=50
11
12 #
13 maxIdle=20
14
15 #
16 minIdle=5
17
18 #
19 maxWait=60000
20
21
22 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]23 #注意:"user" 与 "password"两个属性会被明确地传递,因此这里不需要包含他们。24 connectionProperties=useUnicode=true;characterEncoding=utf825
26 #指定由连接池所创建的连接的自动提交(auto-commit)状态。27 defaultAutoCommit=true
28
29 #driver default 指定由连接池所创建的连接的只读(read-only)状态。30 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)31 defaultReadOnly=
32
33 #driver default指定由连接池所创建的连接的事务级别(TransactionIsolation)。34 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE35 defaultTransactionIsolation=REPEATABLE_READ
dbcpconfig.properties
3.C3P0连接
需导入c3p0-0.9.1.2.jar。c3p0-config.xml放在包外。
1 importcom.mchange.v2.c3p0.ComboPooledDataSource;2
3 importjava.sql.Connection;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6 importjava.sql.Statement;7
8 public classC3P0Utils {9 private static ComboPooledDataSource dataSource = newComboPooledDataSource();10
11 public staticComboPooledDataSource getDataSource() {12 returndataSource;13 }14
15 public staticConnection getConnection(){16 try{17 returndataSource.getConnection();18 } catch(SQLException e) {19 throw new RuntimeException("请检查配置文件。");20 }21 }22 public static voidrelease(Connection conn, Statement stmt, ResultSet rs){23
24 if(rs!=null){25 try{26 rs.close();27 } catch(Exception e) {28 e.printStackTrace();29 }30 rs = null;31 }32 if(stmt!=null){33 try{34 stmt.close();35 } catch(Exception e) {36 e.printStackTrace();37 }38 stmt = null;39 }40 if(conn!=null) {41 try{42 conn.close();43 } catch(Exception e) {44 e.printStackTrace();45 }46 conn = null;47 }48 }49 }
c3p0连接
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4 com.microsoft.sqlserver.jdbc.SQLServerDriver
5 jdbc:sqlserver://localhost:1433;databaseName=day12
6 sun
7 123000
8 10
9 30
10 100
11 10
12
13
14
15
c3p0-config.xml
DBUtils:(commons-dbutils-1.4.jar)
DBUtils封装了对JDBC的操作,简化了读写操作,可以使用数据源,数据库连接池等技术来优化性能。三个核心对象:QueryRunner类,ResultSetHandler接口,DBUtils类。
(1)QueryRunner类
提供对sql语句操作的API
query():用于执行select
update():用于执行insert,update,delete
batch():批处理
构造函数:
> new QueryRunner(); 它的事务可以手动控制。
也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
> new QueryRunner(DataSource ds); 它的事务是自动控制的。一个sql一个事务。
此对象调用的方法(如:query、update、batrch)参数中无需Connection对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());//不开启事务
list = qr.query("select * from users where id=?",new BeanListHandler(User.class),1);
QueryRunner qr = new QueryRunner();//事务
qr.update(ManagerThreadLocal.getConnection(),"update account set money=? where name=?",account.getMoney(),account.getName());
(2)ResultSetHandler接口
用于定义select操作后怎么封装结果集
ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
ColumnListHandler:取某一列的数据。封装到List中。
KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
ScalarHandler:适合取单行单列数据
BeanHandler:取第一行数据。new BeanHandler(XXX.class),封装到泛型指定的对象中去。XXX要有set方法。
BeanListHandler
(3)DBUtils类
工具类,定义了关闭资源和事务处理的方法
4.因为涉及到线程池关闭线程(实际上不是关闭,而是把当前线程放回到线程池中),所以要用到包装类(即装饰设计模式)。目的是为了改写已存在类的某个方法或某些方法。下面将写一下我对包装类的理解。实际上我们不需要手写,因为dbcp,c3p0都已经自带线程池管理了。但是还是需要了解,所以就再回顾一下。
装饰设计模式(包装模式)的书写口诀:
(1)编写一个类,实现与被包装类相同的接口
(2)定义一个被包装类类型的对象
(3)定义构造方法,把被包装类的对象注入,给被包装类变量赋值
(4)对于不需要改写的方法,调用原有的方法
(5)对于需要改写的方法,写自己的代码。
下面是关于当前线程放回pool的close放的改写:
5.事务..事务有点麻烦,要和线程混在一起。。我再理解理解