JDBC的一些简单的操作
有关jdbc的一些个简单的操作我是在写一个接口的过程中学习到的,在这个简单的服务端接口的编写过程中我领会了在服务端的分层开发的理念,当然和Android开发的各种架构开发有区别,但是实现原理却是类似的。
JDBC如何分层各个分层都完成什么样的功能
在谈到JDBC的过程中首先需要明白的一点那就是对数据库的操作,其实后台服务器主要完成的功能就是和数据库的交互,通过Servlet获取各种请求命令,然后对后台的业务(数据库)进行相关的操作。
接口服务器抽象模型
服务员
服务员的话,主要工作就是直接和客户进行交流沟通,他完成的工作是整个服务的起点,这一环节谈崩了,那么本次服务流程就不能进行下去。作为整个服务的出发点,服务员主要的工作内容是从客户的口中得到服务的类型,然后收取费用,接着下单通知后勤人员买什么样的菜,厨师做什么样的东西。(这就是我们的Servlet层)
厨师
厨师的话仅仅知道了需要做什么东西还是远远不够的,他必须要有食材,有佐料,只有具备了这些充分条件,他才可以开火。虽然不是最为基础的条件创造者,但是美味佳肴却是直接由他来创造的,是与服务类型最直接的交流者,他和服务的关系是创造者与被创造者的关系。这就好比是我们的Dao层是直接与数据库进行数据交流的关键角色。
后勤人员(买东西的人)
后勤人员成为最为关键的角色稍有不妥,我觉得最为基础的角色更加贴切,为什么说是基础呢,因为他的工作是整个服务进行下去的必要条件,我们去一家餐厅吃饭,然后服务员说没有菜了,面对这样的情况我们只能是耸耸肩膀,去光顾其他的餐厅,整个服务也只能到处为止。类比到项目当中的话,就是我们在操作数据库之前具有可以初始化操作的一些个工具类。
客户(服务的消费者)
作为消费者,我们并不知道整个餐厅的工作体系,我们能接触到的仅仅是服务员提供给我们的一些个信息(本餐厅都有那些菜,没有那些菜),而我们要做的事情就是告诉服务员我们要点什么菜。
三个不同角色完成的具体操作
Servlet层
Servlet层主要完成的工作就是获取请求的类型(消费者点的是什么菜),他的两端面临的一个是消费者一个则是餐厅的工作人员,所以他完成的操作动作是获取请求方式,然后将请求方式告诉后台的业务层。下边是一段有关Servlet的代码:
@WebServlet("/examInfo")
public class GetQuestions extends HttpServlet{
private static final long serialVersionUID=1L;
private IQuestionBiz biz=new QuestionBizImpl();
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws Servletexception,IOException{
response.setCharacterEncoding("utf-8");
response.setContentType("text/html,charset=utf-8");
String testType=request.getParameter("testType");
String json=biz.getQuestions(testType);
response.getWriter().println(json);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
doGet(request,response);
}
}
分析以上代码就很容易发现我们首先通过request.getParameter(“testType”)拿到了客户端的请求类型,然后将得到的请求类型通过biz.getQuestions(testType)方法传递给业务层,当然Servlet层也是通过这个方法得到后台的数据的,最后通过response.getWriter().println(json)方法将从业务层拿到的数据返回给客户端。
Dao层
Dao层就像我们之前说的一样主要完成的是直接和数据库进行交互,一方面要完成对数据库的操作另外一方面要将从数据库得到的数据进行实体类的封装,并通过接口的形式将数据返回给其他层。
public class QuestionDaoImpl implements IQuestion{
@Override
public List<Result> getAll(){
/**
*JDBC三大基本操作类
**/
Connection conn=DBUtil.getConn();
PreparedStatement ps=null;
ResultSet rs=null;
List<Result> list=new ArrayList<Result>();
try{
ps=conn.prepareStatement("select * from t_question");
rs=ps.executeQuery();
while(rs.next()){
int id=rs.getInt("id");
String question=rs.getString("question");
String answer=rs.getString("answer");
Result result=new Result(id,question,answer);
list.add(result);
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.closeAll(conn,ps,rs);
}
return list;
}
}
正像之前所说的一样Dao层完成的就是数据库数据的封装,封装完成之后通过接口的形式将封装好的数据提供给其他层。
Util层
Util层主要完成的就是操作数据库之前的一些个初始化编码,我们知道数据库操作无非是这样的一个步骤:1.DriverManager的初始化我们一般通过Class.forName(“com.mysql.jdbc.Driver”)来完成。然后我们要获取一个Connection对象这个对象的获取方式我们是通过调用这样的方法DriverManager.getConnnection(jdbcUrl)的方式获取到一个连接,这样就完成了对Mysql数据库的连接。在连接的过程中我们往往不是将jdbcDriver或者jdbcUrl直接写入到代码中,往往是将相关的配置放在properties配置文件中,通过另外定义一个工具类获取其中的配置参数,以下为详细的代码:
public class DBUtil{
public static Connection getConn(){
Connection conn=null;
try{
class.forName(PropertiesUtil.getValue("jdbcDriver","jdbc.properties"));
conn=DriverManager.getConnection(PropertiesUtil.getValue()"jdbcUrl","jdbc.properties");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return conn;
}
public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(ps!=null){
ps.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try{
if(rs!=null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
接下来是Properties的相关代码:
public class PropertiesUtil{
public static String getValue(String key ,String proName){
String value=null;
Properties p=new Properties();
String path=PropertiesUtil.class.getResource("/").getPath();
try{
p.load(new FileInputStream(new File(path,proName)));
value=p.getProperty(key);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return value;
}
}
总结:
通过对整个模块的分析我们得到了这样的几个关键的结论:1. 业务分层的本质就是服务操作的封装(消费者不知道公司的内部工作详情)。2. 接口中的方法如果没有返回类型的话想要通过回调实现数据的返回可以通过以接口为方法参数的方式来实现。3.面向接口编程的本质以及JDBC的基本编码流程。