DBUtils和完善商城页面
DBUtils:
就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。
DBUtils核心功能介绍:
QueryRunner中提供对sql语句操作的API。
ResultSetHandler接口,用于定义select操作后,怎样封装结果集。
DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法。
QueryRunner:
update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作.
ResultSetHandler:
ArrayHandler |
将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值 |
ArrayListHandler |
将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。 |
BeanHandler |
将结果集中第一条记录封装到一个指定的javaBean中。 |
BeanListHandler |
将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中 |
ColumnListHandler |
将结果集中指定的列的字段值,封装到一个List集合中 |
ScalarHandler |
它是用于单数据。例如select count(*) from 表操作。 |
MapHandler |
将结果集第一行封装到Map<String,Object>集合中,Key 列名, Value 该列数据 |
MapListHandler |
将结果集每一行封装到List<Map<String,Object>>集合中,Key 列名, Value 该列数据,Map集合存储到List集合 |
JavaBean就是一个类,在开发中常用封装数据。
ArrayHandler:将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
ArrayListHandler:将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
BeanHandler :将结果集中第一条记录封装到一个指定的javaBean中。
BeanListHandler :将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合
ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
package com.oracle.dao; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.taglibs.standard.lang.jstl.test.Bean1; import com.oracle.domain.Sort; import com.oracle.tools.JDBCUtils; import com.oracle.tools.MyDBUtils; public class SortDao { //新增分类 public void add() throws SQLException{ //获取链接对象 Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="insert into sort(sname,sdesc) values(?,?)"; int row=qr.update(conn,sql,"手机","iphone12"); System.out.println(row); } //删除分类 public void delete() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="delete from sort where sid=?"; int row=qr.update(conn,sql,21); System.out.println(row); } //ArrayHandker public void get1() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="select * from sort"; Object obj[]=qr.query(conn,sql,new ArrayHandler()); //遍历 for(Object ob:obj){ System.out.println(ob); } } //ArrayListHandler public void get2() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="select * from sort"; List<Object[]> list=qr.query(conn,sql,new ArrayListHandler()); //遍历 for(Object obj:list){ System.out.print(obj+""); } System.out.println(); } //BeanHandler public void get3() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="select * from sort"; Sort sort=qr.query(conn,sql,new BeanHandler<Sort>(Sort.class)); System.out.println(sort); } //BeanListHandler public void get4() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="select * from sort"; List<Sort> list=qr.query(conn,sql,new BeanListHandler<Sort>(Sort.class)); System.out.println(list); } //ColumnListHandler public void get5() throws SQLException{ Connection conn=JDBCUtils.getConn(); //创建QueryRunner对象 QueryRunner qr=new QueryRunner(); String sql="select sname from sort"; List<String> list=qr.query(conn,sql,new ColumnListHandler<String>()); System.out.println(list); } //ScalarHandler public void get6() throws SQLException{ //创建QueryRunner对象 QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource()); String sql="select count(*) from sort where sid=?"; Long count=qr.query(sql,new ScalarHandler<Long>(),3); int c=count.intValue(); System.out.println(c); } }
连接池技术:
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。
需要先导入2个jar包。
package com.oracle.tools; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class MyDBUtils { public static final String DRIVER = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/demo0803?characterEncoding=utf8"; public static final String USERNAME = "root"; public static final String PASSWORD = "123456"; /* * 创建连接池BasicDataSource */ public static BasicDataSource dataSource = new BasicDataSource(); //静态代码块 static { //对连接池对象 进行基本的配置 dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动 dataSource.setUrl(URL); //指定要连接的数据库地址 dataSource.setUsername(USERNAME); //指定要连接数据的用户名 dataSource.setPassword(PASSWORD); //指定要连接数据的密码 } /* * 返回连接池对象 */ public static DataSource getDataSource(){ return dataSource; } //获取连接对象 public static Connection getConn(){ Connection conn=null; try { conn=dataSource.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } }
作用:自身维护了多个Connection连接对象维护
BasicDataSource类 是 DataSource接口的实现类
DataSource接口,它是java与每种数据库连接池 连接的规范标准
DBCP连接池常见的配置:
必须项 |
driverClassName |
数据库驱动名称 |
url |
数据库的地址 |
|
username |
用户名 |
|
password |
密码 |
|
基本项 |
maxActive |
最大连接数量 |
initialSize |
连接池中初始化多少个Connection连接对象 |
|
扩展项 |
maxWait |
超时等待时间以毫秒为单位 1000等于1秒 |
完善商城页面功能:
package com.oracle.tools; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class MyDBUtils { public static final String DRIVER = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/store_v1.0?characterEncoding=utf8"; public static final String USERNAME = "root"; public static final String PASSWORD = "123456"; /* * 创建连接池BasicDataSource */ public static BasicDataSource dataSource = new BasicDataSource(); //静态代码块 static { //对连接池对象 进行基本的配置 dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动 dataSource.setUrl(URL); //指定要连接的数据库地址 dataSource.setUsername(USERNAME); //指定要连接数据的用户名 dataSource.setPassword(PASSWORD); //指定要连接数据的密码 } /* * 返回连接池对象 */ public static DataSource getDataSource(){ return dataSource; } //获取连接对象 public static Connection getConn(){ Connection conn=null; try { conn=dataSource.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } }
先找到head.jsp:
超链接访问的应该是Servlet,项目名+Servlet.
<li class="active"><a href="${pageContext.request.contextPath }/ProductListServlet">手机数码<span class="sr-only">(current)</span></a></li>
写导层:
建立实体类:
package com.oracle.domain; import java.util.Date; public class Product { private String pid; private String pname; private Double market_price; private Double shop_price; private String pimage; private Date pdate; private Integer is_hot; private String pdesc; private Integer pflag; private String cid; public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Double getMarket_price() { return market_price; } public void setMarket_price(Double market_price) { this.market_price = market_price; } public Double getShop_price() { return shop_price; } public void setShop_price(Double shop_price) { this.shop_price = shop_price; } public String getPimage() { return pimage; } public void setPimage(String pimage) { this.pimage = pimage; } public Date getPdate() { return pdate; } public void setPdate(Date pdate) { this.pdate = pdate; } public Integer getIs_hot() { return is_hot; } public void setIs_hot(Integer is_hot) { this.is_hot = is_hot; } public String getPdesc() { return pdesc; } public void setPdesc(String pdesc) { this.pdesc = pdesc; } public Integer getPflag() { return pflag; } public void setPflag(Integer pflag) { this.pflag = pflag; } public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } @Override public String toString() { return "Product [pid=" + pid + ", pname=" + pname + ", market_price=" + market_price + ", shop_price=" + shop_price + ", pimage=" + pimage + ", pdate=" + pdate + ", is_hot=" + is_hot + ", pdesc=" + pdesc + ", pflag=" + pflag + ", cid=" + cid + "]"; } }
public class ProductDao { //查询所有商品 public List<Product> getProduct() throws SQLException{ QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource()); String sql="select * from product"; List<Product> list=qr.query(sql,new BeanListHandler<Product>(Product.class)); return list; } }
再写service层
package com.oracle.service; import java.sql.SQLException; import java.util.List; import com.oracle.dao.ProductDao; import com.oracle.domain.Product; public class ProductService { ProductDao productDao=new ProductDao(); public List<Product> getProduct(){ List<Product> list=null; try { list=productDao.getProduct(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } }
在来servlet层:
package com.oracle.web.product; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.oracle.domain.Product; import com.oracle.service.ProductService; public class ProductListServlet extends HttpServlet { ProductService productService=new ProductService(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取所有商品 List<Product> list=productService.getProduct(); //放到request域中 request.setAttribute("ProductList",list); //请求转发 request.getRequestDispatcher("/product_list.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在来到product_list.jsp
<c:forEach items="${ProductList }" var="pro"> <div class="col-md-2" style="height:250px"> <a href="product_info.htm"> <img src="${pro.pimage }" width="170" height="170" style="display: inline-block;"> </a> <p> <a href="product_info.html" style='color: green'>${pro.pname }</a> </p> <p> <font color="#FF0000">商城价:¥${pro.market_price }</font> </p> </div> </c:forEach>
将内容遍历。