您的位置:首页 > 职场人生

我在国企当实习程序员的日子

2014-05-09 14:02 232 查看

没来之前,心目中的国企程序员:

1、分一个单间寝室,或者两个人一间也行。

2、饭卡吃饭只要几元就能吃到外面十几二十的东西。

3、工资没外面IT的高,但是一个月也得个6,7K 吧?

4、生活安逸,每天就插插网线,重启机子。

5、不用怕失业。

6、既然工资不高,那么福利待遇应该妥妥的吧,逢年过节送个几千的应该没问题吧。

来了之后,对应上面的想象:

1、我和一个哥们住在一个超级小的房间,里面只有(也只能有)一张床,大概2m x 3m,自己想想吧,上下铺,我在上铺,床质量很差,一动就咯吱响,第一天晚上我和这哥们都没睡着,3点的时候,我说哥们对不起啊,这床不给力啊。。

2、每个月300饭补,呵呵,在动不动十几二十一餐的一线城市哦,300。

3、工资比想象中低个3,4K而已(大概两千五),啊!拜托,期望工资已经只想要6,7K了,你还能这么刷下限。

4、一组算上我8个人,连领导都在干活,都在加班,你说安逸?不是这阵子才这样,我抱怨压力是不是有点大了,一哥们无语了,对我呵呵,说我还没见识过连续上班19天的时候。还没见识半夜被打电话叫来DEBUG的时候。

5、这个铁饭碗,还是妥妥的。

6、福利听说在去年都取消了,可能和政策有关吧,过年1000,元旦300。没了,没错,没了!这让在腾讯某部门,36个月工资的他们无语了吧。

好吧,谈谈工作吧:

让我熟悉java,eclipse和oracle!

好无语。。大二的东西,又要捡回来吗?

然后说是想看看我水平,让我写个有JTable操作的应用。

好吧,oracle还是第一次接触哦,我愧对软件学院。

==========================================吐槽到此结束====================================

========================================踏实干活才是王道===================================

功能:

1、书本录入,包括:

编号 BOOK_ID

书名 BOOK_NAME

作者 BOOK_AUTHOR

出版社 BOOK_PUBLISH

入库时间 Create_time

SQL> desc aa_book
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------

BOOK_ID                                   NOT NULL NVARCHAR2(50)
BOOK_NAME                                 NOT NULL VARCHAR2(100)
BOOK_AUTHOR                               NOT NULL VARCHAR2(100)
BOOK_PUBLISH                              NOT NULL VARCHAR2(100)
CREATE_TIME                               NOT NULL VARCHAR2(50)


入库的时候要看看是不是主键冲突。

2、书本查询

能够按编号,作者,出版社排序。

3、书本删除

无脑删除。

4、书本修改

修改的时候要看看是不是主键冲突。

界面:

大概长这个样子:



项目免积分打包下载:http://download.csdn.net/download/xihuanqiqi/7325659

jar包都在里面了,导入即可。

数据库配置:

为了怕有的孩子不大懂Oracle,我就免为其难得把自己的配置文档共享下吧:

Ps:
首先请你安装下Oracle,然后再安装下PLSQL,然后进入PLSQL,菜单栏 -> 文件 -> 新建 -> SQL窗口,输入下面5.1到5.9的SQL命令即可。
我的Oracle版本是9i,安装图解教程:http://hi.baidu.com/yuyuliangliang/item/11ffa027ba87220842634a8a
如果实在装不懂,可以留言回复,我基本每天都会上CSDN。

1. 确认PC已装有Oracle10g,但是没有密码,无法进入。
2. 卸载Oracle10g:
2.1 运行services.msc,停止4个和oracle有关的服务
2.2 开始->程序-> Oracle - OraDb_home1 ->  Oracle Installation Products ->Universal Installer
2.3 重启后删除原来oracle所在文件夹

3. 安装oracle9i
D盘 默认-> 企业版 -> 通用
全局数据库名:gt.sxtest
SID:gt	 (操作系统环境变量)
数据库文件目录:D:\oracle10G\oradata
字符集:缺省的 ZHS16GBK(方便跨平台)
服务器参数文件名:D:\oracle 10G\database\spfilegt.ora

SYS口令:qq123qwe
SYSTEM口令:qq123qwe

一开始123qwe,结果报错:ORA-00988:缺少或无效口令
这里密码长度有限制:口令长度不能小于7个字符第一个字符不能为数字且全部字符中应该为字母和数字混合

4. 用户名 和 密码
oracle安装会自动的生存sys用户、scott用户和system用户。
(1)sys用户是 超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是 change_on_install;
(2)system用户是 管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是 manager
(3)一般来讲,对数据库维护,使用system用户登录就可以了。
(4)scott普通用户,密码是tiger。

5.数据库正式开始创建:表空间+表

5.1
创建临时表空间:
CREATE TEMPORARY TABLESPACE AA_TEMP
TEMPFILE 'D:\oracle10G\oradata\gt2\AA_TEMP.dbf'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE 2048M
EXTENT MANAGEMENT LOCAL;

解释:
SIZE 是文件大小
AUTOEXTEND ON  表示是否自动拓展
NEXT 表示文件满了之后拓展的大小
MAXSIZE 表示 最大文件能拓展多大
EXTENT MANAGEMENT LOCAL表示本地表空间管理。

5.2
创建表空间:
CREATE TABLESPACE AA

LOGGING
DATAFILE 'D:\oracle10G\oradata\gt2\aa.dbf'

SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE 2048M
EXTENT MANAGEMENT LOCAL;

5.3
创建用户并把表空间指定给用户
CREATE USER AA_USER IDENTIFIED BY AA_PASS

DEFAULT TABLESPACE AA

TEMPORARY TABLESPACE AA_TEMP;

5.4
给用户赋权
GRANT
CREATE SESSION, CREATE ANY TABLE ,CREATE ANY VIEW, CREATE ANY INDEX,CREATE ANY PROCEDURE,
ALTER ANY TABLE, ALTER ANY PROCEDURE,
DROP ANY TABLE, DROP ANY VIEW , DROP ANY INDEX, DROP ANY PROCEDURE,
SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE ,DELETE ANY TABLE
TO AA_USER;

5.5
给用户赋予角色
GRANT
CONNECT ,RESOURCE, DBA TO AA_USER;

取消授予角色;revoke dba from AA_USER;

5.6
建表
CREATE TABLE AA_BOOK(
book_id varchar2(50) not null,
book_name varchar2(100) not null,
book_author varchar2(100) not null,
book_publish varchar2(100) not null,
create_time varchar2(50) default to_char(sysdate,'yyyy-MM-d HH:mm:ss') not null,
constraint pk_book primary key (book_id)
)
tablespace AA

5.7
插入数据
insert into aa_book(book_id,book_name,book_author,book_publish,create_time) values('1ABBC1','一本书','一个作者','一家出版社','2014-05-06')

说两点:
1.不能带';',否则会提示无效字符
2.字符串用单引号,而不能用双引号


这就是配置文档了,如果有人想实现ID自增,类似MySQL和MSSQL那样,可以这么操作(注意下BOOK_ID已经变成了number类型):
5.1
创建临时表空间:
CREATE TEMPORARY TABLESPACE AA_TEMP
TEMPFILE 'D:\oracle10G\oradata\gt2\AA_TEMP.dbf'
SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE 2048M
EXTENT MANAGEMENT LOCAL;

解释:
SIZE 是文件大小
AUTOEXTEND ON  表示是否自动拓展
NEXT 表示文件满了之后拓展的大小
MAXSIZE 表示 最大文件能拓展多大
EXTENT MANAGEMENT LOCAL表示本地表空间管理。

5.2
创建表空间:
CREATE TABLESPACE AA

LOGGING
DATAFILE 'D:\oracle10G\oradata\gt2\aa.dbf'

SIZE 32M
AUTOEXTEND ON
NEXT 32M MAXSIZE 2048M
EXTENT MANAGEMENT LOCAL;

5.3
创建用户并把表空间指定给用户
CREATE USER AA_USER IDENTIFIED BY AA_PASS

DEFAULT TABLESPACE AA

TEMPORARY TABLESPACE AA_TEMP;

5.4
给用户赋权
GRANT
CREATE SESSION, CREATE ANY TABLE ,CREATE ANY VIEW, CREATE ANY INDEX,CREATE ANY PROCEDURE,
ALTER ANY TABLE, ALTER ANY PROCEDURE,
DROP ANY TABLE, DROP ANY VIEW , DROP ANY INDEX, DROP ANY PROCEDURE,
SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE ,DELETE ANY TABLE
TO AA_USER;

5.5
给用户赋予角色
GRANT
CONNECT ,RESOURCE, DBA TO AA_USER;

取消授予角色;revoke dba from AA_USER;

5.6
建表
CREATE TABLE AA_BOOK(
book_id number(10,0) not null,
book_name varchar2(100) not null,
book_author varchar2(100) not null,
book_publish varchar2(100) not null,
create_time varchar2(50) default to_char(sysdate,'yyyy-MM-d HH:mm:ss') not null,
constraint pk_book primary key (book_id)
)
tablespace AA

5.7
建立序列
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
NOCACHE

以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence
范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环
如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.
对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq

5.8
建立触发器 - 实现自增ID

CREATE OR REPLACE TRIGGER AA_INSERT_TRIGGER
BEFORE INSERT ON AA_BOOK
FOR EACH ROW

BEGIN
SELECT emp_sequence.nextval into :new.book_id from dual;
END;

5.9
插入数据
insert into aa_book(book_name,book_author,book_publish,create_time) values('一本书','一个作者','一家出版社','2014-05-06')


对我来说的项目亮点:

1、JTable 中实现 “删除”按钮和“编辑”按钮,这个很屌,不是吗。

2、Oracle连接代码(以前没接触过哦,所以比较新鲜)。

3、JTable 配合 DefaultTableModel,清空数据啊,添加数据啊,都是以前没搞过的。

4、父窗口和模态窗口的研究:

这个长知识了,原来JFrame不具备模态窗口的条件:

//Window类的构造:
Window(GraphicsConfiguration gc){} //Frame和JFrame采用了这个构造方法

//下面这三个构造方法才能拓展出模态窗口,因为它们指定了一个Frame或Window作为其所有者
Window(Frame owner){}
Window(Window owner){}
Window(Window owner, GraphicsConfiguration gc){}

所以要改用JDialog!

Dialog继承的是Window类,它的构造如下:
public Dialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) {
super(owner, gc); //重点在这里,所以它可以设置模态
this.title = title;
this.modal = modal;
setFocusTraversalPolicy(KeyboardFocusManager.getCurrentKeyboardFocusManager().getDefaultFocusTraversalPolicy());
}

JFrame和它的父类Frame的构造:
public Frame(String title, GraphicsConfiguration gc) {
super(gc); //采用了Window的第一种构造
init(title, gc);
}


5、对精简代码的一些小感悟:

5.1 同一个功能尽可能多封装在一个函数:

我把JRadioButton部分代码,放到刷新JTable的函数中:
用一个判断作为一个分支:
if(sql.equals(SELECT_ALL_SQL)){
String postfix = null;
if(idRB.isSelected()){
postfix = " order by book_id";
}else if(authorRB.isSelected()){
postfix = " order by book_author";
}else if(publishRB.isSelected()){
postfix = " order by book_publish";
}
sql += postfix;
}
这样子很烦,因为出现不少次呢,所以封装成getPostfix(),每次:SQL+=getPostfix()即可:
/*
* 获取排序后缀字符串:order by xx 返回值为String
*/
private String getPostfix() {
String postfix = null;
if (idRB.isSelected()) {
postfix = " order by book_id";
} else if (authorRB.isSelected()) {
postfix = " order by book_author";
} else if (publishRB.isSelected()) {
postfix = " order by book_publish";
}
return postfix;
}

5.2 用try - catch来帮助做一些判断:

在录入的时候,如果数据库中已有主键,try会报错。
此时,我们把报错信息省略。
catch (SQLException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
因为报错看起来不美丽。

然后因为update失败,返回的影响行数就 不是 > 0所以就能判断出update失败。
类似;
if(DBHelper.update(sql, pras) > 0 ){
JOptionPane.showMessageDialog(null, "录入成功!");
reflashTableData(SELECT_ALL_SQL,null);
}else{
JOptionPane.showMessageDialog(null, "书本编号已存在!", "错误哦~", JOptionPane.ERROR_MESSAGE);
}

5.3 去掉一些傻逼逻辑:

比如说,table更新获得焦点:
这是之前的代码:
//默认情况焦点放到最后一行,除非指定focusOnRowIndex
int allRowsCount = table.getRowCount();
if(focusOnRowIndex == -1){
table.requestFocus();
table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1);//最后一行获得焦点
}else{
table.requestFocus();
if(allRowsCount-1 + 1  == focusOnRowIndex){//如果是最后一行
table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1);//最后一行获得焦点
}else
table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex);//选中那一行获得焦点
}

这是之后的代码!:
int allRowsCount = table.getRowCount();
table.requestFocus();
if(focusOnRowIndex == -1  || (allRowsCount-1 + 1)  == focusOnRowIndex)
table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1);
else
table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex);

5.4 一个函数控制不要超过40行:

一个函数如果太多行,就分几个写。
比如说我的initUI(),要实现两个panel的界面:searchPanel和inputPanel,
写在一起就太长了,于是我就: initSearchPanel() 和 initInputPanel()
然后再initUI()中调用这两个函数就好了。


5.5 try catch 的东西可以写在一起:

比如:
try{
//语句块A
}catch{

}

try{
//语句块B
}catch{

}

写成:
try{
//语句块A
//语句块B
}catch{

}


5.6 加注释:

这个要考虑清楚什么叫精简代码,首先注释不算代码量;
其次,注释能帮人更好的阅读代码,也和我们精简代码的期望是一致的。

基本做到每个函数前面有基本的注释,如:
/*
* 这个函数是干嘛用的!
*/
private void test(){
}


代码:

其实不建议直接看代码,虽然我每个函数都有注释,但是依旧很长很烦。

建议把项目下载(免积分下载哦),然后导入,然后再稍微看看。

如果我有什么讲得不清楚,或者某段代码不明白,可以留言,我都会回复的。

DBHelper.java:

这个数据库操作全集成在这里了。。

package com.gtsx;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBHelper {
//数据库驱动对象
public static final String DRIVER="oracle.jdbc.driver.OracleDriver";

//连接字符串
public static final String URL="jdbc:oracle:thin:@localhost:1521:gt2";

//Username
public static final String USER="system";

//Password
public static final String PWD="qq123qwe";

private static Connection con=null; //数据库连接对象
private static PreparedStatement ps=null;  //预编译对象
private static ResultSet rs=null;          //结果集
private static DataSource source=null; //数据源对象

//获取连接对象
public static Connection getConnection(){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
con=DriverManager.getConnection(URL,USER,PWD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return con;
}

//更新,插入,删除
public static int update(String sql,String... pras){
int resu=0;
if(con == null){
con=getConnection();
}
try {
ps=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
if(pras != null){
for(int i=0;i<pras.length;i++){
ps.setString(i+1,pras[i]);
}
}
resu=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
finally{
//closeAllObject();
}
return resu;
}

//查询
public static ResultSet query(String sql,String... pras){
if(con == null){
con=getConnection();
}
try {
ps=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

if(pras!=null)
for(int i=0;i<pras.length;i++){
ps.setString(i+1, pras[i]);
}

rs=ps.executeQuery();

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}

//关闭所有对象
public static void closeAllObject(){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}


GTSX_Text1.java:

主要功能都在这里!

package com.gtsx;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import java.sql.*;
import java.text.SimpleDateFormat;

//第三方控件
import hysun.util.DateChooser;
import java.util.Calendar;

public class GTSX_Text1 {
public static void main(String args[]) {
new MainFrame();
}
}

class MainFrame extends JFrame implements ActionListener {

public MainFrame() {
super("书本入库管理系统");

// 初始化 - UI
contentPane = this.getContentPane();
FlowLayout fl = new FlowLayout();
fl.setHgap(20);// 横向间距20像素

contentPane.setLayout(fl);

initSearchPanel();// 搜索显示面板
initInputPanel(); // 书本入库信息录入面板

// 初始化菜单栏
initMenuBar();

// 初始化表格数据
reflashTableData(SELECT_ALL_SQL);

// 设置 大小 & 显示位置
initHeightAndWidthAndPos();
this.setSize(width, height);
this.setLocation(xPos, yPos);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);

}

/*
* 初始化UI - SearchPanel
*/
private void initSearchPanel() {
// 初始化UI - searchPanel
searchPanel = new JPanel();
contentPane.add(searchPanel, BorderLayout.CENTER);

searchPanel.setLayout(bag);

JLabel label1 = new JLabel("请输入书名:");
goBtn = new JButton("查询");
goBtn.addActionListener(this);
text = new JTextField(25);

BG = new ButtonGroup();
idRB = new JRadioButton("按书本编号排序");
authorRB = new JRadioButton("按作者排序");
publishRB = new JRadioButton("按出版社排序");
BG.add(idRB);
BG.add(authorRB);
BG.add(publishRB);
idRB.addActionListener(this);
authorRB.addActionListener(this);
publishRB.addActionListener(this);

idRB.setSelected(true);// 默认选中按书本编号查询

// 初始化UI - searchPanel - table
table = new JTable();

scrollPane = new JScrollPane();
scrollPane.setViewportView(table);
scrollPane.setPreferredSize(new Dimension(500, 400));

setCons(0, 3, 4, 3);
searchPanel.add(scrollPane, c);

setCons(0, 0, 1, 1);
searchPanel.add(label1, c);

setCons(1, 0, 2, 1);
searchPanel.add(text, c);

setCons(0, 1, 1, 1);
searchPanel.add(idRB, c);

setCons(1, 1, 1, 1);
searchPanel.add(authorRB, c);

setCons(2, 1, 1, 1);
searchPanel.add(publishRB, c);

setCons(3, 0, 1, 1);
searchPanel.add(goBtn, c);
}

/*
* 初始化UI - inputPanel
*/
private void initInputPanel() {
inputPanel = new JPanel();
contentPane.add(inputPanel, BorderLayout.EAST);
inputPanel.setLayout(bag);

JLabel lb0 = new JLabel("书本编码:");
setCons(0, 0, 1, 1);
inputPanel.add(lb0, c);

book_idTF = new JTextField(10);
setCons(1, 0, 1, 1);
inputPanel.add(book_idTF, c);

JLabel lb2 = new JLabel("书名:");
setCons(0, 1, 1, 1);
inputPanel.add(lb2, c);

book_nameTF = new JTextField(10);
setCons(1, 1, 1, 1);
inputPanel.add(book_nameTF, c);

JLabel lb3 = new JLabel("作者:");
setCons(0, 2, 1, 1);
inputPanel.add(lb3, c);

book_authorTF = new JTextField(10);
setCons(1, 2, 1, 1);
inputPanel.add(book_authorTF, c);

JLabel lb5 = new JLabel("入库时间:");
setCons(0, 3, 1, 1);
inputPanel.add(lb5, c);

book_dateTF = new JTextField(10);
setCons(1, 3, 1, 1);
inputPanel.add(book_dateTF, c);

JButton select_date_btn = new JButton("选择日期");
setCons(2, 3, 1, 1);
inputPanel.add(select_date_btn, c);

select_date_btn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
dc.setLocationRelativeTo(book_dateTF);
dc.setVisible(true);
Calendar cal = dc.getSelectedDate();
if (cal != null) {
book_dateTF.setText(FORMATTER.format(cal.getTime()));
}
}

});

JLabel lb4 = new JLabel("出版社:");
setCons(0, 4, 1, 1);
inputPanel.add(lb4, c);

String nations[] = { "广铁出版社", "工业出版社", "湖南出版社", "卖萌出版社" };
book_publishCB = new JComboBox(nations);
book_publishCB.setMaximumSize(new Dimension(115, 20));
book_publishCB.setMinimumSize(new Dimension(115, 20));
book_publishCB.setPreferredSize(new Dimension(115, 20));

setCons(1, 4, 1, 1);
inputPanel.add(book_publishCB, c);

inputBtn = new JButton("录入");
inputBtn.addActionListener(this);
setCons(1, 5, 1, 1);
inputPanel.add(inputBtn, c);
}

/*
* GridBird 网格布局辅助函数
*/
public void setCons(int x, int y, int width, int height) {
c.weightx = 1;
c.weighty = 1;
c.gridheight = height;
c.gridwidth = width;
c.gridx = x;
c.gridy = y;
}

/*
* 初始化菜单栏
*/
private void initMenuBar() {
// TODO Auto-generated method stub
menuBar = new JMenuBar();
menu = new JMenu("文件");
exitItem = new JMenuItem("退出");
//addBookItem.addActionListener(this);
exitItem.addActionListener(this);
//menu.add(addBookItem);
menu.add(exitItem);
menuBar.add(menu);
this.setJMenuBar(menuBar);
}

/*
* 刷新表格数据 - 重载 1
*/
private void reflashTableData(String sql, String... pras) {
reflashTableData(sql, -1, pras);
}

/*
* 刷新表格数据 - 重载2 int focusOnRowIndex; 是说明下要哪一行获得焦点。 -1表示默认情况,最后一行
*/
private void reflashTableData(String sql, int focusOnRowIndex,
String... pras) {

// 清空JTable
if (dtm != null) {
dtm.setRowCount(0);
}

// 没有搜索条件就全排,默认加上order by xx
if (sql.equals(SELECT_ALL_SQL)) {
sql += getPostfix();
}

ResultSet rs = DBHelper.query(sql, pras);
fillCellData(rs);// 填充cellData数据
String[] columnNames = { "编号", "书名", "作者", "出版社", "入库时间", "DEL", "Edit" };
dtm = new myTablemodel(cellData, columnNames);
table.setModel(dtm);

// 删除按钮
this.table.getColumnModel().getColumn(delColumnIndex).setCellEditor(
new MyDelButtonEditor(this.table));
this.table.getColumnModel().getColumn(delColumnIndex).setCellRenderer(
new MyButtonRender("Del"));

// 编辑按钮
this.table.getColumnModel().getColumn(editColumnIndex).setCellEditor(
new MyEditButtonEditor(this.table, this));
this.table.getColumnModel().getColumn(editColumnIndex).setCellRenderer(
new MyButtonRender("Edit"));

this.table.setRowHeight(25);

// 设置行焦点,默认最后一行,如果UI有操作就当前行
int allRowsCount = table.getRowCount();
table.requestFocus();
if (focusOnRowIndex == -1 || (allRowsCount - 1 + 1) == focusOnRowIndex)
table.setRowSelectionInterval(allRowsCount - 1, allRowsCount - 1);
else
table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex);
}

/*
* 获取排序后缀字符串:order by xx 返回值为String
*/
private String getPostfix() {
String postfix = null;
if (idRB.isSelected()) {
postfix = " order by book_id";
} else if (authorRB.isSelected()) {
postfix = " order by book_author";
} else if (publishRB.isSelected()) {
postfix = " order by book_publish";
}
return postfix;
}

/*
* 获取JTable 的 CellData 填充CellData的数据
*/
private void fillCellData(ResultSet rs) {
int rowCount = 0;
try {
columnNumber = rs.getMetaData().getColumnCount() + 2;// 加一个编辑一个删除

rs.last();
rowCount = rs.getRow();
if (rowCount > 0) {
cellData = new Object[rowCount][columnNumber];
} else {
cellData = new Object[1][columnNumber];
cellData[0][0] = "查无数据";
}
rs.beforeFirst();

// 给cellData赋值
if (rs != null) {
int i = 0;
while (rs.next()) {
for (int j = 0; j < columnNumber - 2; j++) {
cellData[i][j] = rs.getObject(j + 1);
}
i++;
}
}

} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

/*
* 初始化UI的长宽和初始显示位置
*/
private void initHeightAndWidthAndPos() {
// TODO Auto-generated method stub
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
height = screenSize.height * 2 / 3;
width = screenSize.width * 3 / 4;
xPos = (screenSize.width - width) / 2;
yPos = (screenSize.height - height) / 2;
}

/*
* 响应按钮监听函数 (non-Javadoc)
*
* @see
* java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == goBtn) {
String searchText = this.text.getText();
if (searchText == "" || searchText.equals("")) {
reflashTableData(SELECT_ALL_SQL, null);
} else {
String postfix = null;
if (idRB.isSelected()) {
postfix = " order by book_id";
} else if (authorRB.isSelected()) {
postfix = " order by book_author";
} else if (publishRB.isSelected()) {
postfix = " order by book_publish";
}

String sql = "select * from aa_book where book_id = '"
+ searchText + "'" + postfix;
// System.out.println(sql);
reflashTableData(sql, null);
}

}
if (e.getSource() == inputBtn) {
String book_id_text = this.book_idTF.getText();
String book_name_text = this.book_nameTF.getText();
String book_author_text = this.book_authorTF.getText();
String book_publish_text = this.book_publishCB.getSelectedItem()
.toString();
String book_date_text = this.book_dateTF.getText();
if (book_name_text.equals("") || book_author_text.equals("")
|| book_publish_text.equals("")
|| book_date_text.equals("")) {
JOptionPane.showMessageDialog(null, "请您填写完整的数据!", "错误哦~",
JOptionPane.ERROR_MESSAGE);
} else {
String sql = "insert into aa_book(book_id,book_name,book_author,book_publish,create_time) values(?,?,?,?,?)";
String pras[] = { book_id_text, book_name_text,
book_author_text, book_publish_text, book_date_text };

if (DBHelper.update(sql, pras) > 0) {
JOptionPane.showMessageDialog(null, "录入成功!");
reflashTableData(SELECT_ALL_SQL, null);
} else {
JOptionPane.showMessageDialog(null, "书本编号已存在!", "错误哦~",
JOptionPane.ERROR_MESSAGE);
}

}
}
if(e.getSource() == this.exitItem){
int returnVal = JOptionPane.showConfirmDialog(null,
"确定离开?", "您点击了关闭按钮", JOptionPane.YES_NO_OPTION);
if(returnVal == JOptionPane.YES_OPTION){
this.dispose();
System.exit(0);
}
}

if(e.getSource() == idRB || e.getSource() == authorRB || e.getSource() == publishRB){
reflashTableData(SELECT_ALL_SQL, null);
}
}

/*
* 自定义类myTablemodel 自定义的DefaultTableModel 方便控制是否可编辑等属性
*/
class myTablemodel extends DefaultTableModel {
myTablemodel(Object[][] cells, String[] colnames) {
super(cells, colnames);
}

public boolean isCellEditable(int row, int column) {
if (column == delColumnIndex || column == editColumnIndex) {
return true;
} else {
return false;
}
}

}

/*
* 自定义类MyDelButtonEditor 用来放在JTable中
*/
public class MyDelButtonEditor extends DefaultCellEditor {
private static final long serialVersionUID = -6546334664166791132L;

private JPanel panel;

private JButton button;

public MyDelButtonEditor(JTable table) {
// TODO Auto-generated constructor stub
// DefautlCellEditor有此构造器,需要传入一个,但这个不会使用到,直接new一个即可。
super(new JTextField());

// 设置点击几次激活编辑。
this.setClickCountToStart(1);

this.initButton(table);

this.initPanel();

// 添加按钮。
this.panel.add(this.button);
}

private void initButton(final JTable table) {
this.button = new JButton();

// 设置按钮的大小及位置。
this.button.setBounds(0, 0, 50, 15);

// 为按钮添加事件。这里只能添加ActionListner事件,Mouse事件无效。
this.button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int res = JOptionPane.showConfirmDialog(null, "确认删除?",
"请确定是否删除该行数据", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {
int rowIndex = table.getSelectedRow();
Object book_id = table.getModel().getValueAt(rowIndex,
0);
// System.out.println(book_id.toString());

String sql = "delete from aa_book where book_id = '"
+ book_id.toString() + "'";
if (DBHelper.update(sql, null) > 0) {
JOptionPane.showMessageDialog(null, "删除成功");
reflashTableData(SELECT_ALL_SQL, rowIndex);
}

}
// 触发取消编辑的事件,不会调用tableModel的setValue方法。
MyDelButtonEditor.this.fireEditingCanceled();

// 这里可以做其它操作。
// 可以将table传入,通过getSelectedRow,getSelectColumn方法获取到当前选择的行和列及其它操作等。
}
});

}

private void initPanel() {
this.panel = new JPanel();

// panel使用绝对定位,这样button就不会充满整个单元格。
this.panel.setLayout(null);
}

/**
* 这里重写父类的编辑方法,返回一个JPanel对象即可(也可以直接返回一个Button对象,但是那样会填充满整个单元格)
*/
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
// 只为按钮赋值即可。也可以作其它操作。
this.button.setText(value == null ? "DEL" : String.valueOf(value));

return this.panel;
}

/**
* 重写编辑单元格时获取的值。如果不重写,这里可能会为按钮设置错误的值。
*/
@Override
public Object getCellEditorValue() {
return this.button.getText();
}
}

/*
* 自定义类MyEditButtonEditor 用来放在JTable中
*/
public class MyEditButtonEditor extends DefaultCellEditor {
private static final long serialVersionUID = -6546334664166791132L;

private JPanel panel;

private JButton button;

public MyEditButtonEditor(JTable table, MainFrame mf) {
// TODO Auto-generated constructor stub
// DefautlCellEditor有此构造器,需要传入一个,但这个不会使用到,直接new一个即可。
super(new JTextField());

// 设置点击几次激活编辑。
this.setClickCountToStart(1);

this.initButton(table, mf);

this.initPanel();

// 添加按钮。
this.panel.add(this.button);
}

private void initButton(final JTable table, final MainFrame mf) {
this.button = new JButton();

// 设置按钮的大小及位置。
this.button.setBounds(0, 0, 50, 15);

// 为按钮添加事件。这里只能添加ActionListner事件,Mouse事件无效。
this.button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
EditDialog ed = new EditDialog(mf);
// 触发取消编辑的事件,不会调用tableModel的setValue方法。
MyEditButtonEditor.this.fireEditingCanceled();

// 这里可以做其它操作。
// 可以将table传入,通过getSelectedRow,getSelectColumn方法获取到当前选择的行和列及其它操作等。
}
});

}

private void initPanel() {
this.panel = new JPanel();

// panel使用绝对定位,这样button就不会充满整个单元格。
this.panel.setLayout(null);
}

/**
* 这里重写父类的编辑方法,返回一个JPanel对象即可(也可以直接返回一个Button对象,但是那样会填充满整个单元格)
*/
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
// 只为按钮赋值即可。也可以作其它操作。
this.button.setText(value == null ? "DEL" : String.valueOf(value));

return this.panel;
}

/**
* 重写编辑单元格时获取的值。如果不重写,这里可能会为按钮设置错误的值。
*/
@Override
public Object getCellEditorValue() {
return this.button.getText();
}
}

/*
* 自定义类EditDialog 用来放在修改书本信息
*/
class EditDialog {
private JTextField book_id_TF;
private JTextField book_name_TF;
private JTextField book_author_TF;
private JTextField book_publish_TF;
private JTextField book_date_TF;
private JPanel panel;
private JButton saveBtn;
private String orgBookID;

public EditDialog(JFrame father) {
final JDialog jd = new JDialog(father, "编辑书本信息", true);

panel = new JPanel();
Container jd_contentPane = jd.getContentPane();

jd_contentPane.setLayout(bag);

TableModel tm = table.getModel();
int row = table.getSelectedRow();

orgBookID = tm.getValueAt(row, 0).toString();

JLabel lb0 = new JLabel("书本编码:");
book_id_TF = new JTextField(20);
book_id_TF.setText(tm.getValueAt(row, 0).toString());

JLabel lb1 = new JLabel("书名:");
book_name_TF = new JTextField(20);
book_name_TF.setText(tm.getValueAt(row, 1).toString());

JLabel lb2 = new JLabel("作者:");
book_author_TF = new JTextField(20);
book_author_TF.setText(tm.getValueAt(row, 2).toString());

JLabel lb3 = new JLabel("出版社:");
book_publish_TF = new JTextField(20);
book_publish_TF.setText(tm.getValueAt(row, 3).toString());

JLabel lb4 = new JLabel("入库日期:");
book_date_TF = new JTextField(20);
book_date_TF.setText(tm.getValueAt(row, 4).toString());

// panel.setLayout(bag);

setCons(0, 0, 1, 1);
jd_contentPane.add(lb0, c);
setCons(1, 0, 1, 1);
jd_contentPane.add(book_id_TF, c);

setCons(0, 1, 1, 1);
jd_contentPane.add(lb1, c);
setCons(1, 1, 1, 1);
jd_contentPane.add(book_name_TF, c);

setCons(0, 2, 1, 1);
jd_contentPane.add(lb2, c);
setCons(1, 2, 1, 1);
jd_contentPane.add(book_author_TF, c);

setCons(0, 3, 1, 1);
jd_contentPane.add(lb3, c);
setCons(1, 3, 1, 1);
jd_contentPane.add(book_publish_TF, c);

setCons(0, 4, 1, 1);
jd_contentPane.add(lb4, c);
setCons(1, 4, 1, 1);
jd_contentPane.add(book_date_TF, c);

saveBtn = new JButton("修改");
setCons(1, 5, 1, 1);
jd_contentPane.add(saveBtn, c);
saveBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
String book_id = book_id_TF.getText();
String book_name = book_name_TF.getText();
String book_author = book_author_TF.getText();
String book_publish = book_publish_TF.getText();
String book_date = book_date_TF.getText();

// 请注意!!!!!!!!!!!!!
// 这边逻辑太多了,就偷懒,默认四个都不为空都会修改吧
String sql = "update aa_book set book_id = ?, book_name = ? , book_author = ? , book_publish = ? , create_time = ? where book_id = ?";
String[] pras = { book_id, book_name, book_author,
book_publish, book_date, orgBookID };

if (DBHelper.update(sql, pras) > 0) {
JOptionPane.showMessageDialog(null, "修改成功!");
reflashTableData(SELECT_ALL_SQL, null);
jd.dispose();

} else {
JOptionPane.showMessageDialog(null, "书本编号冲突!",
"ERROR! 修改不成功!", JOptionPane.ERROR_MESSAGE);
}
}

});

jd.setSize(400, 300);
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
height = screenSize.height * 1 / 3;
width = screenSize.width * 1 / 4;

int xPos = (screenSize.width - width) / 2;
int yPos = (screenSize.height - height) / 2;
jd.setLocation(xPos, yPos);
jd.setVisible(true);
}
}

private JPanel panel;
private Container contentPane;
private JPanel searchPanel;
private JPanel inputPanel;
private int height, width, xPos, yPos;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem addBookItem;
private JMenuItem exitItem;
private JTable table;
private Object[][] cellData;
private JScrollPane scrollPane;
private int columnNumber;
private int defaultRowsNum;
GridBagLayout bag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
private JButton goBtn;
private JTextField text;
private myTablemodel dtm = null;
private JTextField book_idTF;
private JTextField book_nameTF;
private JTextField book_authorTF;
private JComboBox book_publishCB;
private JTextField book_dateTF;
private JButton inputBtn;
final DateChooser dc = new DateChooser(this, true);
private static final SimpleDateFormat FORMATTER = new SimpleDateFormat(
"yyyy-MM-dd");
private int delColumnIndex = 5;
private int editColumnIndex = 6;
private String SELECT_ALL_SQL = "select * from aa_book";
private ButtonGroup BG;
private JRadioButton idRB;
private JRadioButton authorRB;
private JRadioButton publishRB;
}


实现一个书本入库管理系统,能够:增删改查!

MyButtonRender.java:
辅助类,用来调整JTable中的JButton属性。

package com.gtsx;
import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyButtonRender implements TableCellRenderer
{
private JPanel panel;

private JButton button;

private String nameOfBtn;

public MyButtonRender(String btnName)
{
nameOfBtn = btnName;

this.initButton();

this.initPanel();

// 添加按钮。
this.panel.add(this.button);
}

private void initButton()
{
this.button = new JButton();

// 设置按钮的大小及位置。
this.button.setBounds(5, 2, 60, 20);

// 在渲染器里边添加按钮的事件是不会触发的
// this.button.addActionListener(new ActionListener()
// {
//
// public void actionPerformed(ActionEvent e)
// {
// // TODO Auto-generated method stub
// }
// });

}

private void initPanel()
{
this.panel = new JPanel();

// panel使用绝对定位,这样button就不会充满整个单元格。
this.panel.setLayout(null);
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column)
{
// 只为按钮赋值即可。也可以作其它操作,如绘背景等。
//this.button.setText(value == null ? "DEL" : String.valueOf(value));
this.button.setText(nameOfBtn);

return this.panel;
}

}


emaster  关注信息安全的胖子

欢迎转载,但转载请注明地址:http://blog.csdn.net/emaste_r/article/details/25384691
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java oracle