亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談MyBatis 之 增刪改查(CRUD) (二)

2019-11-10 17:45:13
字體:
來源:轉載
供稿:網友

mybatis

CRUD是指在做增加(Create)、讀取(Retrieve)(重新得到數據)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫。主要被用在描述軟件系統中數據庫或者持久層的基本操作功能。

這兒主要講解mybatis的增刪改查,對入門沒有了解的,可以去參考上一篇文章。如有不對之處,請諒解,并提出,本人也是才自學的新手。 淺談MyBatis 之 入門(一)


數據庫表

表內容: 這里寫圖片描述


總配置文件

MyBatis-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!-- 引入外部 配置 文件 --> <PRoperties resource="jdbc.properties" /> <!-- 配置 別名 --> <typeAliases> <typeAlias alias="Dept" type="com.wm.mybatis.POJO.Dept"/> </typeAliases> <environments default="development"> <environment id="development" > <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="passWord" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 配置的映射文件 --> <mappers> <mapper resource="mapper/deptCURD.xml" /> </mappers></configuration>

POJO

Dept.java

package com.wm.mybatis.POJO;public class Dept { private Integer id ; private String name ; private String address ; public Dept(){} public Dept(Integer id, String name, String address) { super(); this.id = id; this.name = name; this.address = address; } public Integer getId() { System.out.println(id); return id; } public void setId(Integer id) { this.id = id; } public String getName() { System.out.println(name); return name; } public void setName(String name) { this.name = name; } public String getAddress() { System.out.println(address); return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Dept [id=" + id + ", name=" + name + ", address=" + address + "]"; }}

首先寫一個公共類

公共類sessionManagerUtil.java 是實現 獲取sqlsession 用的,這樣做的好處就是:便于管理當前線程與session的一個關系,還有就是 便于操作session。

package com.wm.mybatis.util;import java.io.IOException;import java.io.Reader;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class SessionManagerUtil { // 同一個線程 下 session 操作 private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sessionFactory = null; // 靜態加載塊 加載配置文件 static{ try { Reader config = Resources.getResourceAsReader("MyBatis-config.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(config); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(); } } // 防止直接new private SessionManagerUtil(){} // 獲取session public static SqlSession getSession(){ SqlSession sqlSession = threadLocal.get(); if (sqlSession == null) { sqlSession = sessionFactory.openSession(); threadLocal.set(sqlSession); } return sqlSession; } /// 關閉session public static void closeSession(){ SqlSession sqlSession = threadLocal.get(); if (sqlSession != null) { sqlSession.close(); threadLocal.remove(); // 與當前線程 分離 } }}

CRUD

增加

首先配置映射文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.wm.mybatis.dao.IDeptCURDMapperDao"> <!-- 由于數據庫表字段 和 JavaBean Dept類屬性 不一致 所以 要配置 resultMap 來實現一一對應--> <resultMap type="Dept" id="resultDept"> <result property="id" column="d_id" /> <result property="name" column="d_name" /> <result property="address" column="d_address" /> </resultMap> <!-- 增加 部門 --> <insert id="addDept" parameterType="Dept" > insert into base_55demo.demo_mawei_dept(d_id,d_name,d_address) values(#{id},#{name},#{address}) </insert></mapper>

DAO層:

DeptCURDMapperDaoImpl

import java.util.HashMap;import java.util.List;import org.apache.ibatis.session.SqlSession;import com.wm.mybatis.POJO.Dept;import com.wm.mybatis.util.SessionManagerUtil;public class DeptCURDMapperDaoImpl{ // 添加部門 public void addDept(Dept dept) throws Exception { SqlSession session = null; try { session = SessionManagerUtil.getSession(); //獲取session int count = session.insert(IDeptCURDMapperDao.class.getName()+".addDept", dept); System.out.println("插入了記錄:" + count + " 條"); // 更新 要提交 session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); // 回滾 throw e; } finally{ SessionManagerUtil.closeSession(); //關閉session } }}

測試

TestDeptCURD

package com.wm.mybatis.Test;import java.util.List;import org.junit.Test;import com.wm.mybatis.POJO.Dept;import com.wm.mybatis.dao.DeptCURDMapperDaoImpl;public class TestDeptCURD { // 增加 @Test public void addDept() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); dao.addDept(new Dept(35, "衛生部", "香港")); }}

結果

這里寫圖片描述

數據庫表:

這里寫圖片描述


刪除

映射配置

<!-- 刪除 --> <delete id="deleteDept" parameterType="Dept"> delete from base_55demo.demo_mawei_dept t where t.d_id = #{id} and t.d_name = #{name} </delete> <!-- 刪除部門 根據 ID --> <delete id="deleteDeptById" parameterType="int"> delete from base_55demo.demo_mawei_dept t where t.d_id = #{id} </delete>

DAO層

// 刪除 public void deleteDept(Dept dept) throws Exception { SqlSession session = null; try { session = SessionManagerUtil.getSession(); int count = session.delete(IDeptCURDMapperDao.class.getName()+".deleteDept", dept); System.out.println("刪除了記錄:"+count+" 條"); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); throw e; } finally{ SessionManagerUtil.closeSession(); } } //刪除部門 根據 ID來執行 public void deleteDeptById(int id) throws Exception { SqlSession session = null; try { session = SessionManagerUtil.getSession(); int count = session.delete(IDeptCURDMapperDao.class.getName()+".deleteDeptById", id); System.out.println("刪除了記錄:"+count+" 條"); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); throw e; } finally{ SessionManagerUtil.closeSession(); } }

測試

// 刪除 @Test public void deleteDept() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); dao.deleteDept(new Dept(9, "9", "9")); } // 根據ID 刪除 @Test public void deleteDeptById() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); dao.deleteDeptById(8); dao.deleteDeptById(12); }

結果

這里寫圖片描述

數據庫表: 這里寫圖片描述 結果表明:ID為8、9、12的數據都被刪除。


修改

配置映射

<!-- 更新 --> <update id="updateDept" parameterType="Dept"> update base_55demo.demo_mawei_dept t set t.d_name = #{name} , t.d_address = #{address} where t.d_id = #{id} </update>

DAO層

// 修改更新 public void updateDept(Dept dept) throws Exception { SqlSession session = null; try { session = SessionManagerUtil.getSession(); int count = session.update(IDeptCURDMapperDao.class.getName()+".updateDept", dept); System.out.println("更新了記錄:"+count+" 條"); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); throw e; } finally{ SessionManagerUtil.closeSession(); } }

測試

// 更新 @Test public void updateDept() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); Dept dept = dao.getDeptById(6); dept.setName("計費BOSS"); //修改數據 dao.updateDept(dept); }

結果

這里寫圖片描述

數據庫表: 這里寫圖片描述


查詢

配置映射

<!-- 根據ID 來查詢部門 --> <select id="getDeptById" parameterType="int" resultMap="resultDept"> select * from base_55demo.demo_mawei_dept t where t.d_id = #{id} </select> <!-- 查詢所有的部門 --> <select id="getDeptALL" resultMap="resultDept"> select * from base_55demo.demo_mawei_dept t </select> <!-- 分頁查詢 --> <select id="getDeptByPage" resultMap="resultDept" parameterType="map"> <![CDATA[ select dept.d_id,dept.d_name, dept.d_address from (select rownum num, t.* from base_55demo.demo_mawei_dept t where rownum <= (#{start}+#{num})) dept where dept.num > #{start} ]]> </select> <!-- 查詢 總記錄數 --> <select id="getTotalNum" resultType="int"> select count(0) from base_55demo.demo_mawei_dept </select>

DAO層

//查詢 通過 ID public Dept getDeptById(int id) { SqlSession session = SessionManagerUtil.getSession(); Dept dept = session.selectOne(IDeptCURDMapperDao.class.getName()+".getDeptById", id); SessionManagerUtil.closeSession(); System.out.println(dept); return dept; } //查詢 所以 部門 public List<Dept> getDeptALL() { SqlSession session = SessionManagerUtil.getSession(); List<Dept> depts = session.selectList(IDeptCURDMapperDao.class.getName()+".getDeptALL"); SessionManagerUtil.closeSession(); return depts; } // 分頁查詢 public List<Dept> getDeptByPage(int start, int num){ SqlSession session = SessionManagerUtil.getSession(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("start", start); map.put("num", num); List<Dept> depts = session.selectList(IDeptCURDMapperDao.class.getName()+".getDeptByPage", map); return depts; } // 查詢所有記錄 public int getTotalNum(){ SqlSession session = SessionManagerUtil.getSession(); int num = session.selectOne(IDeptCURDMapperDao.class.getName()+".getTotalNum"); SessionManagerUtil.closeSession(); return num; }

測試

// 根據 ID 查詢 @Test public void getDeptById() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); Dept dept = dao.getDeptById(19); System.out.println(dept); } // 查詢所有的 @Test public void getDeptALL() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); List<Dept> depts = dao.getDeptALL(); for (Dept dept : depts) { System.out.println(dept); } } // 分頁查詢 @Test public void getDeptByPage() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); int totalNum = dao.getTotalNum(); int pageNum = 4; int totalPage = (totalNum % pageNum == 0) ? (totalNum / pageNum) : (totalNum / pageNum) + 1 ; for (int i = 0; i < totalPage; i++) { System.out.println("第 "+(i+1)+" 頁"); List<Dept> depts = dao.getDeptByPage(i*pageNum,pageNum); for (Dept dept : depts) { System.out.println(dept); } } } // 查詢總記錄 @Test public void getTotalNum() throws Exception{ DeptCURDMapperDaoImpl dao = new DeptCURDMapperDaoImpl(); int num = dao.getTotalNum(); System.out.println("總共:"+num+" 條記錄"); }

結果

此處 展示分頁查詢的結果,其他的查詢比較簡單。

這里寫圖片描述 這里寫圖片描述


總結


1、如果映射文件配置namespace 為dao接口類路徑,則在實現操作時,可以簡化。<mapper namespace="com.wm.mybatis.dao.IDeptCURDMapperDao">

此處就可以寫成 IDeptCURDMapperDao.class.getName()

session.insert(IDeptCURDMapperDao.class.getName()+".addDept", dept);2、如果配置文件中返回的是多結果查詢,本應該是List,但是這兒配置List里面放置的類型為返回值類型。resultMap=”resultDept” <!-- 分頁查詢 --> <select id="getDeptByPage" resultMap="resultDept" parameterType="map">3、如果配置映射參數是map時,獲取值的名字要與map放入的名字一致。parameterType=”map” <!-- 分頁查詢 --> <select id="getDeptByPage" resultMap="resultDept" parameterType="map"> <![CDATA[ select dept.d_id,dept.d_name, dept.d_address from (select rownum num, t.* from base_55demo.demo_mawei_dept t where rownum <= (#{start}+#{num})) dept where dept.num > #{start} ]]> </select> // 分頁查詢 public List<Dept> getDeptByPage(int start, int num){ SqlSession session = SessionManagerUtil.getSession(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("start", start); map.put("num", num); List<Dept> depts = session.selectList(IDeptCURDMapperDao.class.getName()+".getDeptByPage", map); return depts; }

配置映射文件中和dao層的map放入值名稱要一致 map.put(“start”, start); map.put(“num”, num);


4、一個小技巧

在使用mybatis時,配置Log4j配置,可以打印 顯示出(sessions連接ID、連接的開啟、關閉、及執行的SQL、動態SQL參數等信息)

在log4j.properties文件中加入:

log4j.logger.com.ibatis=DEBUGlog4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUGlog4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUGlog4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUGlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG

顯示的結果如下:

這里寫圖片描述

這樣便于學習mybatis,可以看見過程及背后的SQL。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线播放国产| 91国自产精品中文字幕亚洲| 久久久久久97| 中文字幕亚洲欧美在线| 九九久久精品一区| 久久久人成影片一区二区三区| 粉嫩av一区二区三区免费野| 国产精品偷伦免费视频观看的| 欧美综合激情网| 国产精品免费久久久| 亚洲精品美女久久久| 欧美日韩成人在线观看| 亚洲人成人99网站| 国产精品日韩在线| 九九视频直播综合网| 久热国产精品视频| 亚洲男人天天操| 国产精品成人免费电影| 韩国三级日本三级少妇99| 欧美激情国产精品| 亚洲www视频| 午夜精品理论片| 国产成人精品在线观看| 一区二区三区四区精品| 日韩一区二区欧美| 久久久女女女女999久久| 久久久亚洲福利精品午夜| 亚洲成人中文字幕| 亚洲精品视频网上网址在线观看| 国产精品一区二区三区免费视频| 亚洲欧美在线一区| 97在线视频精品| 亚洲qvod图片区电影| 成人免费观看a| 亚洲成成品网站| 在线观看国产精品日韩av| 在线观看亚洲视频| 高清一区二区三区日本久| 国产91精品久久久久久久| www高清在线视频日韩欧美| 91亚洲精品久久久久久久久久久久| 国产精品亚洲第一区| 亚洲国产欧美久久| 欧美日韩午夜激情| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲激情小视频| 欧美丝袜一区二区三区| 国产成人精品999| 欧美午夜精品久久久久久久| 亚洲国产精品人久久电影| 97免费中文视频在线观看| 高清亚洲成在人网站天堂| 成人免费午夜电影| 欧美日韩人人澡狠狠躁视频| 美女福利视频一区| 一区二区欧美激情| 亚洲色图校园春色| 不卡av在线网站| 国产精品一区二区三区成人| 亚洲第一网中文字幕| 色综合久久精品亚洲国产| 久久久免费高清电视剧观看| 日本高清不卡在线| 日韩av理论片| 久久色免费在线视频| 亚洲国产99精品国自产| 欧美二区在线播放| 亚洲一级黄色片| 91在线精品播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲娇小xxxx欧美娇小| 日本精品免费观看| 欧美日韩国产影院| 久久久精品免费视频| 亚洲理论片在线观看| 久久久亚洲国产| 中文字幕亚洲激情| 国产精品日韩电影| 久久久www成人免费精品张筱雨| 欧美电影免费观看电视剧大全| 日本亚洲欧美三级| 国产精品久久久久久久app| 色七七影院综合| 自拍偷拍亚洲一区| 国产一区二区精品丝袜| 久久影视电视剧凤归四时歌| 亚洲国产日韩欧美综合久久| 国产日韩欧美视频在线| 成人免费视频a| 疯狂蹂躏欧美一区二区精品| 国产精品99久久久久久www| 欧洲美女免费图片一区| 91精品久久久久久久久久另类| 国产精品视频一区国模私拍| 日韩经典中文字幕在线观看| 久久久久久久久久国产精品| 国产精品热视频| 国产一区二区三区在线| 亚洲深夜福利网站| 欧美国产第二页| 亚洲国产精品字幕| 在线成人激情黄色| 国产精品久久久久一区二区| 亚洲人成在线一二| 欧美美女操人视频| 久久久久北条麻妃免费看| 亚洲精品按摩视频| 久久久视频免费观看| 色婷婷综合久久久久中文字幕1| 久久频这里精品99香蕉| 国产精品香蕉在线观看| 欧美性高跟鞋xxxxhd| 91日本在线视频| 欧美性猛交99久久久久99按摩| 中文字幕亚洲综合久久| 欧美中文字幕在线播放| 色偷偷偷综合中文字幕;dd| 在线激情影院一区| 日韩在线中文字| 欧美性极品少妇精品网站| 国产不卡av在线免费观看| 欧美午夜精品在线| 国产精品人成电影| 欧美精品18videos性欧| 日韩在线观看视频免费| 久久91亚洲人成电影网站| 狠狠干狠狠久久| 一区二区三区高清国产| 亚洲影视九九影院在线观看| 精品女同一区二区三区在线播放| 97久久精品国产| 国产精品视频久久| 亚洲欧洲国产伦综合| 91精品中国老女人| 亚洲第一福利在线观看| 国产精品久在线观看| 97av在线视频免费播放| 久久成人人人人精品欧| 欧美性xxxx在线播放| 亚洲国产精品高清久久久| 国产精品扒开腿爽爽爽视频| 精品久久在线播放| 有码中文亚洲精品| 日韩精品高清在线| 亚洲精品久久久久中文字幕二区| 欧美日本亚洲视频| 国产精品久久久久久久久| 亚洲成色777777女色窝| 亚洲国产精品系列| 亚洲大胆人体在线| 亚洲欧美自拍一区| 中文字幕亚洲综合| 一区二区三区天堂av| 国产精品7m视频| 色噜噜久久综合伊人一本| 国产精品高潮呻吟久久av无限| 成人黄色免费片| 亚洲春色另类小说| 色妞久久福利网| 欧洲永久精品大片ww免费漫画| 欧美中文字幕第一页| 日韩中文字幕在线| 欧美野外猛男的大粗鳮| 成人a视频在线观看|