首页 > 代码库 > servlet调用mysql中的数据

servlet调用mysql中的数据

给大家介绍一个servlet、jsp和mysql之间简单的相互转换(就是使用页面访问数据库),以数据库中table表格为例。

1、建立一个servlet,命名为Check,把数据库中数据掉取出来

          Connection con = Connect.get();//之前分装好类(上个博客说过)
		try {
			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery("select * from dvd1");//存放数据库中的数据
			ResultSetMetaData rm = rs.getMetaData();//获取数据库中字段的名称、字段的值和属性
			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//存放数据库中的数据
			while (rs.next()) {//一个遍历数据中的数据,直到字段对应的值为null为止
				Map<String, Object> m = new HashMap<String, Object>();//使用Map的键值对,来对数据库中的字段和字段对应的值进行存储
				for (int i = 1; i <= rm.getColumnCount(); i++) {//rm.getColumnCount()是字段的个数
					m.put(rm.getColumnName(i), rs.getObject(i));//rm.getColumnName(i)遍历的是字段的名称,rs.getObject(i)遍历是字段对应的值
				}
				list.add(m);//把Map集合的键值存放到List集合中
			}
			rs.close();//对用的完的资源进行关闭
			st.close();
			con.close();
			request.setAttribute("lists", list);//把List集合中数据放到request的域中
			request.getRequestDispatcher("/check.jsp").forward(request,response);//把上面的request域的输送到check.jsp中	
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

这是把数据库中数据读取出来,注意点:1、request.setAttribute("lists", list);中list是是存放到request域中的变量(List集合中的变量),而lists是要传送的变量,用在jsp中接受;2、request.getRequestDispatcher("/check.jsp")中getRequestDispatcher中存放是相对地址,“/”表示当前Web项目,"/check.jsp"也就是在当前的Web项目中的check.jsp。(在jsp和servlet之间的跳转就是靠这些地址,把这个理清楚,基本就是没有问题了)

2、建立一个jsp,命名为check,接受Check.java中发送过来的数据

         <%
			List<Map<String, Object>> list = (List<Map<String, Object>>) request.getAttribute("lists");//对servlet中的数据的接收
			if (list == null || list.size() < 1) {//判断数据库中有没有数据
				out.print("数据库中没有数据");
			} else {
		%>

		<div class="head">所有图书信息</div>
		<table align="center">使用的是table表格打印到页面上
			<thead>
				<tr align="center">
					<td><b>选择</b></td>
					<td><b>ID</b></td>
					<td><b>DVD名称</b></td>
					<td><b>状态</b></td>
					<td><b>日期</b></td>
					<td><b>次数</b></td>
				</tr>
			</thead>
			<%
				for (int i = 0; i < list.size(); i++) {//对接收的数据进行遍历打印
			%>
			<tr align="center">
				<td><input type="checkbox" value="http://www.mamicode.com/<%=list.get(i).get("id")%>"></td>//第二get是字段,第一get是第二get对应的值
				<td><%=list.get(i).get("id")%></td>
				<td><%=list.get(i).get("name")%></td>
				<td><%=list.get(i).get("state1")%></td>
				<td><%=list.get(i).get("date1")%></td>
				<td><%=list.get(i).get("count1")%></td>
			</tr>
			<%
				}	
			%>
		</table>

这个是之前写个一个列子,注意点:1、request.getAttribute("lists")这就是接收servlet发送过来数据的语句,lists是对应request.setAttribute("lists", list)中的第一个参数;2、if (list == null || list.size() < 1),这里的两个条件为了避免“”、“  ”,有不是空时,但是它没有长度;3、<%= %>这是在页面显示的语句,而<%  %>是jsp中的写java代码

这样就可以把数据库中的数据再页面上显示了。

越往后面的学习中可以发现的servlet中java是可以优化的,当然就一个功能优化了也不是能明显;同样的功能实现,代码越简洁越来了,给人的感觉也好。

		List<Map<String, Object>> list=Mysql.mysql( "select * from teachers");
		
		request.setAttribute("lists", list);	
     request.getRequestDispatcher("/teacherCheck.jsp").forward(request, response);

 这就是servlet中代码优化之后的代码,但是上面的代码都放到了Mysql.mysql方法中,如果有其他的功能需要也就可以直接调用了;这样就减少了代码量。

 

代码的封装

          

          static Connection con =null;
          static Statement st = null;
          static ResultSet rs = null;


          public static List<Map<String, Object>> mysql(String sql) { con = get();//数据库的连接 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); try { st = con.createStatement(); rs = st.executeQuery(sql); ResultSetMetaData rsd = rs.getMetaData();//获取数据库中字段的名称和其值 while (rs.next()) { Map<String, Object> map = new HashMap<String, Object>(); for (int i = 1; i <= rsd.getColumnCount(); i++) { map.put(rsd.getColumnName(i), rs.getObject(i)); } list.add(map); } return list; } catch (SQLException e) { e.printStackTrace(); return null; } finally { close(rs, st, null, con); } }

这代码和之前的代码也是不一样的,就是对资源用完之后的关闭

          public static void close(ResultSet rs, Statement st, PreparedStatement ps,Connection con) {
		try {
			if (rs != null)
				rs.close();
			if (st != null)
				st.close();
			if (ps != null)
				ps.close();
			if (con != null)
				con.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

定义了四个常用的接口,要进行关闭时直接调用就可以了,注意点:当需要关闭的资源没有四个的时候,把没有用的输入null就可以了,在这个方法中有对其的判断,而这个判断主要的判断就是有这个接口的代码,而没有执行的情况,进行的判断:比如说st = con.createStatement();rs = st.executeQuery(sql);如果st这行代码出现了错误,下面st这行代码就不执行了,抛出了异常,1)封装的代码中如果没有if的判断就会出现空指针的错误,因为rs没有执行,rs的值为null;2)没有封装的代码,st资源会一直开着,等待java垃圾回收,这样效率低。

 

其实这样也是不合适,这里出现线程安全的问题,下次再给大家分享。

servlet调用mysql中的数据