Elevator
这里结合我最近在做的私信来说一下吧
环境
IDE: IDEA 2020.01
JDK: 1.8
SQL : MySQL 5.5
引入依赖
在pom文件中添加依赖,并在右上角点击即可
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
等到更新完成后可以在右方的maven中点击Dependencies进行查看依赖的引入。
application.properties
配置MySQL的相关
spring.datasource.url=jdbc:mysql:///doctor?characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=yourName
spring.datasource.password=yourPassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Bean
这里的@Data 注解就使用到了我们前面的 lombok 依赖,它可以自动帮你生成getter/setter以及 toString 方法
@Data
public class Message {
private String id;
private String sender;
private String receiver;
private String content;
private Long gmtCreate;
private Integer hasRead;
private String forUser;
}
如果你没有下载过 lombok 的插件,你可以点击 File -> Settings -> Plugins ,并下载相关的插件,否则你在使用 get/set 方法的时候会爆红(但是程序可以正常运行,不太雅观)
xxxMapper 和 xxxMapper.xml
MyBatis的相关知识你可以去自行百度了解一下,这里不再进行赘述。
这是我们 mapper 文件中的两个操作,插入和查找。
我们可以看到在插入的时候是可以直接写对象的,而不是将参数一个个在方法中写出并在 SQL 语句中对应赋值。如果采用笔者这种写法的话,需要把 values 后的赋值顺序弄清楚,否则会出现顺序错乱。当然你也可以在 values 前加上 (列1,列2 …)
@Mapper
public interface MessageMapper {
@Insert("insert into message values (#{id},#{sender},#{receiver},#{gmtCreate},#{content},#{hasRead},#{forUser})")
public void insertMsg(Message message);
public List<Message> selectMessages(@Param("sender") String sender,
@Param("receiver")String receiver,
@Param("forUser")String forUser);
}
第一个 Insert 是使用了注解,记得使用 Mapper 文件的注解 @Mapper
第二个 Select 是使用 xml 文件配置,你可以参考以下进行配置:
<?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.youyiwen.Mapper.MessageMapper">
<select id="selectMessages" resultType="com.youyiwen.Bean.Message">
select * from message where
((sender = #{sender} and receiver = #{receiver}) or (sender = #{receiver} and receiver = #{sender}))
and for_user = #{forUser}
order by gmt_create
</select>
</mapper>
需要注意的一点是 在返回一个 List 的时候,xml 文件中的 resultType 仍然是个体对象
MessageDTO
DTO 将在展示的时候用到,如果不需要则可以直接跳过。
@Data
public class MessageDTO {
private Message message;
private User sender;
private User receiver;
}
MessageService
public interface MessageService {
public List<MessageDTO> messagesList(String sender, String receiver,String forUser);
}
MessageServiceImpl
面向对象,面向接口
这里注意要加@Service,否则的话,就找不到 Service 了
还有在引入 Mapper 文件,要使用@Autowired 自动注入,虽然会出现波浪线,但是没有关系的!
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private MessageMapper messageMapper;
@Autowired
private UserMapper userMapper;
@Override
public List<MessageDTO> messagesList(String sender,String receiver,String forUser) {
List<MessageDTO> list = new ArrayList<>();
List<Message> messagesList = messageMapper.selectMessages(sender,receiver,forUser);
for (Message message : messagesList) {
MessageDTO messageDTO = new MessageDTO();
User senderUser = userMapper.selectUserByName(message.getSender());
User receiveUser = userMapper.selectUserByName(message.getReceiver());
messageDTO.setMessage(message);
messageDTO.setSender(senderUser);
messageDTO.setReceiver(receiveUser);
list.add(messageDTO);
}
return list;
}
}
MessageController
鉴于MessageController中有一堆不相关的内容,这里只给出使用到的部分。
@Autowired
private MessageService messageService;
@GetMapping("/userCenter/communicate/{receiver}")
public String chatWithOthers(@PathVariable("receiver") String receiver,
Model model, HttpSession session) {
List<MessageDTO> list = messageService.messagesList(sender, receiver, sender);
model.addAttribute("messages", list);
return "communicate";
}
结果展示
这里的结果牵扯到我的另一篇文章,如果你有兴趣的话可以去看一下另一篇文章
ajax 长轮询实现 私信(聊天)功能
有疑问请看这里
鉴于笔者水平限制,如果您在文中对笔者的某些描述有所疑惑或发现错误,欢迎在评论或私信中指出。