java:jdbc+servlet+jsp+mysql
Posted Xiao_野猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java:jdbc+servlet+jsp+mysql相关的知识,希望对你有一定的参考价值。
先在mysql新增数据库和表先,把下面的几句代码复制去到mysql运行就可以创建成功了!
创建数据库
create database jdbc01 character set utf8 collate utf8_general_ci;
创建表:
use jdbc01;
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date,
sex boolean
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
运行的效果:
一、创建MVC架构的Web项目
与mysql 需要的包是
项目所需要的包 |
|||
序号 |
包名 |
描述 |
所属层次 |
1 |
zhu.jdbc.domain |
相当于数据库的某张表 (只包含简单的属性以及属性对应的get和set方法,不包含具体的业务处理方法),提供给【数据访问层】、【业务处理层】、【Web层】来使用 |
domain(域模型)层 |
2 |
zhu.jdbc.dao |
存放访问数据库的操作接口类 |
数据访问层 |
3 |
zhu.jdbc.dao.imp |
存放访问数据库的操作接口的实现类 |
|
4 |
zhu.jdbc.service |
存放处理系统业务接口类 |
业务处理层 |
5 |
zhu.jdbc.service.imp |
存放处理系统业务接口的实现类 |
|
6 |
zhu.jdbc.command |
相当于数据库命令的 增删查改 |
相当于三层架构的(DB层) |
7 |
zhu.jdbc.unit |
存放系统的通用工具类,提供给【数据访问层】、【业务处理层】、【DB层】来使用 |
|
8 |
zhu.jdbc.servlet |
|
Web层(相当于界面层) |
创建好的项目如下图(图-1)所示:
图-1
二、代码的编写
1. zhu.jdbc.unit的包编写
在zhu.jdbc.unit包下创建一个UnitMysql的类(这个类是建立与mysql的链接)
UnitMysql代码如下:
1 package zhu.jdbc.unit; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 public class UnitMysql { 10 public static final String URL="jdbc:mysql://localhost:3306/jdbc01";//链接的mysql 11 public static final String NAME = "root"; 12 public static final String PASSWORD = "root"; 13 public static final String DREIVER = "com.mysql.jdbc.Driver"; 14 15 16 static { 17 try { 18 //加载驱动器 19 Class.forName(DREIVER); 20 21 /*//还有另一种方法,但是会加载驱动二次,通常不使用该方法 22 try { 23 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }*/ 27 } catch (ClassNotFoundException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 public static Connection getConnection() { 33 try { 34 return DriverManager.getConnection(URL, NAME, PASSWORD);//创建与数据库的链接 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 return null; 39 } 40 //设置一个公共的关闭链接、释放资源的方法 . 因为每次只要进行了增,删,查,改 之后 都必须要关闭事件, 那么就设置一个公共的方法 41 //而关闭资源要从 ResultSet先关闭-->,再到 PreparedStatement-->,最后到 Connection关闭 42 public static void Close(ResultSet rs, PreparedStatement ps, Connection conn) { 43 if (rs != null) { 44 try { 45 rs.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 51 if (ps != null) { 52 try { 53 ps.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 if (conn != null) { 60 try { 61 conn.close(); 62 } catch (SQLException e) { 63 e.printStackTrace(); 64 } 65 } 66 } 67 }
2. 相当于三层架构的(DB层)
在zhu.jdbc.command包下创建一个IDaoCommand的类(这个类是建立与mysql的链接)
IDaoCommand代码如下:
1 package zhu.jdbc.command; 2 3 import java.util.List; 4 5 public interface IDaoCommand<T> { 6 //查询所有的数据 7 public List<T> queryAllData(); 8 //新增数据 9 public int insertData(T t); 10 //修改数据 11 public int update(T t); 12 //删除数据 13 public int delete(int id); 14 //查询一条数据通过ID 15 public T queryDataById(int id); 16 }
3. domain(域模型)层
在zhu.jdbc.domain 包下创建一个Tb_User 类
Tb_User 代码如下:
1 package zhu.jdbc.domain; 2 3 import java.sql.Date; 4 //这里相当于数据库的某张表 5 public class Tb_User { 6 private int id; 7 private String name; 8 private String password; 9 private String email; 10 private Date birthday; 11 private boolean sex; 12 13 public boolean isSex() { 14 return sex; 15 } 16 public void setSex(boolean sex) { 17 this.sex = sex; 18 } 19 public int getId() { 20 return id; 21 } 22 public void setId(int id) { 23 this.id = id; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public String getPassword() { 32 return password; 33 } 34 public void setPassword(String password) { 35 this.password = password; 36 } 37 public String getEmail() { 38 return email; 39 } 40 public void setEmail(String email) { 41 this.email = email; 42 } 43 public Date getBirthday() { 44 return birthday; 45 } 46 public void setBirthday(Date birthday) { 47 this.birthday = birthday; 48 } 49 }
4.开发数据访问层(dao、dao.impl)
2.1: dao 继承 command的命令
在zhu.jdbc.dao包下创建一个ITb_User接口类,对于开发接口类,我习惯以字母I作类的前缀.
ITb_User代码如下:
1 package zhu.jdbc.dao; 2 3 import zhu.jdbc.command.IDaoCommand; 4 import zhu.jdbc.domain.Tb_User; 5 6 /** 7 * 这里这个类 是为了 ,后续 添加自己需要的方法. 如:模糊查询, 分页查询.... 8 * 这个必须要继承ICommand类,那样就可以调用增删查改的方法了 9 * @author Xiao_Zhu 10 * 11 */ 12 public interface ITb_User extends IDaoCommand<Tb_User> { 13 //自己需要的方法 14 }
2.2: dao.ImpI 实现 dao
在zhu.jdbc.dao.imp包下创建一个ITb_UserImpI类
ITb_UserImpI代码如下:
1 package zhu.jdbc.dao.imp; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 7 import java.sql.SQLException; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import zhu.jdbc.dao.ITb_User; 12 import zhu.jdbc.domain.Tb_User; 13 import zhu.jdbc.unit.UnitMysql; 14 15 /** 16 * 实现 ITb_User类 17 * 18 * @author Xiao_Zhu 19 * 20 */ 21 public class ITb_UserImpI implements ITb_User { 22 public Connection conn1 = null; 23 public ResultSet rs = null; 24 public PreparedStatement ps = null; 25 26 // 查询所有的数据 27 @Override 28 public List<Tb_User> queryAllData() { 29 conn1 = UnitMysql.getConnection();// 链接数据库 30 List<Tb_User> list = new ArrayList<Tb_User>(); 31 try { 32 String sqlSelect = "select * from users "; // 查询多条数据 33 ps = conn1.prepareStatement(sqlSelect); 34 rs = ps.executeQuery(); 35 Tb_User user = null; 36 while (rs.next()) { 37 user = new Tb_User(); 38 user.setId(rs.getInt("id")); 39 user.setName(rs.getString("name")); 40 user.setPassword(rs.getString("password")); 41 user.setBirthday(rs.getDate("birthday")); 42 user.setSex(rs.getBoolean("sex")); 43 list.add(user); 44 } 45 } catch (SQLException e) { 46 e.printStackTrace(); 47 } finally { 48 UnitMysql.Close(rs, ps, conn1); 49 } 50 return list; 51 } 52 53 // 新增 54 @Override 55 public int insertData(Tb_User t) { 56 conn1 = UnitMysql.getConnection(); 57 int i = 0; 58 try { 59 String sqlInsert = "insert into users(name,password,email,birthday,sex) values(?,?,?,?,?) ;"; 60 ps = conn1.prepareStatement(sqlInsert, 61 PreparedStatement.RETURN_GENERATED_KEYS); 62 // 这里的1,2..必须要按上面的新增的顺序来定义 63 ps.setString(1, t.getName()); 64 ps.setString(2, t.getPassword()); 65 ps.setString(3, t.getEmail()); 66 ps.setDate(4, new java.sql.Date(t.getBirthday().getTime())); 67 ps.setBoolean(5, t.isSex()); 68 ps.executeUpdate(); 69 rs = ps.getGeneratedKeys();// 得到 最新的 ID 70 if (rs.next()) {// 是否存在 71 i = rs.getInt(1); 72 } 73 } catch (SQLException e) { 74 e.printStackTrace(); 75 } finally { 76 UnitMysql.Close(rs, ps, conn1); 77 } 78 return i; 79 } 80 81 // 修改 82 @Override 83 public int update(Tb_User t) { 84 conn1 = UnitMysql.getConnection(); 85 int i = 0; 86 try { 87 String sqlUpdate = "update users set name=?, password =? ,sex=? where id=?"; 88 ps = conn1.prepareStatement(sqlUpdate); 89 ps.setString(1, t.getName()); 90 ps.setString(2, t.getPassword()); 91 ps.setBoolean(3, t.isSex()); 92 ps.setInt(4, t.getId()); 93 i = ps.executeUpdate(); 94 } catch (SQLException e) { 95 e.printStackTrace(); 96 } finally { 97 UnitMysql.Close(null, ps, conn1); 98 } 99 return i; 100 } 101 102 // 删除 103 @Override 104 public int delete(int id) { 105 conn1 = UnitMysql.getConnection(); 106 int i = 0; 107 try { 108 String sqlDelete = "delete from users where id=?"; 109 ps = conn1.prepareStatement(sqlDelete); 110 ps.setInt(1, id); 111 i = ps.executeUpdate(); 112 if (i == 1) { 113 return i; 114 } 115 } catch (SQLException e) { 116 e.printStackTrace(); 117 } finally { 118 UnitMysql.Close(null, ps, conn1); 119 } 120 return i; 121 } 122 123 // 查询一条数据通过ID 124 @Override 125 public Tb_User queryDataById(int id) { 126 conn1 = UnitMysql.getConnection(); 127 String sql = "select * from users where id=?"; 128 Tb_User user = null; 129 if (id > 0) { 130 try { 131 ps = conn1.prepareStatement(sql); 132 ps.setInt(1, id); 133 rs = ps.executeQuery(); 134 if (rs.next()) { 135 user = new Tb_User(); 136 user.setId(rs.getInt("id")); 137 user.setName(rs.getString("name")); 138 user.setPassword(rs.getString("password")); 139 user.setBirthday(rs.getDate("birthday")); 140 user.setSex(rs.getBoolean("sex")); 141 142 } 143 } catch (SQLException e) { 144 e.printStackTrace(); 145 } finally { 146 UnitMysql.Close(null, ps, conn1); 147 } 148 } 149 return user; 150 } 151 152 }
5. 业务处理层(service,service.imp)
- .service层
在zhu.jdbc.service包下创建一个ITb_UserService 类
ITb_UserService 如下:
1 package zhu.jdbc.service; 2 3 import zhu.jdbc.command.IServiceCommand; 4 import zhu.jdbc.domain.Tb_User; 5 6 7 public interface ITb_UserService extends IServiceCommand<Tb_User> { 8 //这里与dao层的中的ITb_User.java是一样的意思 9 }
1.1 这里继承的 IServiceCommand 类是在zhu.jdbc.command下 创建一个IServiceCommand的类
代码IServiceCommand 如下:
1 package zhu.jdbc.command; 2 3 import java.util.List; 4 5 6 public interface IServiceCommand<T> { 7 //查询所有的数据 8 public List<T> queryAllData(); 9 //新增数据 10 public boolean insertData(T t); 11 //修改数据 12 public boolean update(T t); 13 //删除数据 14 public boolean delete(int id); 15 //查询一条数据通过ID 16 public T queryDataById(int id); 17 }
2. service.imp层
//这里的 service层要想与 dao层(BAL层逻辑层)建立联系那么必须要 创建 dao层的对象
在zhu.jdbc.service.imp包下创建一个ITb_UserServiceImpI 类
ITb_UserServiceImpI 代码如下:
1 package zhu.jdbc.service.imp; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.util.List; 7 8 import zhu.jdbc.dao.ITb_User; 9 import zhu.jdbc.dao.imp.ITb_UserImpI; 10 import zhu.jdbc.domain.Tb_User; 11 import zhu.jdbc.service.ITb_UserService; 12 /** 13 * 链接与dao层的链接 14 * @author Xiao_Zhu 15 * 16 */ 17 public以上是关于java:jdbc+servlet+jsp+mysql的主要内容,如果未能解决你的问题,请参考以下文章
Java项目:酒店预定管理系统(java+JDBC+jsp+servlet+Mysql)
Java项目:酒店预定管理系统(java+JDBC+jsp+servlet+Mysql)
Java项目:酒店预定管理系统(java+JDBC+jsp+servlet+Mysql)