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

我以一个新闻系统为例,写一个有时分秒的插入Oracle的过程

第一步:先建表:

create table news(
newtitle varchar2(20),
newsContent clob, --这里因为新闻内容较大,使用了大字段。其实实际开发的时候,是使用文件来保存的,数据库只需读文件的地址就可以了。
newsCreateDate date
);

--查询一下结果,因为我新建表的时候,测试一下用sql/plus插入的数据是否正确
select * from News;


第二步:创建数据表里列对应的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<News> 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<News> getNews() {
		List<News> newsList = new ArrayList<News>();
		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<News> newsList = daoImpl.getNews();
		for (News news2 : newsList) {
			System.out.println(news2.getNewtitle()+"\t"+news2.getNewsCreateDate());
		}
		

	}
}




你可能感兴趣的:(javaBean方式将含时分秒的日期格式插入oracle数据库(方式2))