我以一个新闻系统为例,写一个有时分秒的插入Oracle的过程
第一步:先建表:
create table news(
newtitle varchar2(20),
newsContent clob, --这里因为新闻内容较大,使用了大字段。其实实际开发的时候,是使用文件来保存的,数据库只需读文件的地址就可以了。
newsCreateDate date
);
第二步:创建数据表里列对应的javaBean实体类:(这里javaBean的意思就是java的实体的意思,bean是java之父看见桌面上的豌豆起的名字,中文可以解释为实体的意思。他老人家当年设计java的时候,也许是灵感来了,就把一件事情分成几个步骤去做,虽然看起来把事情做复杂了,但是实际上很好用。也利于管理)。
其实实体类在我们学习java类与对像的时候就会写了,只是那时没有人告诉我们它就是javaBean而己哈。JavaBean其实就是一个类,只是这个类我们设计里面的属性为数据表的列名而己哦。(注意看红色的那些字体哦,*^_^*)
我的这个javaBean代码如下:
package entity;
import java.util.Date;
public class News {
//这里javaBean要求所有属性必须封装,这样给数据提高安全,而且命名要符合规范哦。虽然数据库不认大小写,但是我们的java
//还是会认大小写的,java命名要求不能以数据,中文等开头。而且尽量起有实际意义(也就是让人看起来就知道它是用来做什么用的)的名字,不过
//javaBean中。它要求与数据库列名相同,所以这里在设计数据库的时候就得好好想哦,这样让人看起来就知道是什么作用的名字
private String newTitle;
private String newsContent ;
private Date newsCreateDate;
//setter和getter方法
public String getNewtitle() {
return newTitle;
}
public void setNewtitle(String newtitle) {
this.newTitle = newtitle;
}
public String getNewsContent() {
return newsContent;
}
public void setNewsContent(String newsContent) {
this.newsContent = newsContent;
}
public Date getNewsCreateDate() {
return newsCreateDate;
}
public void setNewsCreateDate(Date newsCreateDate) {
this.newsCreateDate = newsCreateDate;
}
}
第三步:
建立一个数据库操作的基类:(基类主要是方便使用不同数据库时,更容易不动原来的业务处理过程的的代码,这就是分层的思想哦。也就是类似于工厂里的流水线一下。一个部门只做属于本部分的事情,像生产部门做生产部分,包装部门做包装部分,提高了效率哦。
具体基类我是这样子写的:(里面的注释部分是不同方式的写法。这里的包名之后放在下面的实现类中,只是更好的管理而己。具体人者见仁,智者见智,看个人喜欢哈)
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;
}
/**
* 计算数据总行数,可用于分页和登录查询
*/
public int getTotalCounts(String sql,Object[] params){
//清空数据,防止SQL注入式攻击
pstmt = null;
connect = null;
rs= null;
int totalCounts =0;
try {
getConnection();
pstmt = connect.prepareStatement(sql);
//填充参数,根据上面的可以写成一个方法来处理参数
int index = 1;
for (Object subObject : params) {
pstmt.setObject(index++, subObject);
}
rs = pstmt.executeQuery();
while (rs.next()) {
totalCounts = rs.getInt(1); //这里数据库表的第一列是的int类型
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
this.closeAll();
}
return totalCounts;
}
}
具体代码如下:
package dao;
import java.util.List;
import entity.News;
public interface NewDao {
/**
* 获得所有新闻列表
* @return
*/
public List getNews();
/**
* 增加新闻
* @param news
* @return
*/
public boolean add(News news);
/**
* 修改新闻
* @param news
* @return
*/
public boolean update(News news);
/**
* 删除新闻
* @param id
* @return
*/
public boolean del(int id);
}
这里可以不用要计算数据总行数(一般这个用于分页查询)。因为查询的那里返回的就是List,只主要在接口类再写一个数据行数的接口和一个分页的接口。之后用List对像接收查询的方法,使用List对像 的size()方法就可以得到数据行数 了.
分页接口一般只要传当前页,和每页的显示数据大小这两个值进来就可以了。
第五步:
实现接口类,这里只写了增加和查询的方法,修改和删除无非就是改一下SQL语句哈。*^_^*
它代码如下:
package dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.jws.soap.SOAPBinding.Use;
import dao.NewDao;
import entity.News;
public class NewsDaoImpl extends BaseDao implements NewDao {
@Override
public List getNews() {
List newsList = new ArrayList();
String sql = "select * from News";
Object[] params = {};
ResultSet rs = this.Query(sql, params);
try {
while (rs.next()) {
String newtitle = rs.getString("newtitle");
String newsContent = rs.getString("newsContent");
Timestamp newsCreateDate = rs.getTimestamp("newsCreateDate");
News news = new News();
news.setNewtitle(newtitle);
news.setNewsContent(newsContent);
news.setNewsCreateDate(newsCreateDate);
newsList.add(news);
}
} catch (SQLException e) {
e.printStackTrace();
}
return newsList;
}
@Override
public boolean add(News news) {
boolean flag = false;
String sql = "insert into news (newtitle,newsContent,newsCreateDate) values(?,?,?)";
Object[] params = {news.getNewtitle(),news.getNewsContent(),news.getNewsCreateDate()};
int i = this.Update(sql, params);
if (i>0) {
flag = true;
}
return flag;
}
@Override
public boolean update(News news) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean del(int id) {
// TODO Auto-generated method stub
return false;
}
}
第六步:
编写测试类:
package Test;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import dao.impl.NewsDaoImpl;
import entity.*;
public class NewsTest {
public static void main(String[] args) {
NewsDaoImpl daoImpl = new NewsDaoImpl();
News news = new News();
news.setNewtitle("good");
news.setNewsContent("wwer");//这果要给它进行格式控制一下,因为这个时间戳就像邮局的邮戳一样。它要一个Long类型的数据。而且Date得到的类型是一个格林治时间
/**
* 这种格式转换在java在是正确的,如果把HH:mm里的mm换成MM或者mi得到的结果是什么?
* 答案是换成MM的时候还是正确的,但注意mM和Mm得到的结果是一样的,它在的结果都乱了。比如电脑那里实际时间是10:42分。用mM和Mm之后,得到的时间是16:47分,而换成 mi、MI、Mi,mI等之后都会报异常
*查询了API,它正确写法应该是SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");这个得特别小心
* 注意,这里从数据库查询的时候,有这样子的写法(以从oracle数据库查询dual表的时间来说(以想得到2014-7-13 10:28:50秒为例(它后面还有一个毫秒,这里省略了),HH那里加上24得到的就是二十四小时制))
* select (sysdate,yyyy-MM-dd HH:mi:ss) from dual;--这里得到当前时间具体,这种在PL/SQL里面是正确的
* select (sysdate,yyyy-MM-dd HH:mm:ss) from dual;--这里得到当前时间,这里原意是想得到具体时间,但是得到的结果却是2014-7-13 10:7:50(因为Oracle不认大小写,这里的第二个七被数据库认为是月份)
* 这里只要是说明一下SimpleDateFormat进制格式控制的格式。
* 可以看到从数据查询(PL/SQL)的时候,想得到当前时间得用上面的第一种方式
* 因为数据库它月份和分种的写法是这样的
* Months月份: 简写为MM
* Minutes分钟: 简写为MI或mi
*/
//SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String time = df.format(new Date());//这里其实是:Date date = new Date();String time = df.format(date);的简写
//Timestamp ts = Timestamp.valueOf(time);//写法1,这种就是借助于String类的作为中间变量
//Date -> Timestamp(前者是父类,后者是子类)
Date date = new Date();
Timestamp ts = new Timestamp(date.getTime());//写法2
System.out.println(ts);//看一下得到的结果
news.setNewsCreateDate(ts);
daoImpl.add(news);
List newsList = daoImpl.getNews();
for (News news2 : newsList) {
System.out.println(news2.getNewtitle()+"\t"+news2.getNewsCreateDate());
}
}
}