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>.
Statement、PreparedStatement、CallableStatement对象访问数据库的使用:
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页面-------------------->>>>>>>>>>>>