这篇还是在回顾知识。主要是关于java连接Sqlserver2012数据库的一些方式记录,以便以后查询。

十一之内复习完这些知识就可以新学Hibernate啦(*^▽^*)


1.普通方式

注意,在连接数据库之前要导入JDBC驱动。因为我用的是sqlserver,所以我导入了sqljdbc4.jar

import java.sql.*;
import java.util.ResourceBundle;
//注意:dbinfo.properties要和该加载文件放到一个目录下,不用写全称,只需要写dbinfo即可
public class DBUtils { private static String driverClass;
private static String 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() throws Exception {
return DriverManager.getConnection(url);
}
public static void closeAll(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里面有关于线程池的内容。

 import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties; public class DBCPUtils {
private static DataSource ds = null;
static {
Properties prop = new Properties();
try {
prop.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
ds = BasicDataSourceFactory.createDataSource(prop);//得到一个数据源,自动实现了装饰模式
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化错误请检查配置文件");
}
}
public static Connection getConnectin(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException("连接失败");
} }
public static void release(Connection connection, PreparedStatement statement, ResultSet resultSe){
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();
}
}
}
}

DBCP连接

 #连接设置
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;databaseName=数据库名;username=用户名;password=密码 #<!-- 初始化连接 -->
initialSize=10 #最大连接数量
maxActive=50 #<!-- 最大空闲连接 -->
maxIdle=20 #<!-- 最小空闲连接 -->
minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

dbcpconfig.properties

3.C3P0连接

需导入c3p0-0.9.1.2.jar。c3p0-config.xml放在包外。

 import com.mchange.v2.c3p0.ComboPooledDataSource;

 import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static ComboPooledDataSource getDataSource() {
return dataSource;
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("请检查配置文件。");
}
}
public static void release(Connection conn, Statement stmt, ResultSet rs){ if(rs!=null){
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}

c3p0连接

 <?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="jdbcUrl">jdbc:sqlserver://localhost:1433;databaseName=day12</property>
<property name="user">sun</property>
<property name="password">123000</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property> </default-config> </c3p0-config>

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>(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>(XXX.class),封装到泛型指定的对象中去。XXX要有set方法。

      BeanListHandler

  (3)DBUtils类

    工具类,定义了关闭资源和事务处理的方法

4.因为涉及到线程池关闭线程(实际上不是关闭,而是把当前线程放回到线程池中),所以要用到包装类(即装饰设计模式)。目的是为了改写已存在类的某个方法或某些方法。下面将写一下我对包装类的理解。实际上我们不需要手写,因为dbcp,c3p0都已经自带线程池管理了。但是还是需要了解,所以就再回顾一下。

装饰设计模式(包装模式)的书写口诀:

   (1)编写一个类,实现与被包装类相同的接口

   (2)定义一个被包装类类型的对象

   (3)定义构造方法,把被包装类的对象注入,给被包装类变量赋值

   (4)对于不需要改写的方法,调用原有的方法

   (5)对于需要改写的方法,写自己的代码。

  下面是关于当前线程放回pool的close放的改写:

 

5.事务..事务有点麻烦,要和线程混在一起。。我再理解理解

java之数据库相关的更多相关文章

  1. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  2. Java代码 简单用于处理和数据库相关的操作

    package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...

  3. Android数据库相关整理

    今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅.主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一.原生数据库 ...

  4. 【java 获取数据库信息】获取MySQL或其他数据库的详细信息

    1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...

  5. 阿里云OneinStack数据库相关

    阿里云OneinStack数据库相关必须进入oneinstack目录下执行相关命令 ===================================源码安装目录: Nginx:/usr/loca ...

  6. Java 核心内容相关面试题【3】

    目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...

  7. Java作业-数据库

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 在Java中使用数据库要经过以下几个步骤: 1. 注册 JDBC 驱动 Class.forName("com ...

  8. 盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k

    最近浏览 Github ,收藏了一些还算不错的 Java面试/学习相关的仓库,分享给大家,希望对你有帮助.我暂且按照目前的 Star 数量来排序. 本文由 SnailClimb 整理,如需转载请联系作 ...

  9. 用Java操作数据库Datetime数据

    Date.Calendar.Timestamp的区别.相互转换与使用 1 Java.util.Date 包含年.月.日.时.分.秒信息. // String转换为Date String dateStr ...

随机推荐

  1. 基础总结(01)--css清除浮动几种方法

    1.父元素添加overflow:auto/hidden; 2.父元素内加空div,添加样式clear:both; 3.父元素添加伪类; .parent:after{ content:''; displ ...

  2. Linux高级指令

    一.hostname指令 作用:操作服务器的主机名(读取,设置) #hostname    作用:表示输出完整的主机名 #hostname -f    作用:表示输出当前主机名中的FQDN(权限定域名 ...

  3. [java,2018-06-26] 扑克牌抽牌求和问题

    问题: 一副扑克牌,除去大小王后共52张牌,随机从中抽八张牌,问八张牌的和最有可能是多少? 分析: 这52张牌,其实就是数字 1 2 3 ...13, 每个数字出现4次.随机抽出8个数,问组成的和最有 ...

  4. 常见cmd命令,开发人员必备

    运行程序 notepad--------打开记事本 calc-----------启动计算器 regedit.exe-------注册表 write----------写字板 mmc--------- ...

  5. 【HQL】函数汇总

    背景 抽空整理一篇HQL函数及常用的小技巧 COALESCE COALESCE(T v1, T v2, -) 返回参数中的第一个非空值:如果所有值都为NULL,那么返回NULL

  6. 消息队列(Message Queue)简介及其使用

    消息队列(Message Queue)简介及其使用 摘要:利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信.消 ...

  7. ajax入门基础

    一.简介 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术. AJAX通过在后台与 ...

  8. 初次安装Ubuntu后的若干配置步骤

    第一步,安装VMware-tools 按照如下提示安装 首先将压缩包,复制到/home 目录下,将其解压,执行./vmware-install.pl即可 第二步,配置使linux能上网 首先将ubun ...

  9. Lightgbm 随笔

    lightGBM LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树.它可以说是分布式的,高效的,有以下优势: 更快的训练效率 低内存使用 更高的准确率 支持并行化学习 可 ...

  10. leetcode136只出现一次的数字

    交换律:a ^ b ^ c <=> a ^ c ^ b 任何数于0异或为任何数 0 ^ n => n 相同的数异或为0: n ^ n => 0 int singleNumber ...