在学ssm框架,自己瞎捉摸,看别人教程不如自己先试一下,以后看到更好的方法过来更新
我有一张用户表,一张消息表,消息表有两个字段发送者(sender)和接受者(sendee)存的是用户的ID
sendee字段可以为空,sender不为空
前端传入的值是发送者、接受者用户名,因此要先根据用户名查询用户,以便把用户ID插入消息表
首先创建用户和消息表的实体类(getset方法略去)
包com.pojo;
package com.pojo;
public class Message {
private int id;
private User sender;
private User sendee;
private String mess;
private String emo;
private Timestamp time;
}
package com.pojo;
public class User {
private int id;
private String username;
private String password;
private String nickname;
}
然后写sql语句,MessageMapper和UserMapper接口略去
包con.mapper
User.xml
<mapper namespace="com.mapper.UserMapper">
<select id="usernameGetUser" parameterType="String" resultType="com.pojo.User">
select * from user where username= #{username}
</mapper>
</select>
Message.java
<mapper namespace="com.mapper.MessageMapper">
<insert id="add" parameterType="com.pojo.Message" >
insert into message
<if test="sendee.id!=''">(sender,sendee,mess,emo,time) values (#{sender.id},#{sendee.id},#{mess},#{emo},#{time}) </if>
<if test="sendee.id==''">(sender,mess,emo,time) values (#{sender.id},#{mess},#{emo},#{time})</if>
</insert>
</mapper>
插入传入的值是message对象,其中含两个属性用户类对象sender和sendee的属性id直接写#{sender.id}就行了,因为sendee.id可以为空,写了个判断,如果为空就不插入sendee字段,否则会报外键的错( a foreign key constraint fails)
然后就是Message和user的服务类了
com.impl
@Service
public class MessageServiceImpl implements MessageService{
@Autowired
private MessageMapper messageMapper;
// 新增消息
public void addMess(Message message) {
messageMapper.add(message);
}
}
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
// 根据用户名放回用户
public User usernameGetUser(String username) {
User usermapper = userMapper.usernameGetUser(username);
// 如果参数为空或者没查到返回一个空的User
if(username==null||username.equals("")||usermapper==null){
return new User();
}
return usermapper;
}
}
用了Spring的自动装配,addMess()方法就是调用messageMapper的add()方法,传入message对象就行了;
usernameGetUser()方法就是根据用户名返回用户对象,如果没查到那么就返回一个空的User(否则sql语句中if判断语句会报错:(id,null))
然后就是控制类了
com.controller
@Controller
@RequestMapping
public class MessageController {
@Autowired
private MessageServiceImpl messageServiceImpl;
@Autowired
private UserServiceImpl userServiceImpl;
private Message message = new Message();
// 增加消息
@RequestMapping("/addMessage")
public void addMess(String sender,String sendee,String mess,String emo) {
Timestamp time = new Timestamp(new Date().getTime());
// System.out.println(time.toString());
message.setTime(time);
// 根据用户名查到用户赋值到message
message.setSender(userServiceImpl.usernameGetUser(sender));
message.setSendee(userServiceImpl.usernameGetUser(sendee));
message.setMess(mess);
message.setEmo(emo);
messageServiceImpl.addMess(message);
}
}
这样从addMessage路径过来的请求就能插入一条消息记录了,sender参数不能为空,sendee参数可以为空