谈Java编程高级之程序开发的规范性
当我们通过一段时间的Java学习之后,我们便会对Java编程有一种额外的要求,例如,我们便会自觉的去遵守一些使我们的项目更加容易被认知,更加便于去管理的方式编写程序,就好像我们都去自觉的遵守编码惯例一样,编码惯例中对于类、方法、接口、变量、常量以及包的命名规定并不是强制性的,但是,成熟的程序设计人员却都去自觉的遵守它,因为,他们知道这于软件开发工作的影响是非常大的。因此,进入到Java高级编程课程的学习后,我们便更加应该注意,如何能使自己的项目能够被别人读懂,使自己的项目更有层次感,更容易被管理。
下面,我仅就JDBC与MySQL数据库操作完成的简单项目为例,来阐述规范化的程序编程模式:
假设在一个名为jdbc的数据库中建有一张user表,表中的字段依次为:
字段
类型
长度
允许空值
id
int
11
NO 主键
name
varchar
15
NO
birthday
date
0
NO
intro
text
0
NO
photo
blob
0
NO
作为一个完整的项目,要想使自己编写出来的程序更加的有层次,那么,就必须得把整个项目的功能分割开来由不同的几部分来完成,例如将整个项目的功能分别交由几个不同包中的类来完成,这样,每个包中的类都有自己独特的实现功能,而且类与类间又不会彼此混淆,也就更容易被程序员管理,认知。
在此例中,我简单的通过五个包来实现该项目的基本功能。
首先,将这些字段封装在一个与之相对应的实体bean包中,例如:net.csdn.hr.user.bean包。
接着,将一些实现功能的方法以接口的形式封装在一个包中,例如:net.csdn.hr.user.dao包中。
然后,将具体功能的实现以继承该接口类的方式放在另一个包中,例如:net.csdn.hr.user.impl包中。
最重要的是将一些重复性使用的对象、方法作为工具封装在一个单独的包中,例如:net.csdn.hr.user.uril包中。
最后,如果想把项目做成图形化界面的形式可以把想应的类也单独封装在一个包中,例如:net.csdn.hr.user.gui包中。
这样一来,原本看似没有层次、乱堆叠的程序,便出现了层次感,且很容易被其他程序员所读懂。因为,我们写出的程序不只要能满足我们自身的需求,更重要的是要使程序作为一种语言,在程序员与程序之间进行交流、沟通的语言。
对于上面的步骤,我分别以具体实例来作进一步的解释:
//将这些字段封装在一个与之相对应的实体bean包中并为之添加相应的方法
packagenet.csdn.hr.user.bean;
importjava.sql.Blob;
importjava.sql.Date;
import org.w3c.dom.Text;
public classUser {
/**
*@program 用户信息的实体Bean
*@author lihh
*2012-9-9 10:32
*/
private Integer id;
//用户的编号
private String name;
//用户的姓名
private Date birthday;
//用户的出生日期
private Text intro;
//用户的个人简介
private Blob photo;
//用户的个人照片
//默认的无参数构造器
public User(){
}
//带有参数的构造器
publicUser(Integer id,String name,Date birthday,Text intro,Blob photo){
this.id =id;
this.name = name;
this.birthday = birthday;
this.intro = intro;
this.photo =photo;
}
//属性对应的set和get方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Text getIntro() {
return intro;
}
public void setIntro(Text intro) {
this.intro = intro;
}
public Blob getPhoto() {
return photo;
}
public void setPhoto(Blob photo) {
this.photo = photo;
}
//添加main方法可以对相关方法进行“白盒测试”
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
//将一些实现功能的方法以接口的形式封装在一个包中
package net.csdn.hr.user.dao;
import net.csdn.hr.user.bean.User;
/**
*
* @author对User实体Bean操作的封装接口
*
*/
publicinterface UserDao {
/**
*
* @param u
* @return向实体Bean中插入数据
*/
publicvoid insert(User u);
/**
*
* @param u
* @return根据u从实体Bean中删除数据
*/
publicvoid delete(Integer u);
/**
*
* @param u
* @return更新实体Bean中的数据
*/
publicvoid update(User u);
/**
*
* @param u
* @return根据u查询实体Bean中的数据
*/
publicvoid select(Integer u);
}
////将具体功能的实现以继承该接口类的方式放在另一个包中
packagenet.csdn.hr.user.impl;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import net.csdn.hr.user.bean.User;
import net.csdn.hr.user.dao.UserDao;
import net.csnd.hr.user.util.JDBCUserUtil;
public class UserDaoImpl implementsUserDao{
/**
* 定义数据库操作对象
*/
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
public static void main(String[] args) {
//调用相应的方法进行白盒测试
// 调用插入的方法
/* UserDaoImpl udi = new UserDaoImpl();
User u =new User(1,"Java",Date.valueOf("1991-10-13"),null,null);
udi.insert(u);
*/
/* 调用删除的方法
* UserDaoImpl udi = new UserDaoImpl();
* User u =new User(1,"Java",Date.valueOf("1991-10-13"),null,null);
User u =new User();
udi.delete(u.getId());
*/
// 调用修改的方法
/* UserDaoImpl udi = new UserDaoImpl();
User u =newUser(2,"MySQL",Date.valueOf("1992-10-13"),null,null);
udi.update(u);*/
// 调用查找的方法
UserDaoImpl udi = new UserDaoImpl();
User u =newUser(2,"MySQL",Date.valueOf("1992-10-13"),null,null);
udi.select(u.getId());
}
@Override
//向user表中插入数据
publicvoid insert(User u) {
//获取连接
con= JDBCUserUtil.getConnection();
//创建sql执行语句
Stringsql = "insert into user(id,name,birthday,intro,photo)values(?,?,?,?,?)";
try{
//创建语句对象
ps= con.prepareStatement(sql);
//为预处理语句赋值
ps.setInt(1,u.getId());
// ps.setInt(1,1);
ps.setString(2,u.getName());
// ps.setString(2,"java");
ps.setDate(3,u.getBirthday());
//ps.setDate(3,Date.valueOf("1990-10-10"));
//创建一个文本文件
Fileft = new File("src/net/csdn/hr/user/bean/User.java");
//创建一个带缓冲的文件输入流对象
BufferedReaderbr =new BufferedReader(new FileReader(ft));
//为Text类型的大数据赋值
ps.setCharacterStream(4,br,ft.length());
//创建一个图片文件对象
Filefi =new File("src/3.jpg");
//创建一个图片输入流对象
FileInputStreamfis = new FileInputStream(fi);
//为图片Blob类型的图片数据赋值
ps.setBinaryStream(5, fis, fi.length());
//执行插入语句
ps.executeUpdate();
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放资源
JDBCUserUtil.releaseConnection(con,ps, rs);
}
}
@Override
//根据u.getId()删除相应的记录
publicvoid delete(Integer u) {
//获取连接
con= JDBCUserUtil.getConnection();
//创建sql执行语句
Stringsql = "delete from user where id =?";
try{
//创建语句对象
ps= con.prepareStatement(sql);
//为预处理语句赋值
ps.setInt(1,u);
//执行插入语句
ps.executeUpdate();
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放资源
JDBCUserUtil.releaseConnection(con,ps, rs);
}
}
@Override
//修改相应的记录
publicvoid update(User u) {
//获取连接
con= JDBCUserUtil.getConnection();
//创建sql执行语句
Stringsql = "update user set id =?,name =?,birthday =?,intro =?,photo=? ";
try{
//创建语句对象
ps= con.prepareStatement(sql);
//为预处理语句赋值
ps.setInt(1,u.getId());
ps.setString(2,u.getName());
ps.setDate(3,u.getBirthday());
//创建一个文本文件
Fileft = new File("src/net/csdn/hr/user/dao/UserDao.java");
//创建一个带缓冲的文件输入流对象
BufferedReaderbr =new BufferedReader(new FileReader(ft));
//为Text类型的大数据赋值
ps.setCharacterStream(4,br,ft.length());
//创建一个图片文件对象
Filefi =new File("src/4.jpg");
//创建一个图片输入流对象
FileInputStreamfis = new FileInputStream(fi);
//为图片Blob类型的图片数据赋值
ps.setBinaryStream(5, fis, fi.length());
//执行插入语句
ps.executeUpdate();
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放资源
JDBCUserUtil.releaseConnection(con,ps, rs);
}
}
@Override
//根据u.getId()查询相应的记录
publicvoid select(Integer u) {
//获取连接
con= JDBCUserUtil.getConnection();
//创建sql执行语句
Stringsql = "select id,name,birthday,intro,photo from user where id = ?";
try{
//创建语句对象
ps= con.prepareStatement(sql);
//为所要查询的Text类型的大数据id赋值
ps.setInt(1, u);
//执行插入语句
rs = ps.executeQuery();
while(rs.next()){
//从数据库中获取id,姓名,出生日期的值
int id = rs.getInt("id");
String name = rs.getString("name");
Date birthday=rs.getDate("birthday");
//获取文本输入流
Readerr = rs.getCharacterStream("intro");
//将文本输入流包装成带缓冲的输入流
BufferedReader br = new BufferedReader(r);
String line =null;
//输出对应的从数据库中获取的文本文件的值
while((line = br.readLine())!=null){
System.out.println(line);
}
//输出对应的从数据库中获取id,姓名,出生日期的值
System.out.println("id =\t"+id+"name=\t"+name+"birthday =\t"+birthday);
//获取图片输入流
InputStream inStream =rs.getBinaryStream("photo");
//获取图片输出流
FileOutputStream fos = newFileOutputStream("src/4-1.jpg");
//定义字节数组缓冲区
byte[] buffer = new byte[1024];
int count;
//先向缓冲区中读入数据再从缓冲区中获取数据
while((count=inStream.read(buffer,0,1024))!=-1){
fos.write(buffer,0, count);
}
}
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
//释放资源
JDBCUserUtil.releaseConnection(con,ps, rs);
}
}
}
//将一些重复性使用的对象、方法作为工具封装在一个单独的包中
package net.csnd.hr.user.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.Properties;
/**
* @category 实现对数据库的操作对象Connection con 的封装
* @author lihh
*
*/
public classJDBCUserUtil {
//声明数据库的连接对象
private static Connection con = null;
/**
* 为配置文件设置静态属性
*/
private static String driver;
private static String url;
private staticString user;
private static String password;
/**
*在静态初始化快中从配置文件中获取各参数的值
*/
static{
//获取配置文件的输入流
InputStream inStream =JDBCUserUtil.class.getClassLoader().getResourceAsStream("property.properties");
//创建属性文件对象
Properties p = new Properties();
try {
//加载流
p.load(inStream);
//获取流中的内容
driver= p.getProperty("driver");
url= p.getProperty("url");
user= p.getProperty("user");
password= p.getProperty("password");
//加载驱动
JDBCUserUtil.class.forName(driver);
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*获取连接对象con的方法getConnection()
*/
public static Connection getConnection(){
try {
//创建连接
con= DriverManager.getConnection(url,user,password);
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/**
*关闭连接对象con,st,rs的方法releaseConnection()
*/
public static void releaseConnection(Connection con,Statementst,ResultSet rs){
//判断关闭con、st、rs的条件依次关闭流
if(con!=null){
try {
con.close();
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
}
}
//最后,如果想把项目做成图形化界面的形式可以把想应的类也单独封装在一个包中
package net.csdn.hr.user.gui;
publicclass UserGUI {
…….略
publicstaticvoid main(String [] args){
……略
}
}
综上,当我们对Java编程有了一定的感知力后,我们便应该去自觉的使自己的程序变得更加的严谨、更加的有层次、更加的易于管理,使我们的程序开发更具有规范性。