/**
* FileName: TouPiaoImpl
*
* FileType: class
*
* Date: 2009年7月2日
*
* Author: 宋明
*
* Description: 实现类
*
*/
package com.qhit.dao.impl;
import java.util.*;
import java.sql.*;
import com.qhit.system.conn.*;
import com.qhit.dao.interfaces.TouPiaoInterfaces;
public class TouPiaoImpl implements TouPiaoInterfaces{
public List selectAll() {
List list = new ArrayList();
Connection conn ;
PreparedStatement pstm ;
ResultSet rs;
ResultSetMetaData rsmd ;
Map dto;
StringBuilder sql = new StringBuilder()
.append("select a.b_title,b.x_id,x_name,x_piao ,")
.append("x_piao/(select sum(x_piao) from tb_xuan where b_id=1) bai ")
.append(" from tb_title a, tb_xuan b")
.append(" where a.b_id=b.b_id");
try {
conn = DBUtils.getConnection();
pstm = conn.prepareStatement(sql.toString());
rs = pstm.executeQuery();
rsmd = rs.getMetaData();
int size = rsmd.getColumnCount();
while (rs.next()) {
dto = new HashMap();
for(int i = 0;i<size;i++){
dto.put(rsmd.getColumnLabel(i+1),rs.getObject(i+1));
}
list.add(dto);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
/**
* 投票方法
*/
public boolean updateTouPiao(Map dto) throws Exception {
boolean bol=false;
Connection conn = null;
PreparedStatement pstm = null;
StringBuilder sql = new StringBuilder()
.append("update tb_xuan ")
.append(" set x_piao=x_piao+1 ")
.append(" where x_id=?");
try{
conn = DBUtils.getConnection();
pstm = conn.prepareStatement(sql.toString());
pstm.setObject(1,dto.get("x_id"));
if(pstm.executeUpdate()>0){
bol=true;
}
}finally{
DBUtils.close(pstm);
}
return bol;
}
/**
* 查询投票选项方法
* @param dto 用于扩展的,当传入编号找到相应的投票明细
* @return
*/
public Map selectTitle(Map dto)throws Exception {
//定义链接对象
Connection conn ;
//定义指令集对象
PreparedStatement pstm =null;
//定义结果集对象
ResultSet rs = null;
//定义元数据对象
ResultSetMetaData rsmd ;
//定义承载单行结果的Map集合
Map impl=null;
//定义数据库操作语句
StringBuilder sql = new StringBuilder()
.append("select b_id,b_title from tb_title where b_id=?");
try {
//通过数据库链接类获得连接对象
conn = DBUtils.getConnection();
//通过连接对象实例指令集对象
pstm = conn.prepareStatement(sql.toString());
//为数据库操作语句中的?赋值
pstm.setObject(1,dto.get("b_id"));
//执行数据库操作将结果赋给结果集对象
rs = pstm.executeQuery();
//通过结果集对象获得元数据对象
rsmd = rs.getMetaData();
//获得返回结果的列数
int size = rsmd.getColumnCount();
//循环解析结果集
while (rs.next()) {
//实例单行记录的承载对象Map
impl = new HashMap();
for(int i = 0;i<size;i++){
impl.put(rsmd.getColumnLabel(i+1),rs.getObject(i+1));
}
}
} finally {
//关闭结果集对象和指令集对象
DBUtils.close(rs);
DBUtils.close(pstm);
}
//将结果集返回
return impl;
}
/**
* 查询选项标题方法
* @return
*/
public List selectXuan(Map dto)throws Exception {
//定义承载返回的数据的行集合
List list = new ArrayList();
//定义数据库链接对象
Connection conn ;
//定义指令集对象
PreparedStatement pstm = null;
//定义结果集对象
ResultSet rs = null;
//定义元数据对象
ResultSetMetaData rsmd ;
//定义承载单行数据的集合Map
Map impl;
//定义数据库操作语句
StringBuilder sql = new StringBuilder()
.append("select x_id,x_name,x_piao ,")
.append("x_piao/(select sum(x_piao) from tb_xuan where b_id=?) bai ")
.append(" from tb_xuan a")
.append(" where a.b_id=?");
try {
//通过数据库封装类获得数据库链接对象
conn = DBUtils.getConnection();
//通过数据库链接对象获得指令集对象(数据库操作对象)
pstm = conn.prepareStatement(sql.toString());
//为数据库操作语句中?赋值
pstm.setObject(1,dto.get("b_id"));
pstm.setObject(2,dto.get("b_id"));
//执行数据库操作语句,将结果赋给结果集对象
rs = pstm.executeQuery();
//通过结果集对象获得元数据对象
rsmd = rs.getMetaData();
//获得结果集中的列数
int size = rsmd.getColumnCount();
/*
* 循环解析rs结果集
* 外层循环是解析行结果的
* 内层循环是解析列结果的
*/
while (rs.next()) {
//实例承载单行记录的集合Map
dto = new HashMap();
//循环解析单行记录,将记录放入Map集合中
for(int i = 0;i<size;i++){
dto.put(rsmd.getColumnLabel(i+1),rs.getObject(i+1));
}
//将单行记录放入行集合中
list.add(dto);
}
} finally {
//关闭结果集对象和指令集对象
DBUtils.close(rs);
DBUtils.close(pstm);
}
//将行结果返回
return list;
}
/**
* 投票添加方法
* @param dto 页面获得的标题、选项等信息
* @return 标识
* @throws Exception
*/
public int addTouPiao(Map dto)throws Exception{
//定义承载标题编号的标识
int bo = 0;
//通过数据库封装类获得数据库练级对象
Connection conn = DBUtils.getConnections();
//定义指令集对象
PreparedStatement pstm1 = null,pstm2=null;
//定义数据库操作语句
StringBuilder sql1 = new StringBuilder()
.append("insert tb_title(b_title) values(?)");
StringBuilder sql2 = new StringBuilder()
.append("insert tb_xuan(x_name,x_piao,b_id) values(?,0,?)");
//获得选项数据。因为是多个选项,所以传输时是以数组的形式传输的
String[] x_names=(String[]) dto.get("otitle");
try {
//设置数据提交方式为手动提交
conn.setAutoCommit(false);
/*
* 通过连接对象获得指令集对象,并设置其可读流水键
*/
pstm1 = conn.prepareStatement(sql1.toString(),Statement.RETURN_GENERATED_KEYS);
//为Sql1中的?赋值
pstm1.setObject(1,dto.get("b_title"));
//执行SQL1
pstm1.executeUpdate();
//获得sql1执行后的流水键,并应ResultSet对象接收
ResultSet key = pstm1.getGeneratedKeys();
//流水键的结果集向下滚动
key.next();
//用int类型变量接收流水键
int k = key.getInt(1);
//通过数据库连接对象获得sql2的指令集对象
pstm2 = conn.prepareStatement(sql2.toString());
//如果选项中的值不为空,将值循环赋给sql2中?
if(x_names!=null){
for(int i = 0;i<x_names.length;i++){
pstm2.setObject(1,x_names[i]);
pstm2.setObject(2,k);
//将Sql2中的指令集对象放入batch中
pstm2.addBatch();
}
}
//执行pstm2的Batch
pstm2.executeBatch();
//事务提交
conn.commit();
//将流水键赋给标识
bo = k;
} catch (Exception e) {
//如果添加出现异常,事务回滚
conn.rollback();
e.printStackTrace();
}finally{
//将提交方式设置为自动提交
conn.setAutoCommit(true);
}
//将标识返回
return bo;
}
}