無標(biāo)題文章

Dao模式

Data Access Object(數(shù)據(jù)存取對(duì)象)
組成部分:數(shù)據(jù)庫工具類 實(shí)體類 dao接口(對(duì)應(yīng)每個(gè)表的crud操作) dao實(shí)現(xiàn)類
位于業(yè)務(wù)邏輯和持久化數(shù)據(jù)之間
實(shí)現(xiàn)對(duì)持久化數(shù)據(jù)的訪問

數(shù)據(jù)類工具類

  • 位于com.starlink.util 中
  • 主要功能實(shí)現(xiàn)jdbc 連接 通用的查詢 通用的增刪改 關(guān)閉連接
public class DbUtil {
    private  static  final String URL = "jdbc:mysql://localhost:3306/school";
    private static final String USER = "root";
    private static final String PASSWORD = "root";
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    
    private static Connection connection = null;
    private static  PreparedStatement pstmt = null;
    private static  ResultSet rs  = null;
    
    //  獲取連接     // 通用查詢   // 通用增刪改    // 關(guān)閉連接
    
    /**
     *
     *數(shù)據(jù)連接類
     */
    public static Connection getConnection(){
        try {
            Class.forName(DRIVER);
            connection = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }
    
    /**
     *通用的增刪改方法
     *@param sql   可以支持   insert update delete 
     *@param objects   元素個(gè)數(shù)  和慧瘤?的個(gè)數(shù)     位置對(duì)應(yīng)   個(gè)數(shù)對(duì)應(yīng)     數(shù)據(jù)類型對(duì)應(yīng)
     *@return
     */
    public static int updateOrInsertOrDelete(String sql,Object...objects){
        int row = -1;
        try {
            connection = getConnection();
            pstmt = connection.prepareStatement(sql);
            // 填充參數(shù)
            for (int i = 0; i < objects.length; i++) {
                pstmt.setObject(i+1,  objects[i]);
            }
            row = pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return row;
    }
    
    /**
     * 通用的查詢  只能查詢的是單條記錄
     * @param sql   sql 只能查詢出來一條行記錄
     * @param clazz   查詢某一個(gè)表的時(shí)候丈攒,要預(yù)先創(chuàng)建實(shí)體類   實(shí)體類的屬性名和列名保持對(duì)應(yīng)
     * @param objects
     * @return
     */
    public static <T> T queryOne(String sql ,Class clazz,Object...objects){
        T obj = null;
        try {
            connection  = getConnection();
            pstmt = connection.prepareStatement(sql);
            // 填充參數(shù)
            for (int i = 0; i < objects.length; i++) {
                pstmt.setObject(i+1,  objects[i]);
            }
            rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            // 列的個(gè)數(shù)
            int columnCount = rsmd.getColumnCount();
            if(rs.next()){
                // 通過一個(gè)類產(chǎn)生的對(duì)象
                obj = (T) clazz.newInstance();
                // 
                for (int i = 1; i <=columnCount; i++) {// 循環(huán)表的列
                    //  列名
                    String columnName = rsmd.getColumnName(i);
                    Field[] fs = clazz.getDeclaredFields();
                     for(int j = 0 ; j < fs.length; j++){  // 循環(huán)實(shí)體里面的屬性
                         Field f = fs[j];
                         f.setAccessible(true);
                         //f.getName()  屬性名
                         if (columnName.equals(f.getName())) {// 當(dāng)列名 和屬性相等
                            f.set(obj, rs.getObject(i));// 把列值賦值給對(duì)象的屬性
                        }
                     }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return obj;
    }  
    
    /**
     * 查詢多條記錄
     * @param sql
     * @param clazz
     * @param objects
     * @return
     */
    public static  <T> List<T> queryMany(String sql,Class clazz,Object...objects){
        List<T> list = new ArrayList<T>();
        try {
            connection = getConnection();
            pstmt = connection.prepareStatement(sql);
            for (int i = 0; i < objects.length; i++) {
                pstmt.setObject(i+1, objects[i]);
            }
            rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int count = rsmd.getColumnCount();
            while(rs.next()){
                T obj = (T) clazz.newInstance();
                for (int i = 1; i <=count; i++) {
                    // 列名
                    String columnName = rsmd.getColumnName(i);
                    
                    Field[] fs = clazz.getDeclaredFields();
                    for (int j = 0; j < fs.length; j++) {
                        Field f = fs[j];
                        f.setAccessible(true);
                        if (columnName.equals(f.getName())) {
                            f.set(obj, rs.getObject(i));
                        }
                    }
                }
                list.add(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return list;
    }
    /**
     * 釋放資源
     */
    public static void closeAll(){
        try {
            //   nullpointException       空的對(duì)象調(diào)用方法 或者屬性   就會(huì)產(chǎn)生
            if (rs!=null) {
                rs.close();
            }
            if (pstmt!=null) {
                pstmt.close();
            }
            if (connection!=null) {
                connection.close();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
  • 實(shí)體類 位于com.starlink.entity
public class School {

    private int schoolId;
    private String sname;
    public int getSchoolId() {
        return schoolId;
    }
    public void setSchoolId(int schoolId) {
        this.schoolId = schoolId;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
}
  • dao接口 位于com.starlink.dao 例如學(xué)生dao接口

public interface SchoolDao {

    
    // 查詢  刪除  修改  添加
    /**
     * 查詢所有的學(xué)校信息
     * @return
     */
    public List<School> selectAll();
    
    /**
     * 分頁查詢學(xué)校列表
     * @param pageNo
     * @param pageSize
     * @return
     */
    public List<School> selectPage(int pageNo,int pageSize);
    
    /**
     * 根據(jù)id 刪除學(xué)校信息
     * @param id
     * @return
     */
    public int deleteSchool(int id);
    /**
     * 添加學(xué)校信息
     * @param s
     * @return
     */
    public int insertSchool(School s);
    /**
     * 修改學(xué)校信息
     * @param s
     * @return
     */
    public int updateSchool(School s);
}
  • dao實(shí)現(xiàn)類
public class SchoolDaoImpl implements SchoolDao {

    @Override
    public List<School> selectAll() {
        String sql = "select * from school";
        List<School> list = DbUtil.queryMany(sql, School.class);
        return list;
    }

    @Override
    public List<School> selectPage(int pageNo, int pageSize) {
        String sql = "select * from school limit ?,?";
        List<School> list = DbUtil.queryMany(sql, School.class,(pageNo-1)*pageSize,pageSize);
        return list;
    }

    @Override
    public int deleteSchool(int id) {
        String sql = "delete from school where schoolid = ?";
        int row = DbUtil.updateOrInsertOrDelete(sql, id);
        return row;
    }

    @Override
    public int insertSchool(School s) {
        String sql  = "insert into school(sname) values(?)";
        int row = DbUtil.updateOrInsertOrDelete(sql, s.getSname());
        return row;
    }

    @Override
    public int updateSchool(School s) {
        String sql = "update school set sname =? where schoolId =?";
        int row  = DbUtil.updateOrInsertOrDelete(sql, s.getSname(),s.getSchoolId());
        return row;
    }

}
  • 測試類
public class Main {
    public static void main(String[] args) {
        SchoolDao dao = new SchoolDaoImpl();
        // 分頁查詢
        List<School> list1  = dao.selectPage(1, 5);
        for (School s : list1) {
            System.out.println(s.getSchoolId()+" "+s.getSname());
        }
        
        /*
        School s1 = new School();
        s1.setSchoolId(4);
        s1.setSname("中原工學(xué)院分院1");
        int row = dao.updateSchool(s1);
        if (row>0) {
            System.out.println("修改成功");
        }
        */
        /*
        School s2 = new School();
        
        s2.setSname("中原工學(xué)院分院1");
        int row = dao.updateSchool(s2);
        if (row>0) {
            System.out.println("刪除成功");
        }
        */
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慨丐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陪拘,更是在濱河造成了極大的恐慌谈竿,老刑警劉巖然磷,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異齐饮,居然都是意外死亡捐寥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門沈矿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上真,“玉大人,你說我怎么就攤上這事羹膳∷ィ” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵陵像,是天一觀的道長就珠。 經(jīng)常有香客問我,道長醒颖,這世上最難降的妖魔是什么妻怎? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮泞歉,結(jié)果婚禮上逼侦,老公的妹妹穿的比我還像新娘。我一直安慰自己腰耙,他們只是感情好榛丢,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挺庞,像睡著了一般晰赞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上选侨,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天掖鱼,我揣著相機(jī)與錄音,去河邊找鬼援制。 笑死戏挡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晨仑。 我是一名探鬼主播褐墅,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寻歧!你這毒婦竟也來了掌栅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤码泛,失蹤者是張志新(化名)和其女友劉穎猾封,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪珊,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌缘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年齐莲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷箕。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡选酗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岳枷,到底是詐尸還是另有隱情芒填,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布空繁,位于F島的核電站殿衰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盛泡。R本人自食惡果不足惜闷祥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傲诵。 院中可真熱鬧凯砍,春花似錦、人聲如沸拴竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殖熟。三九已至局待,卻和暖如春斑响,著一層夾襖步出監(jiān)牢的瞬間菱属,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工舰罚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纽门,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓营罢,卻偏偏與公主長得像赏陵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饲漾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容