學無止境(1)關於Mybatis註解多表新增資料操作
阿新 • • 發佈:2019-02-02
今天是2017年11月28日!
今天起,正式開啟學無止境系列,其實也沒什麼,就是記錄下自己在編碼中遇到的問題,學無止境嘛,遇到問題就要解決問題。
今天在用Mybatis+springMVC+spring做一個小練習,所有配置全部用的註解,之前對於Mybatis的學習,只是對配置方式掌握的還行,對於註解沒有學到位。這次又全部用註解,所以遇到一個問題,就是多表新增資料。之前只會多表聯查,練習的時候查詢也還不是很會,還得看之前寫過的例子,總結下來就是,自己用的太少,遺忘性有點大。
好了,接下來正式分析這次遇到的問題!
這次練習寫的是一個論壇網站,把顯示寫完之後是一個新增操作,顯示也是聯查查詢,之前沒有寫過用註解聯表新增,所以今天遇到就一臉懵逼。網上查也沒有查到個所以然,最後還是通過我們老姐給我講解,慢慢理解到了。
這裡總結下思路:由於是多表查詢,插入的資料是多個表裡面的部分列名,我們可以先把需要插入的資料封裝成一個Bean。由於表與表之間的主外來鍵關係,插入資料就得分先後順序,先插入沒有外來鍵一方的資料(封裝方法),再插入有外來鍵一方的資料(封裝方法)。在有外來鍵的一方,通過外來鍵將新生成的資料連線。怎麼產生聯絡呢?就是你先插入的資料已經生成一條記錄, 在資料庫裡就會產生一個ID,再到有外來鍵一方的方法中,通過外來鍵,將兩表建立聯絡。就會生成一個新的新增資料。
程式碼如下:
1:封裝Bean,這裡是兩個類中的一部分屬性
public class TopiceBean {
private String title; //標題
private String author; //作者
private String content; //類容
private Date submittime; //提交時間
private String forumname; //主題
private String manager; //版主
public String getTitle() {
return title;
}
public void setTitle(String title) {
this .title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getSubmittime() {
return submittime;
}
public void setSubmittime(Date submittime) {
this.submittime = submittime;
}
public String getForumname() {
return forumname;
}
public void setForumname(String forumname) {
this.forumname = forumname;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
}
2:先新增沒有外來鍵一方的數:mapper
@Insert("insert into tb_forum (forumname,manager) values(#{topiceBean.forumname},#{topiceBean.manager})")
public int addForumnameAndManager(@Param("topiceBean")TopiceBean topiceBean);
3:新增有主鍵一方的資料,這裡注意的是:外來鍵連線為新生成的ID,可以新增最大ID,通過子查詢
@Insert("insert into tb_topic (title,author,content,submittime,forumid) values(#{topiceBean.title},#{topiceBean.author},#{topiceBean.content},#{topiceBean.submittime},(select max(id) from tb_forum))")
public int addTopice(@Param("topiceBean")TopiceBean topiceBean);
4:編寫Dao層:
public int addTopic(TopiceBean topiceBean);
5:編寫Dao層實現類:通過springIOC容器控制反轉,依賴注入,需要把mapper全部注入進來,在方法裡,注意先後順序。
@Component
public class TopiceDaoImpl implements ITopiceDao{
@Autowired
private ITopiceMapper topiceMapper;
@Autowired
private IForumMapper forumMapper;
//新增帖子
@Override
public int addTopic(TopiceBean topiceBean) {
int result = forumMapper.addForumnameAndManager(topiceBean);
int result2 = topiceMapper.addTopice(topiceBean);
if(result>0 && result2>0) {
return 1;
}else {
return 0;
}
}
}
6:接下來就是業務介面,業務實現類,最後Controller頁面控制器,也是通過依賴注入,一層一層的呼叫。最後返回一個新增受影響行數。
以此記錄!