我以一个新闻系统为例,写一个有时分秒的插入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<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()); } } }