JAVA寫接口傻瓜(*)教程(六)


  今天把原來的代碼修改了一下,加入了BaseDao、BaseDaoImpl等接口和實現類,完成java中反射機制,使得代碼更加結構化。還把連接數據庫的部分拆出來了,有效避免代碼冗余問題。

       首先是數據庫連接代碼  

  

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionManager {
    public static Connection getConnection() {
        Connection conn = null;
        String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=S-T";
        String username = "sa";
        String password = "111";
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("沒有找到文件");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("sql異常");
        }
        return conn;
    }
}

  然后是數據庫操作DAO,它能夠隔離業務邏輯代碼和數據訪問代碼。用戶類也可以通過繼承,在基礎DAO上增加方法。

 

import java.util.List;

public interface BaseDao<T> {//泛型,增刪查改都有;為了方便我讓查找返回list

    List<T> select(T t,String sql);

    void add(T t);

    void update(T t);

    void delete(T t);
}

   BaseDaoImpl是對BaseDao的具體實現,注意其中泛型的使用

import com.alibaba.fastjson.JSONObject;

import javax.jnlp.BasicService;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BaseDaoImpl<T> implements BaseDao<T> {
    private Connection conn;
    private Statement ps;
    private ResultSet rs;
    private Class<T> EntityClass;// 獲取實體類
//    ParameterizedType pr;
    public BaseDaoImpl(Object o){
        //ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        //EntityClass=(Class<T>) pt.getActualTypeArguments()[0];
        EntityClass= (Class<T>) o.getClass();
    }

    @Override
    public  List<T> select(T t,String sql ){

        Connection conn=null;

        conn=ConnectionManager.getConnection();
        List<T> list=new ArrayList<>();
        T obj=null;
       // System.out.println(EntityClass);
        Field fields[] = EntityClass.getDeclaredFields();
        try {
            ps=conn.createStatement();
            rs=ps.executeQuery(sql);
            while (rs.next()){
                obj = EntityClass.newInstance();
                //System.out.println(fields.length);
                for (int i = 0; i < fields.length; i++) {
                    fields[i].setAccessible(true);
                    fields[i].set(obj, rs.getObject(fields[i].getName()));
                }
                list.add(obj);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return list;
    }

    @Override
    public void add(Object o) {

    }

    @Override
    public void update(Object o) {

    }

    @Override
    public void delete(Object o) {

    }
}

   我們既可以直接使用這個類,也可以繼承BaseDaoImpl類,實現一些新的函數。如UserDaoImpl類,增加了獲取全部學生信息的方法。

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class StudentDaoImpl extends BaseDaoImpl<student> implements StudentDao{
    Connection conn;
    Statement ps=null;
    List<student> students=new ArrayList<>();
    String sql=null;
    ResultSet rs=null;

    public StudentDaoImpl(Object O) {
        super(O);
    }

    @Override
    public List<student> findAll() {
        sql="select * from Student";
        conn=ConnectionManager.getConnection();
        try {
            ps=conn.createStatement();
            rs=ps.executeQuery(sql);
           // System.out.println(rs.getString(0));
            while (rs.next()){
                student st=new student();
                st.setName(rs.getString("Sname"));
                st.setId(rs.getString("Sno"));
                st.setSex(rs.getString("Ssex"));
                st.setAge(rs.getString("Sage"));
                students.add(st);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return students;
    }

}

   最后是接口實現:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import sun.rmi.runtime.Log;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.*;
import java.util.Date;

@WebServlet("/hello")//注解,免於在xml注冊,/hello表示在主頁后加/hello訪問此頁面
public class test extends HttpServlet {
    private String message;
    public void init() throws ServletException{

    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {//相應不帶參數的get

        List<student> students=new ArrayList<>();
        Connection dbConn=null;
        //StudentDaoImpl impl=new StudentDaoImpl();
        BaseDaoImpl im=new BaseDaoImpl(new student());
        try {
            // 設置響應內容類型
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");

            dbConn=ConnectionManager.getConnection();
            String sql="select * from Student";//拼接SQL語句
            //students=impl.findAll();
            students=im.select(new student(),sql);
            String staNum="500";
            status sta=new status(staNum, (students));

            System.out.println(JSONObject.toJSONString(sta));//轉變為json對象
            response.getWriter().println(JSONObject.toJSONString(sta));//注意這里不是控制台輸出了,是HttpServletResponse,用於返回json給http請求方
            //response.getWriter().println(request.getParameter("age"));*/
        } finally {
            try
            {//關閉連接
                if(dbConn!=null)
                {
                    dbConn.close();
                    dbConn=null;
                }
            }
            catch(Exception ex)
            {
            }
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) {

    }
}

 

  以上是實現結果。

附:學習了如何做到IDEA中設置代碼和瀏覽器同步

——》

這樣在調試時就能做到同步。Run時還需要手動選擇一下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM