不使用框架的JavaWeb
开发工具:MyEclipse、MySql
jar架包:mysql-connector-java-5.1.26-bin.jar
介绍:javaweb的学习,在JavaWeb开发中,开发层次分为三层:表示层、业务逻辑层、数据访问层。每一层可分别对应不同层次的包。在不使用框架技术时的,包分为DB层(连接数据库)、Dao层(对数据库的操作)、Service层(业务逻辑层)、以及model层(实体类),而表示层表示展示给用户的界面,也就是前端页面。
功能实现:
1.第一步,使用传统的jdbc来访问数据库(DB层)
为了使用数据库方便,在jdbc层这单独写一个静态方法,返回值是Connection类。
代码如下:
public static Connection getConnection() throws ClassNotFoundException, SQLException{
//指定加载类
Class.forName("com.mysql.jdbc.Driver");
//获取数据库的连接,定义连接默认数据库。
//三个参数内容分别为连接的数据库地址,用户名、密码
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/laoxiang", "root","root");
}
=====================================================================================
2.第二步,Dao层(数据访问层)的实现
这里说一下关于数据库的操作,对数据库的操作分别为增删改查。在原本未做简化前的dao层的写法是不管是增删改查都要去执行或更新数据库。但假如在dao层类中,你有多个方法分别去操作数据库得到不同的结果,那么你会发现关于执行或更新数据库的语句都是重复一样的,所以我们会在dao层做一个公共类(baseDao类),来存放它的执行或更新数据库的语句,这样在做Dao层时,可以省去很多代码量,只要继承BaseDao或用调用类中方法的方式去获取它的执行或者更新方法。
未简化代码如下(方法其中之一):
//要查询的语句
String sql="sql语句";
//获取数据库的连接
Connection conn=DB.getConnection();
//获取编译好的sql语句
PreparedStatement ptmt = conn.prepareStatement(sql);
//假如sql语句中带有不明确的传参值如where name=?,可通过以下语句去指定它的值
//其中i代表它是第几个?,s代表它的值
ptmt.setObject(i, s);
//获取它的执行结果
ResultSet rs=ptmt.executeQuery();
//存放查询结果的实例类
ArrayList<Categorys> list=new ArrayList<Categorys>();
//通过循环获取执行之后的rs里的值,利用字段获取(也可以利用下标获取,但不建议这么做,原因是更改数据库结构后,代码可能获取不到相对应的值,代码可用性低)
while(rs.next()){
list.add(new Categorys(
rs.getInt("categoryID"),
rs.getString("category_name"),
rs.getString("category_desc")));
}
//每次操作完成后,都要关闭数据库的连接,否则多次执行后,连接数会出错。
conn.close();
return list;
--------------------------------------------------------------------------------------------------------------------------
简化后代码如下:
//Dao层提取的代码做的工具类
public class BaseDao { //方法内传参,传入数据库的连接、要执行的sql语句、可能带有的传参 //查询 //第一参数代表数据库的连接,第二参数代表sql语句,第三参数代表可能带有的传参
public ResultSet exeQuery(Connection conn, String sql, Object[] s) throws SQLException { PreparedStatement ptmt = conn.prepareStatement(sql); //在这里的判断是为了判断方法里是否有传过来的参数,如果不存在参数,不执行 if (s != null) { for (int i = 0; i < s.length; i++) { ptmt.setObject(i + 1, s[i]); } } //最后是执行sql返回在上面方法中ResultSet类数据
return ptmt.executeQuery(); } //更新 public void exeUpdaye(Connection conn, String sql, Object[] s) throws SQLException { PreparedStatement ptmt = conn.prepareStatement(sql); if (s != null) { for (int i = 0; i < s.length; i++) { ptmt.setObject(i + 1, s[i]); } } ptmt.executeUpdate(); } } //Dao层的简化
public class CategorysDao extends BaseDao{ public ArrayList<Categorys> selectCategorys() throws SQLException, ClassNotFoundException { String sql="sql语句"; Connection conn=DB.getConnection(); ResultSet rs=this.exeQuery(conn, sql, null); ArrayList<Categorys> list=new ArrayList<Categorys>(); while(rs.next()){ list.add(new Categorys( rs.getInt("categoryID"), rs.getString("category_name"), rs.getString("category_desc"))); } conn.close(); return list; } ===================================================================================== 3.service层(业务逻辑层)的实现 通过调用不同的Dao层方法可以实现各种不同的功能,如实现查询。但在项目中,我们可以在进行一次优化,如Dao方法中,每一个方法都有一个Connection类连接数据库的语句,我们可以把它放在service层中,这样的好处可以在你只需要连接一次数据库就可以操作多个对数据库的操作,在操作完成后再到service层关闭连接。 未简化代码如下: //实例化Dao层 CategorysDao dao = new CategorysDao(); //查询类别的方法
public ArrayList<Categorys> showCategorys() { ArrayList<Categorys> list = null; try { //获取Dao层操作结果 list = dao.selectCategorys(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } ===================================================================================== 4.关于分页查询(这一块还有点问题) 假如我们数据中有几百条数据要显示在页面中,但总不能一口气全部显示在一页中,所以在开发过程中,需要做一个关于分页的功能。但要分页查看数据的话,你得知道总页数、当前页、一页显示几条数据,还有上下页显示的数据,这些总不能交给自己来做,得交给程序。所以我们建立一个分页数据类来进行分页。 所以我们在类中定义四个属性,分别代表总页数、当前页、一页显示几条数据,还有上下页显示的数据。还得有它的上下页、首页等功能。 代码如下: //分页类 public class PageModel<T> { // 当前页 private int currentPage; // 总页数 private int totalPage; // 一页显示量 private int pageSize; // 一页显示数据存放 private ArrayList<T> list; //上一页 public int UpPage() { if (currentPage <= 1) { return 1; } return currentPage - 1; } // 下一页 public int downPage() { if (currentPage >= this.getTotalPage()) { return this.getTotalPage(); } return currentPage + 1; } // 总页数 public int getTotalPage() { return (totalPage + pageSize - 1) / pageSize; } //第一页 public int getFirstPage() {
return 1; } // 首页 public int getLastPage() { return this.getTotalPage(); } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public ArrayList<T> getList() { return list; } public void setList(ArrayList<T> list) { this.list = list; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } } //在Dao层类中,可做一个分页的数据操作方法,传入它的当前页和一页大小 public PageModel<Categorys> count(Connection conn, int currentPage, int pageSize) throws SQLException { //利用Mysql的自带语法去分页 String sql = "select * from Categorys limit ?,? "; //这里是为了获取上面数据库中从第几条到第几条的数据。如1到10条数据 Object[] prmde = { (currentPage - 1) * pageSize, pageSize }; ResultSet rs = this.exeQuery(conn, sql, prmde); ArrayList<Categorys> list = new ArrayList<Categorys>(); while (rs.next()) { list.add(new Categorys(rs.getInt("categoryID"),rs.getString("category_name"),rs.getString("category_desc"))); } //获取各个在上个分页类中的属性,存放到分页类中 String sql2 = "select count(*) from Categorys "; ResultSet rs2 = this.exeQuery(conn, sql2, null); int as = 0; if (rs2.next()) { as = rs2.getInt(1); } PageModel<Categorys> Model = new PageModel<Categorys>(); Model.setList(list); Model.setTotalPage(as); Model.setCurrentPage(currentPage); Model.setPageSize(pageSize); return Model; }
public class BaseDao { //方法内传参,传入数据库的连接、要执行的sql语句、可能带有的传参 //查询 //第一参数代表数据库的连接,第二参数代表sql语句,第三参数代表可能带有的传参
public ResultSet exeQuery(Connection conn, String sql, Object[] s) throws SQLException { PreparedStatement ptmt = conn.prepareStatement(sql); //在这里的判断是为了判断方法里是否有传过来的参数,如果不存在参数,不执行 if (s != null) { for (int i = 0; i < s.length; i++) { ptmt.setObject(i + 1, s[i]); } } //最后是执行sql返回在上面方法中ResultSet类数据
return ptmt.executeQuery(); } //更新 public void exeUpdaye(Connection conn, String sql, Object[] s) throws SQLException { PreparedStatement ptmt = conn.prepareStatement(sql); if (s != null) { for (int i = 0; i < s.length; i++) { ptmt.setObject(i + 1, s[i]); } } ptmt.executeUpdate(); } } //Dao层的简化
public class CategorysDao extends BaseDao{ public ArrayList<Categorys> selectCategorys() throws SQLException, ClassNotFoundException { String sql="sql语句"; Connection conn=DB.getConnection(); ResultSet rs=this.exeQuery(conn, sql, null); ArrayList<Categorys> list=new ArrayList<Categorys>(); while(rs.next()){ list.add(new Categorys( rs.getInt("categoryID"), rs.getString("category_name"), rs.getString("category_desc"))); } conn.close(); return list; } ===================================================================================== 3.service层(业务逻辑层)的实现 通过调用不同的Dao层方法可以实现各种不同的功能,如实现查询。但在项目中,我们可以在进行一次优化,如Dao方法中,每一个方法都有一个Connection类连接数据库的语句,我们可以把它放在service层中,这样的好处可以在你只需要连接一次数据库就可以操作多个对数据库的操作,在操作完成后再到service层关闭连接。 未简化代码如下: //实例化Dao层 CategorysDao dao = new CategorysDao(); //查询类别的方法
public ArrayList<Categorys> showCategorys() { ArrayList<Categorys> list = null; try { //获取Dao层操作结果 list = dao.selectCategorys(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } ===================================================================================== 4.关于分页查询(这一块还有点问题) 假如我们数据中有几百条数据要显示在页面中,但总不能一口气全部显示在一页中,所以在开发过程中,需要做一个关于分页的功能。但要分页查看数据的话,你得知道总页数、当前页、一页显示几条数据,还有上下页显示的数据,这些总不能交给自己来做,得交给程序。所以我们建立一个分页数据类来进行分页。 所以我们在类中定义四个属性,分别代表总页数、当前页、一页显示几条数据,还有上下页显示的数据。还得有它的上下页、首页等功能。 代码如下: //分页类 public class PageModel<T> { // 当前页 private int currentPage; // 总页数 private int totalPage; // 一页显示量 private int pageSize; // 一页显示数据存放 private ArrayList<T> list; //上一页 public int UpPage() { if (currentPage <= 1) { return 1; } return currentPage - 1; } // 下一页 public int downPage() { if (currentPage >= this.getTotalPage()) { return this.getTotalPage(); } return currentPage + 1; } // 总页数 public int getTotalPage() { return (totalPage + pageSize - 1) / pageSize; } //第一页 public int getFirstPage() {
return 1; } // 首页 public int getLastPage() { return this.getTotalPage(); } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public ArrayList<T> getList() { return list; } public void setList(ArrayList<T> list) { this.list = list; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } } //在Dao层类中,可做一个分页的数据操作方法,传入它的当前页和一页大小 public PageModel<Categorys> count(Connection conn, int currentPage, int pageSize) throws SQLException { //利用Mysql的自带语法去分页 String sql = "select * from Categorys limit ?,? "; //这里是为了获取上面数据库中从第几条到第几条的数据。如1到10条数据 Object[] prmde = { (currentPage - 1) * pageSize, pageSize }; ResultSet rs = this.exeQuery(conn, sql, prmde); ArrayList<Categorys> list = new ArrayList<Categorys>(); while (rs.next()) { list.add(new Categorys(rs.getInt("categoryID"),rs.getString("category_name"),rs.getString("category_desc"))); } //获取各个在上个分页类中的属性,存放到分页类中 String sql2 = "select count(*) from Categorys "; ResultSet rs2 = this.exeQuery(conn, sql2, null); int as = 0; if (rs2.next()) { as = rs2.getInt(1); } PageModel<Categorys> Model = new PageModel<Categorys>(); Model.setList(list); Model.setTotalPage(as); Model.setCurrentPage(currentPage); Model.setPageSize(pageSize); return Model; }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了