javaweb实验之PreparedStatement,c3p0与DBUtiles的使用
本次实验用到的Jar包与插件:
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9100</port>
</configuration>
</plugin>
</plugins>
</build>
resources下的db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/shop2?useUnicode=true&charcterEncoding=utf8&useSSL=false
username=root
password=myPasspwrod
1.用PreparedStatement方式实现用户注册功能
1.1addServlet代码部分
@WebServlet("/addServlet")
public class addServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("test/html;charset=UTF-8");
Connection conn=null ;
ResultSet rs=null ;
PreparedStatement ps=null ;
PrintWriter writer = response.getWriter();
//获取登录页面提交的数据
String loginName = request.getParameter("userName");
String loginPassword = request.getParameter("password");
String sex = request.getParameter("sex");
//sql语句
String addSql= "insert into tb_user(username, password,gender) values (?,?,?)";
// String loginSql = "select * from tb_user where username =? and password=?";
try {
//获取与数据库的链接
conn = jdbcUtils.getConnaction();
ps = conn.prepareStatement(addSql);
ps.setString(1, loginName);
ps.setString(2, loginPassword);
ps.setString(3, sex);
int i = ps.executeUpdate();
if(i!=0){
writer.write("注册成功");
}else {
writer.write("注册失败");
}
writer.flush();
writer.close();
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtils.release(conn,ps,rs);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
1.2 add.html代码部分
1.3jdbcUtils代码
public class jdbcUtils {
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
static {
try{
InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//驱动只用加载一次
Class.forName(driver);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getConnaction() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
public static void release(Connection conn, PreparedStatement stat, ResultSet rs) {
if(rs!=null){
try{
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat!=null){
try{
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
1.4tb_user表
1.5测试部分
在add.html页面输入姓名 lxlxllx,密码 123,性别 女,提交后提示注册成功
打开tb_user表发现注册信息存入,测试成功!
2.用c3p0数据源实现用户登入功能
2.1preparedStatementlogin代码
@WebServlet("/preparedStatementDemo")
public class preparedStatementlogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("test/html;charset=UTF-8");
Connection conn=null ;
ResultSet rs=null ;
PreparedStatement ps=null ;
//获取登录页面提交的数据
String loginName = request.getParameter("userName");
String loginPassword = request.getParameter("password");
String remember = request.getParameter("remember");
//sql语句
String loginSql = "select * from tb_user where username =? and password=?";
try {
//获取与数据库的链接
conn = c3p0Utils.getDataSource().getConnection();
ps = conn.prepareStatement(loginSql);
ps.setString(1, loginName);
ps.setString(2, loginPassword);
rs = ps.executeQuery();
HttpSession session = request.getSession();
String contextPath = request.getContextPath();
if (rs.next()) {
if("1".equals(remember)) {
session.setAttribute("password", loginPassword);
session.setAttribute("userName", loginName);
}
response.sendRedirect(contextPath+"/welcome.html");
} else {
response.sendRedirect(contextPath+"/loginPrepared.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtils.release(conn,ps,rs);
}
}
2.2loginPrepared.jsp代码
2.3jdbcUtils代码同1.3,略
### 2.4c3p0Utils代码
public class c3p0Utils {
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
public static DataSource ds = null;
// 初始化C3P0数据库连接池
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
// 设置连接数据库需要的配置信息
try {
InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
cpds.setDriverClass(driver);
cpds.setJdbcUrl(url);
cpds.setUser(username);
cpds.setPassword(password);
//设置连接池的参数
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(15);
ds = cpds;
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static DataSource getDataSource() throws SQLException {
return ds;
}
public static void release(Connection conn, PreparedStatement stat, ResultSet rs) {
if(rs!=null){
try{
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat!=null){
try{
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try{
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.5tb_user信息
2.6测试
在登入页面输入姓名 小夏,密码 1237
提交后跳转到welcome.html页面
如果输入错误信息则重新加载页面,如:
提交后
测试成功!
3.用c3p0+DBUtiles实现用户注销功能
3.1 deleteServlet代码
@WebServlet("/deleteServlet")
public class deleteServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("test/html;charset=UTF-8");
String userName = request.getParameter("userName");
String password = request.getParameter("password");
Connection conn=null ;
try {
PrintWriter writer = response.getWriter();
QueryRunner queryRunner = new QueryRunner();
String deleteSql="delete from tb_user where username= ? and password= ?" ;
Object [] params = new Object[]{
userName, password};
conn=c3p0Utils.getDataSource().getConnection();
int i = queryRunner.update(conn, deleteSql, params);
if(i>0){
writer.write("用户注销成功");
}else{
writer.write("用户注销失败");
}
writer.flush();
writer.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
jdbcUtils.release(conn, null, null);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
3.2delete.html代码
3.3c3p0Utils代码同2.4,略
3.4tb_user表
3.5 测试
目标删除上图的id为169的用户,在delete.html输入姓名 鲜花,密码576
提交后页面显示
查看tb_user表,已成功删除数据
4.用c3p0+PreparedStatement实现用户修改密码功能
4.1updateServlet代码
@WebServlet("/preparedStatementDemo")
public class preparedStatementlogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("test/html;charset=UTF-8");
Connection conn=null ;
ResultSet rs=null ;
PreparedStatement ps=null ;
//获取登录页面提交的数据
String loginName = request.getParameter("userName");
String loginPassword = request.getParameter("password");
String remember = request.getParameter("remember");
//sql语句
String loginSql = "select * from tb_user where username =? and password=?";
try {
//获取与数据库的链接
conn = c3p0Utils.getDataSource().getConnection();
ps = conn.prepareStatement(loginSql);
ps.setString(1, loginName);
ps.setString(2, loginPassword);
rs = ps.executeQuery();
HttpSession session = request.getSession();
String contextPath = request.getContextPath();
if (rs.next()) {
if("1".equals(remember)) {
session.setAttribute("password", loginPassword);
session.setAttribute("userName", loginName);
}
response.sendRedirect(contextPath+"/welcome.html");
} else {
response.sendRedirect(contextPath+"/loginPrepared.jsp");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtils.release(conn,ps,rs);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
4.2update.html代码
4.3 tb_user表
4.4 c3p0Utils代码同2.4,略
4.5测试
在update.html页面输入姓名 小夏 密码 1223456
提交提示
查看tb_user表,密码修改成功