复杂的结构的加载过程
例如文章中需要关联用户基本信息表示文章作者
数据表情况
id( 文章编号 ) 、 u_id( 作者 id) 、 content( 文章内容 ) 、 pub_time( 发布时间 )
Java 类
public class Article {
// 文章编号
private int id;
// 文章内容
private String content;
// 发布时间
private String pubTime;
// 发布者
private User author;
...
}
定义数据接口:
@Mapper
public interface ArticleMapper {
public List<Article> getAllArticles();
}
接口配置:
<?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.example.springdemo.mapper.ArticleMapper">
<select id="getAllArticles" resultMap="articleResult">
select * from articles
</select>
<resultMap type="com.example.springdemo.bean.Article"
id="articleResult">
<id property="id" column="id" />
<result property="content" column="content" />
<result property="pubTime" column="pub_time" />
<association property="author" column="u_id"
javaType="com.example.springdemo.bean.User"
select="com.example.springdemo.mapper.UserMapper.getUserById">
</association>
</resultMap>
</mapper>
association 标签表示关联一个对象其中 select 属性就是通过子查询找到该对象内容
文件上传
可以在服务端中接收 MultipartFile 获取文件信息,比如注册时上传头像 ( 单个 )
@RequestMapping(value = "/regist", method = RequestMethod.POST)
public String regist(@RequestParam("nick") String userName,
@RequestParam("psw") String password, String sex,
Integer age, @RequestParam("photo") MultipartFile file) {
// 检测用户名是否存在
int count = userMapper.checkUserExist(userName);
if (count > 0) {
// 已经存在
return Commom.fail(" 用户名已存在 ");
} else {
String photoPath = "";
if (file != null && !file.isEmpty()) {
String fileName = System.currentTimeMillis() + ".jpg";
FileOutputStream out = null;
try {
out = new FileOutputStream(Commom.PHOTO_PATH + fileName);
byte[] bytes = file.getBytes();
out.write(bytes);
out.flush();
// 拟定一个相对路径保存在数据库中
photoPath = "/images/" + fileName;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
int r = userMapper.addUser(userName, password, sex, age,photoPath);
if (r > 0) {
return Commom.success(" 注册成功 ");
} else {
return Commom.fail(" 注册失败 ");
}
}
}
注意:数据库一般保存的是文件的相对地址,在需要下载的时候拼接下载地址,在服务端中关联绝对地址, springBoot 中可以添加如下的配置,来实现映射
@Configuration
public class FileConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 映射 将 /images/** -->file:/D:/photos/ registry.addResourceHandler("/images/**").addResourceLocations("file:/"+Commom.PHOTO_PATH);
super.addResourceHandlers(registry);
}
}
文件上传的通用处理
直接从 MultipartHttpServletRequest 中检测文件情况,依次遍历出上传的文件,
关键代码:
Map<String, MultipartFile> files = ((MultipartHttpServletRequest) request).getFileMap();
@RequestMapping(value = "/publish", method = RequestMethod.POST)
public String publishArticle(Integer user_id, String text, HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
sb.append("{\"text\":\"").append(text);
sb.append("\",\"images\":[");
// 填充图片地址
Map<String, MultipartFile> files = ((MultipartHttpServletRequest) request).getFileMap();
if (null != files) {
boolean isHasFiles = false;
// 使用迭代器遍历所上传的文件
Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, MultipartFile> entry = it.next();
// // 获取上传的参数
// String key = entry.getKey();
MultipartFile f = entry.getValue();
if (null != f && !f.isEmpty()) {
// 保存到 D:/photos/ 下
String fileName = System.currentTimeMillis() + ".jpg";
FileOutputStream out = null;
try {
out = new FileOutputStream(Commom.PHOTO_PATH + fileName);
out.write(f.getBytes());
out.flush();
// 记录相对路径
String path = "/images/" + fileName;
sb.append("\"").append(path).append("\",");
isHasFiles = true;
} catch (Exception e) {
} finally {
if (null != out) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
// ["/images/123.jpg","/images/456.jpg",
//abc,
if (isHasFiles) {
int len = sb.length();
sb.replace(len - 1, len, "");
}
}
sb.append("]}");
int r = articleMapper.addArticle(user_id, sb.toString(), String.valueOf(System.currentTimeMillis()));
if (r > 0) {
return Commom.success(" 发布成功 ");
} else {
return Commom.fail(" 发布失败 ");
}
}
这样文件的上传处理大致就完成了!租后说一下SpringBoot项目的打包
SpringBoot 项目的打包
1 、项目上有单击 –>Run As–>Run As Configration…
第一次进入时需要在左侧的列表中找到 maven build, 右单击 -->New ,分别输入
a 、在 Base directory 点击 Workspace 选择项目
b 、在 Name 中输入名称 ( 一般用项目名 )
c 、在 Goals 输入 package
2 、如果是有默认的编译过,则直接在配置界面上找到 Main ,在在 Goals 输入 package
3 、 Apply–>Run
4 、使用,在 target 文件夹下找到 xxx.jar 包,复制到要部署的文件夹中,进入控制台 (cmd), 进入 jar 包所在的位置,执行
java -jar xxx.jar
注意:处理 mybatis 的数据操作时, Mapper 接口的 xml 配置的包名以及文件名要跟 Mapper 接口的包名以及文件名相同,如:
com.example.springdemo.mapper.UserMapper.java 对应的配置为 com/example/springdemo/mapper/UserMapper.xml