准备环境
1.创建新的模块brand_demo
引入坐标
2.创建三层架构的包结构
先新建一个maven项目
然后修改pom文件,将打包方式改为war,并且刷新
然后补全Web的文件夹
选择web.xml为3.0以上的都可以
然后把web-info拖到webapp下面
最终变成这样的结构
这样模块便创建完了,再来引入对应的坐标
<!-- tomcat-plugin-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
<dependencies>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- standard-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
3.创建数据库表tb_brand,创建过程不再赘述
4.把实体类Brand放在pojo层下面
由于实体类Brand可以用alt+ins来选择setter和getter以及tostring来解决便不再赘述
5.搭建MyBatis基础环境
- MyBatis-config.xml
- BrandMapper.xml
- BrandMapper接口
将mybatis-config.xml放在resources下面,作为mybatis的核心配置文件
并修改url与名字密码、文件夹名称、数据库名等,以及修改字符&useUnicode=true&characterEncoding=utf8
接下来是brandmapper映射文件
在resources下面创建对应文件夹,再把brandmapper放进去
这时候BrandMapper会报红,因为我们没有对应的映射接口,因此只要创建一个接口即可
制作功能
查询所有
分析:有个页面叫index.html
里面有个按钮,点击就会查询到数据表tb_brand
里面所有的数据
在Dao层,我们创建sql语句,并把结果封装成一个List集合,在Service层,我们调用brandmapper去返回这个结果,封装成一个方法来保证这些方法能复用,在Web层,我们将调用Service层的selectAll方法把数据库存到request并转发给jsp来遍历,而jsp执行遍历输出即可
首先,在mapper里面创建一个selectAll的方法
由于我们是把这个selectAll放到service层去重复调用的,所以我们需要在service文件夹里面创建一个service层,里面再写个selectAll方法来接收在dao层里面的selectAll方法
这时候我们还需要调用sqlsessionfactory,由于它是一个固定的配置,并且提供了一个叫做sqlSessionFactory
的方法来获取sqlSessionFactory对象的,因此我们复制粘贴到util文件夹下即可
package com.hoorus.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//静态代码块会随着类的加载而自动执行,且只执行一次
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
因此我们在service里面通过factory来获取sqlSessionFactory对象以及对方法进行调用
接下来写controller(web)层的代码
由于我们需要一个按钮来触发selectAll,因此需要写一个静态页面index.html
然后在java/web目录下创建一个servlet来接收来自刚刚index.html里那个按钮的响应
servlet的模板可以在设置中改
那么在这个servlet里面我们需要完成:
@WebServlet(name = "selectAllServlet", value = "/selectAllServlet")
public class selectAllServlet extends HttpServlet {
//1.调用BrandService完成查询
private BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Brand> brands = service.selectAll();
//2.存入request域中
request.setAttribute("brands", brands);
//3.转发到brand.jsp
request.getRequestDispatcher("/brand.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
这时存入request的数据就会被转发到brand.jsp中,这时我们写一个brand.jsp放在与index同级的目录下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr align="center">
<%--<td>${brand.id}</td>--%>
<td>${status.count}</td>
<td>${brand.brandName}</td>
<td>${brand.companyName}</td>
<td>${brand.ordered}</td>
<td>${brand.description}</td>
<c:if test="${brand.status == 1}">
<td>启用</td>
</c:if>
<c:if test="${brand.status != 1}">
<td>禁用</td>
</c:if>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
<hr>
</body>
</html>
然后我们启动项目,访问index页面
发现访问成功,但是我们品牌名称与企业名称没有值,想想也知道是因为数据库里的字段值与Dao层调用时候的名称不一样,解决办法:用一个resultmap映射一下,在resource包下面的mapper包里面的BrandMapper配置映射
然后就需要在对应的brandMapper映射里面来使用
加一句:@ResultMap("brandResultMap")
然后重启项目发现显示了名称
查询成功!