您的位置:首页 > 数据库 > Oracle

javaBean方式将含时分秒的日期格式插入oracle数据库(方式1)

2014-07-11 15:43 232 查看
首先创建数据库表,表名为:emp(这里假设弄两列,用来观察插入的用户和对应的创建时间):

字段:

userName varchar2(20),

regDate TIMESTAMP(14),//它是yyyy-MM-dd HH:mm:ss这样子格式的,其中HH它存入的时候是12小时制的,它只允许最大是12


下面是创建表的语法:

create table emp(
userName varchar2(20),
regDate TIMESTAMP(9)
);


第二步:

创建对应的JavaBean实体表,这里起名也为emp,实体名可以随便起,只要里面的属性对应着数据表就可以了

这里我写的是:



package entity;
public class Emp {
private   String userName;
private  String  regDate;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
}


第三步:创建基类,用于方便用不同数据库时可以进行最少的工作量

package dao.impl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {

protected Connection connect = null;// 可用连接
// 驱动类
private static final String driver = "oracle.jdbc.driver.OracleDriver";
// 连接服务器字符串
private static final String url = "jdbc:oracle:thin:@localhost:1521:aq";
// 用户名
private static final String username = "ynr";
// 密码
private static final String password = "123456";
protected PreparedStatement pstmt = null;
protected ResultSet rs = null;

/**
* 获取可用连接
*
* @return
* @throws ClassNotFoundException
* @throws
* @throws Exception
*/
public boolean getConnection() {
try {
Class.forName(driver);
connect = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {

e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 关闭可用连接
*
* @throws Exception
*/
public boolean closeAll()  {

if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
return false;

}
}

// 关闭Statement
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 关闭连接
if (connect != null) {
try {
connect.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}

return true;

}

/**
* 增,删,改
*/
public int Update(String sql, Object[] params) {
int result = 0;
//清空数据,防止SQL注入式攻击
pstmt = null;
connect = null;
rs= null;

try {
getConnection();

pstmt = connect.prepareStatement(sql);
// 填充的参数方式1 // int index=1;
// if (params !=null) {
// for (Object object : params) {
// pstmt.setObject(index++, object);
// }
// }

// 填充的参数方式2
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}

result = pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("executeUpdate" + e.getMessage());
e.printStackTrace();
} catch (Exception e) {

e.printStackTrace();
} finally {
try {
closeAll();
} catch (Exception e) {
System.out.println("执行增,删,改关闭连接时产生异常" + e.getMessage());
e.printStackTrace();
}
}
return result;
}

/**
* 查询
*/
public ResultSet Query(String sql, Object[] params) {
//清空数据,防止SQL注入式攻击
pstmt = null;
connect = null;
rs= null;

try {
getConnection();
pstmt = connect.prepareStatement(sql);
int index = 1;
for (Object object : params) {
pstmt.setObject(index++, object);
}
rs = pstmt.executeQuery();
} catch (SQLException e) {
System.out.println("executeQuery" + e.getMessage());
e.printStackTrace();
} catch (Exception e) {

e.printStackTrace();
}
// finally {
// try {
// closeAll();
// } catch (Exception e) {
// System.out.println("执行查询关闭连接时产生异常" + e.getMessage());
// e.printStackTrace();
// }
//   }
return rs;
}
}


第四步:为了减少开发的耦合度,我这里使用了接口来进行相关的规范:

代码如下:

package dao;
import java.util.List;
import entity.Emp;
public interface RegDao {
boolean add(Emp date); //插入日期的规范声明

List<Emp> getEmpsList();  //查询插入的信息列表
}


第五步:编写实现类和进行测试

package dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import dao.RegDao;
import entity.Emp;

public class RegDaoImpl  extends BaseDao implements RegDao {

@Override
public boolean add(Emp date) {
String sql = "insert into emp(userName,regDate)values(?,to_date(?,'yyyy-mm-dd hh24:mi:ss'))";  //这里如果是:to_date(?,'yyyy-mm-dd hh24:mm:ss'会是什么结果?

int i = 0;
Object[] params = {date.getUserName(),date.getRegDate()};
i = this.Update(sql, params);

return false;
}

@Override
public List<Emp> getEmpsList() {
String sql = "select UserName,RegDate from emp";
Object[] params ={};
List<Emp> empList = new ArrayList<Emp>();
ResultSet rs = this.Query(sql, params);
try {
while (rs.next()) {
Emp emp = new Emp();
emp.setUserName(rs.getString("UserName"));
emp.setRegDate(rs.getString("RegDate"));

; empList.add(emp);
}
} catch (SQLException e) {

e.printStackTrace();
}

return empList;
}
public static void main(String[] args) {
RegDaoImpl daoImpl = new RegDaoImpl();

Date date = new Date();

Emp emp = new Emp();
emp.setUserName("www");
emp.setRegDate(date.toLocaleString());
daoImpl.add(emp);
List<Emp> List = daoImpl.getEmpsList();
for (Emp emp2 : List) {
System.out.println(emp2.getUserName()+"\t" + emp2.getRegDate());
}
}
}

改了之后得到的结是是:ORA 01810 格式代码出现两次
1.在使用Oracle的to_date函数来做日期转换时,可能会直觉地采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss')
from dual;原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
2.另要以24小时的形式显示出来要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份

见如下的说明:

TO_CHAR 是把日期或数字转换为字符串
TO_DATE 是把字符串转换为数据库中得日期类型转换函数
TO_NUMBER 将字符转化为数字

 TO_CHAR
使用TO_CHAR函数处理数字
TO_CHAR(number, '格式')
TO_CHAR(salary,’$99,999.99’);
使用TO_CHAR函数处理日期
TO_CHAR(date,’格式’);

 TO_NUMBER
使用TO_NUMBER函数将字符转换为数字
TO_NUMBER(char[, '格式'])

 TO_DATE
使用TO_DATE函数将字符转换为日期
TO_DATE(char[, '格式'])

 数字格式格式
9 代表一个数字
0 强制显示0
$ 放置一个$符
L 放置一个浮动本地货币符
. 显示小数点
, 显示千位指示符

 日期格式
格式控制 描述
YYYY、YYY、YY 分别代表4位、3位、2位的数字年
YEAR 年的拼写
MM 数字月
MONTH 月的全拼
MON 月的缩写
DD 数字日
DAY 星期的全拼
DY 星期的缩写
AM 表示上午或者下午
HH24、HH12 12小时制或24小时制
MI 分钟
SS 秒钟
SP 数字的拼写
TH 数字的序数词

“特殊字符” 假如特殊字符
HH24:MI:SS AM 15:43:20 PM

日期例子:
SELECT TO_DATE('2006-05-01 19:25:34', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
SELECT TO_DATE('2006-05-01 19:25', 'YYYY-MM-DD HH24:MI') FROM DUAL
SELECT TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24') FROM DUAL
SELECT TO_DATE('2006-05-01', 'YYYY-MM-DD') FROM DUAL
SELECT TO_DATE('2006-05', 'YYYY-MM') FROM DUAL
SELECT TO_DATE('2006', 'YYYY') FROM DUAL

日期说明:
当省略HH、MI和SS对应的输入参数时,Oracle使用0作为DEFAULT值。如果输入的日期数据忽略时间部分,Oracle会将时、分、秒部分都置为0,也就是说会取整到日。

同样,忽略了DD参数,Oracle会采用1作为日的默认值,也就是说会取整到月。

但是,不要被这种“惯性”所迷惑,如果忽略MM参数,Oracle并不会取整到年,取整到当前月。

注意:
1.在使用Oracle的to_date函数来做日期转换时,可能会直觉地采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss')
from dual;原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
2.另要以24小时的形式显示出来要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份

原文地址:http://www.douban.com/note/31849478/

执行了几次用来验证之后,其结果如下:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: