通过上篇博客的反射机制将代码简化,即获取一个类,通过其内部方法名、变量名,通过命名机制将其一 一对应。
1.例:通过提交一个handler将所要写的servlet简化,jsp提交至原servlet,调用继承自父类的doPost,doGet等方法判断所需要调用的真正方法。即将addServlet等集合在同一个servlet中。代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String handler = request.getParameter("handler");
try {
Method method = this.getClass().getDeclaredMethod(handler, HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,request, response);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void addStu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*在servlet界面我们往往会写好多无用的代码:
例:String realName = request.getParameter("stuName");
stu.setStuName(stuName)
使用Bentils jar包可以省掉相当多的重复性工作如上面的代码
*/
Map stuMap = request.getParameterMap();
Student student = new Student();
try {
BeanUtils.populate(student, stuMap);//populate方法根据命名规则将代码简化
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
2.例:
BeanUtils工具的使用
功能:BeanUtils主要是用于将对象的属性封装到对象中
BeanUtils设置属性值的时候,如果属性是基本数据类型,那么BeanUtils会自动帮我们进行数据类型的转换,并且BeanUtils设置属性的时候也是依赖于底层的getter和setter方法
如果设置的属性值是其他的引用数据类型,此时必须要注册一个类型转换器才能实现自动的转换。
ConvertUtils.register(实现coverter接口的类,与要引用的数据类型的class对象)
例如:
//添加一个日期类转换器
ConvertUtils.register(new DateConverter(), Date.class);
class DateConverter implements Converter{
public Date convert(Class type, Object value) {
if(value != null){
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(value.toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
commons-dbutils介绍:commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
DbUtils提供了三个包,分别是:
org.apache.commons.dbutils;
org.apache.commons.dbutils.handlers;
org.apache.commons.dbutils.wrappers;
(1)org.apache.commons.dbutils
DbUtils 关闭链接等操作
QueryRunner 进行查询的操作
(2)org.apache.commons.dbutils.handlers
ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中存成映射,key为某一列对应为Map。Map中存放的是数据
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object
(3)org.apache.commons.dbutils.wrappers
SqlNullCheckedResultSet :对ResultSet进行操作,改版里面的值
StringTrimmedResultSet :去除ResultSet中中字段的左右空格。Trim()
以上是找的大概方法的总结下面是用法
QueryRunner中提供对sql语句操作的API
它主要有三个方法:
具体分析见:
query() 用于执行select
update() 用于执行insert/update/delete
public int addStu(Student stu) {
//增加学生信息
Connection conn = null;
String sql = "insert into student (stu_name,gender,stu_num)values(?,?,?)";
QueryRunner qr = new QueryRunner();
Object[] params = { stu.getStuName(), stu.getGender(), stu.getStuNum() };
conn = DButil.getConn();
try {
return qr.update(conn, sql, params);
} catch (Exception e) {
e.printStackTrace();
System.out.println("添加数据错误");
}
return 0;
}
public int deleteStu(Student stu) {
//删除学生信息
Connection conn = DButil.getConn();
String sql = "delete from student where stu_num = ?";
QueryRunner qr = new QueryRunner();
try {
return qr.update(conn, sql, stu.getStuNum());
} catch (SQLException e) {
e.printStackTrace();
} finally {
DButil.closeConn(conn);
}
return 0;
}
public int updateStu(Student stu) {
//修改学生信息
String sql = "update student set stu_name = ?,gender = ?,stu_num = ? where id = ?";
Connection conn = DButil.getConn();
QueryRunner qr = new QueryRunner();
Object[] params = { stu.getStuName(), stu.getGender(), stu.getStuNum(), stu.getStuId() };
try {
return qr.update(conn, sql, params);
} catch (Exception e) {
System.out.println("修改数据错误");
} finally {
DButil.closeConn(conn);
}
return 0;
}
public List queryStu() {
Connection conn = DButil.getConn();
String sql = "select * from student";
QueryRunner qr = new QueryRunner();
try {
return qr.query(conn,sql, new BeanListHandler(Student.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//还有其余用法在此就不一一介绍了