今天是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页面控制器,也是通过依赖注入,一层一层的调用。最后返回一个添加受影响行数。
以此记录!