jsp连接SQL Server

jsp连接数据库环境配置及简单的增删改查


一、开发平台:eclipse + SqlServer2005

        语言:jsp + JavaBean


二、环境配置


添加jdbc驱动:

在eclipse首选项搜索jre,如图:

,

点击编辑:

点击添加外部JAR,把准备好的驱动导入,如下:

至此,环境配好了,下面进行数据库准备;


三、

数据库准备:新建Student数据库,在Student数据库新建Student表,Student表结构如下:

我们插入一些测试的数据,如下:



四、


下面在eclipse新建Dynamic Web Project,名称为:StudentTest

整个项目完成后的文件结构如下:

如上图:第一个红色的框框为JavaBean存放的位置,第二个为css和images,第三个为.jsp文件

知识点:

<1>. 包的命名习惯,一般采用个人网站的域名的反向,如com.baidu.tools;由于域名是唯一的,方便以后个人包的发布,不会和别人的发生冲突;

<2>. dao(Data Access Object)数据连接对象


五、


下面依次讲解各个JavaBean的实现及作用:

1. BaseDao.java,代码如下:

/** 
 * 日期:2013-5-2
 * 所在包名称:com.zmp.dao
 * 项目名称:studentTest
 * 类名称:BaseDao
 * 功能:本类通过jdbc实现数据库的链接和关闭
 */
package com.zmp.dao;

/** 包的导入,连接数据库用到里面的方法*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author zmp
 * @version 1.0.0
 */
public class BaseDao {
    final static String DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";                  //驱动
    final static String URL = "jdbc:microsoft:sqlserver://localhost:1433;DataBaseName=Student";   //URL,数据库名称
    final static String DBNAME = "sa";                                                            //DBMS名称
    final static String DBPASS = "123456";                                                        //DBMS密码
        
    /**
     * 本方法通过jdbc实现数据库连接,返回值为Connection类型
     * 由于引用这些方法可能会有异常抛出,所以引用连接数据库的方法被try-catch-finally包围,以便获取异常,进行修改检查;
     * @return Connection
     */
    public static Connection getConn() {   
    	try {
    		
    		//注册驱动
    		Class.forName(DRIVER);
    	} catch(ClassNotFoundException e) {
    		System.out.println("驱动注册异常!");
    		e.printStackTrace();
    	}
    	
    	//实例化Connection,调用的时候再实例化,这样节省资源
    	Connection conn = null;            
    	try {
    		
    		//连接数据库
    		conn = DriverManager.getConnection(URL, DBNAME, DBPASS);
    	} catch(SQLException e) {
    		System.out.println("连接数据库异常!");
    		e.printStackTrace();
    	}
    	return conn;
    }
        
    /**
     * 本方法实现关闭数据库连接.
     * jdbc连接数据库时,先获取connection,再通过statement进行操作,将结果集放在resultset中,
     * 不过在关闭数据库的时候要小心,要跟前面的操作反着来,不然就会出现异常。
     * @param conn 链接对象
     * @param pstmt 预处理对象
     * @param rs 结果集对象
     */
    public static void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {
    	if(rs != null) {
    		try {
    			
    			//关闭结果集
    			rs.close();
    		} catch(SQLException e) {
    			System.out.println("ResultSet关闭异常!");
    			e.printStackTrace();
    		}
    	}
    	if(pstmt != null) {
    		try{
    			
    			//关闭预处理
    			pstmt.close();
    		} catch(SQLException e) {
    			System.out.println("PreparedStatement关闭异常!");
    			e.printStackTrace();
    		}
    	}
    	if(conn != null) {
    		try {
    			
    			//关闭连接
    			conn.close();
    		} catch(SQLException e) {
    			System.out.println("Connection关闭异常!");
    			e.printStackTrace();
    		}
    	}
    }
    
    /**
     * 本方法实现执行sql语句,主要实现数据的增删改
     * 该方法十分有用,便于后面实体的增删改,不能查,好不好使,试试你就知道了;
     * 由于查询数据执行的方法是executeQuery();而增删改执行的是,executeUpdate()方法;
     * @param sql
     * @param getValue
     * @return int
     */
    public static int executeSQL(String sql, String[] getValue){
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = getConn();  
			pstmt = conn.prepareStatement(sql);
			if (getValue != null) {
				for (int i = 0; i < getValue.length; i++) {
					pstmt.setString(i+1, getValue[i]);
				}
			}
			
			//执行sql语句
			result = pstmt.executeUpdate(); 
		} catch(Exception e) {
			System.out.println("executeSQL方法异常");
			e.printStackTrace();
		} finally {
			closeAll(conn, pstmt, null);
		}
		return result;
	}
}

知识点:

<1>. 在try-catch-finally块中,不管是否有异常抛出,finally块中的内容总是会执行的!!!

<2>. PreparedStatement可以防止sql注入,所以,带有参数的select语句一定要用PreparedStatement.执行次数较多,比Statement执行速度要快,但是跟驱动和数据库都有关系;

<3>. 连接和关闭的顺序一定要正确!!!

<4>. 本实验中的大部分方法是public的,安全性不高,自己写的时候须注意!!!

<5>.数据库连接Connection资源非常稀有,应该最晚连接,尽早释放;

<6>.

StatementPreparedStatementCallableStatement对象访问数据库的使用:

Statement:

不能进行预编译,适用于仅执行一次查询并返回结果的情形.

PreparedStatement:

缺点:可以进行预编译,但是PreparedStatement对象被实际创建的时候,才给DBMS传递数据,需要DBMS在程序运行时才编译sql语句.

优点:

1.在执行可变参数的语句时,PreparedStatement的效率要高于Statement;

2.防止sql注入;

3.适合重复性的语句;

4.代码的可读性和可维护性;

CallableStatement:

PreparedStatement的接口扩展,用来调用存储过程,在执行jsp程序之前就将sql语句有DBMS编译好了,从而更节省了执行时间.


2.UserDao.java,代码如下:

/** 
 * 日期:2013-5-3
 * 包名称:com.zmp.dao
 * 项目名称:studentTest
 * 类名称:UserDao
 * 功能:User操作数据库接口,提高数据操作的安全性
 */
package com.zmp.dao;

import java.util.ArrayList;
import com.zmp.entity.User;

/**
 * User接口
 * @author zmp
 * @version 1.0.0
 */
public interface UserDao {	
	
	/**
	 * 通过用户ID找到对应的用户信息
	 * @param uId 用户Id
	 * @return User
	 */
	public User findUser(String uId); 	
	
	/**
	 * 增加用户
	 * @param user 对象
	 * @return int
	 */
	public int addUser(User user); 	
	
	/**
	 * 修改用户
	 * @param user 对象
	 * @return int
	 */
	public int updateUser(User user); 	
	
	/**
	 * 删除用户
	 * @param uId
	 * @return int
	 */
	public int deleteUser(String uId);		
	
	/**
	 * 列出所有用户
	 * @return ArrayList<User>
	 */
	public ArrayList<User> listUser();
}

知识点:

<1>

ArrayList的用法(对象数组,和Vector的最大区别就是:Vector是线程同步的):

因为其内部是数组的形式,占的是内存一块连续的区域,所以适合存储,查找,不利于任意位置插入和删除; 

User u3=new User("周云蓬","003");

ArrayList<User> u=new ArrayList<User>();

u.add(u1);

可定义以ArrayList为返回值的函数,在页面中新建ArrayList实例,利用函数得到数据.



LinkedList的用法:

因为其内部是链表的结构,所以插入(或删除)首个(或末尾)元素的时候用LinkedList,ArrayList好使.

LinkedList 对象名=new LinkedList();

主要方法:

Void addFirst(object o)

Void addLast(object o)

Object getFirst()

Object getLast()

Object removeFirst()

Object removeLast()



HashMap的用法:

因为其键值唯一,利于存储一些具有唯一性的数据.

一个映射不能包含重复的键,每个键最多只能映射一个值.并允许使用null值和null

Map 对象名=new HashMap()

用法如下:

Student s=new Student(20112859,”张敏鹏”);

Map sm=new HashMap();

sm.put(“100”,s);//键值必须是字符串类型,所以第一个参数须加上引号,并且键值唯一.

3.UserDaoImpl.java,代码如下:

/** 
 * 日期:2013-5-3
 * 包名称:com.zmp.dao.impl
 * 项目名称:studentTest
 * 类名称:UserDaoImpl
 * 功能:实现UserDao
 */
package com.zmp.dao.impl;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;

import com.zmp.dao.BaseDao;
import com.zmp.dao.UserDao;
import com.zmp.entity.User;

/**
 * @author zmp
 * @version 1.0.0
 */
public class UserDaoImpl extends BaseDao implements UserDao {
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;

	/**
	 * @see com.zmp.dao.UserDao#findUser(String)
	 */
	@Override
	public User findUser(String uId) {
		User user = null;
		String sql = "SELECT * FROM [Student] WHERE Sno = ?";
		try {
			conn = BaseDao.getConn();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, uId);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				user = new User();
				user.setSno(rs.getString("Sno"));
				user.setSname(rs.getString("Sname"));
				user.setSsex(rs.getString("Ssex"));
				user.setSage(rs.getString("Sage"));
				user.setSdept(rs.getString("Sdept"));
			}
		} catch(Exception e) {
			System.out.println("findUser方法异常!");
			e.printStackTrace();
		} finally {
			BaseDao.closeAll(conn, pstmt, rs);
		}
		return user;
	}

	/**
	 * @see com.zmp.dao.UserDao#addUser(com.zmp.entity.User)
	 */
	@Override
	public int addUser(User user) {
		String sql = "INSERT INTO Student VALUES (?, ?, ?, ?, ?)";
		String[] getValue = {user.getSno(), user.getSname(), user.getSsex(), 
				             user.getSage(), user.getSdept()};
		return BaseDao.executeSQL(sql, getValue);
	}

	/**
	 * @see com.zmp.dao.UserDao#updateUser(com.zmp.entity.User)
	 */
	@Override
	public int updateUser(User user) {
		String sql = "UPDATE [Student] SET Sname = ?, Ssex = ?, Sage = ?, Sdept = ? WHERE Sno = ?";
		String[] getValue = {user.getSname(), user.getSsex(), user.getSage(),
				             user.getSdept(), user.getSno()};
		return BaseDao.executeSQL(sql, getValue);
	}
	
	/**
	 * @see com.zmp.dao.UserDao#deleteUser(java.lang.String)
	 */
	public int deleteUser(String uId) {
		String sql = "DELETE FROM Student WHERE Sno = ?";
		String[] getValue = {uId};
		return BaseDao.executeSQL(sql, getValue);
	}

	/**
	 * @see com.zmp.dao.UserDao#listUser()
	 */
	@Override
	public ArrayList<User> listUser() {
		String sql = "SELECT * FROM [Student]";
		conn = BaseDao.getConn();
		try {
			pstmt=conn.prepareStatement(sql);
		} catch(SQLException e) {
			System.out.println("pstmt=conn.prepareStatement(sql)发生异常!");
			e.printStackTrace();
		}
		ArrayList<User> array = new ArrayList<User>();
		try {
			rs = pstmt.executeQuery();
		} catch(SQLException e) {
			System.out.println("pstmt.executeQuery(sql)发生异常!");
			e.printStackTrace();
		}
		try {
			while(rs.next()) {
				User user = new User();
				user.setSno(rs.getString("Sno"));
				user.setSname(rs.getString("Sname"));
				user.setSsex(rs.getString("Ssex"));
				user.setSage(rs.getString("Sage"));
				user.setSdept(rs.getString("Sdept"));
				array.add(user);
			}
		} catch(SQLException e) {
			System.out.println("rs.next()异常!");
			e.printStackTrace();
		} finally {
			BaseDao.closeAll(conn, pstmt, rs);
		}		
		return array;
	}
}


 

4.User.java,代码如下:

/** 
 * 日期:2013-5-3
 * 包名称:com.zmp.entity
 * 项目名称:studentTest
 * 类名称:User
 * 功能:建立User实体
 */
package com.zmp.entity;

/**
 * @author zmp
 * @version 1.0.0
 */
public class User {
	public String Sno;         //学号
	public String Sname;       //姓名
	public String Ssex;        //性别
	public String Sage;        //年龄
	public String Sdept;       //系别
	
	/**
	 * 返回 sno 
	 * @return String
	 */
	public String getSno() {
		return Sno;
	}
	
	/**
	 * 设置 sno 
	 * @param sno 
	 */
	public void setSno(String sno) {
		Sno = sno;
	}
	
	/**
	 * 返回 sname 
	 * @return String
	 */
	public String getSname() {
		return Sname;
	}
	
	/**
	 * 设置 sname 
	 * @param sname 
	 */
	public void setSname(String sname) {
		Sname = sname;
	}
	
	/**
	 * 返回 ssex 
	 * @return String
	 */
	public String getSsex() {
		return Ssex;
	}
	
	/**
	 * 设置 ssex 
	 * @param ssex 性别
	 */
	public void setSsex(String ssex) {
		Ssex = ssex;
	}
	
	/**
	 * 返回 sage 
	 * @return String
	 */
	public String getSage() {
		return Sage;
	}
	
	/**
	 * 设置 sage 
	 * @param sage 
	 */
	public void setSage(String sage) {
		Sage = sage;
	}
	
	/**
	 * 返回 sdept 
	 * @return String
	 */
	public String getSdept() {
		return Sdept;
	}
	
	/**
	 * 设置 sdept 
	 * @param sdept 
	 */
	public void setSdept(String sdept) {
		Sdept = sdept;
	}
}

Javabean已经建立完毕,下一节写jsp页面-------------------->>>>>>>>>>>> 生气

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值