文章目录
环境准备
此系统使用的环境为
- Eclipse
- jdk1.8
- .mysql数据库
- tomcat 8 .5
- 数据库工具:navicat
环境不会配置的请挪步到我的另一篇文章
eclipse离线搭建maven项目,配置本地仓库,并创建mybatis项目
问题分析
本案例将针对商品系统中的数据库 db_goods 中的商品表 tb_goods 做一个详细的展示,该表设计如下:
字段 | 类型 | 长度 | 非空 | 说明 |
---|---|---|---|---|
id | int | 11 | 是 | 主键、自增 |
name | varchar | 32 | 是 | 商品名称 |
price | decimal | (6,2) | 是 | 商品价格 |
store_number | int | 5 | 是 | 商品库存 |
goods_type | varchar | 6 | 是 | 商品类型(实物,虚拟交易物品) |
in_time | datetime | 是 | 商品入库时间 |
在本案例中,将针对该数据表实现增删改查。
实现
创建数据库、数据表、添加测试数据
打开mysql服务
方式1.使用指令打开mysql服务
net start mysql
方式2.从任务管理器中打开(适合小白)
打开任务管理,找到服务选项,往下一直划,找到mysql服务,如果状态显示停止,则右键该服务选择运行。
连接mysql并创建数据库
服务打开后,使用navicat软件进行连接。
从问题分析中,我们分析出,数据库名为db_goods,表名为tb_goods。
使用navicat软件创建数据库
输入数据库名,选择编码和排序规则。
创建完成后即在数据库列表栏多了一个数据库。
根据设计创建数据表
双击打开前面创建的数据db_goods。打开后颜色会发生变化,不再是灰色。然后右键选择新建表。
根据表的设计规则输入表的设计信息。其中id字段需要添加主键和自动递增两个设置。
表格设计完成,点击保存,在弹出的输入框内输入表名tb_goods(从问题中抽取出来的)。
点击确定后,该数据库内就会多出一个表。
添加测试数据
双击该tb_goods数据表进入该表的预览页面。点击面板下方的添加符号即可进行数据的添加。
备注:在录入数据时,由于id字段是自增的,所以不需要再该列输入值。
导出数据库脚本
当数据添加完成后,可以通过可视化操作导出数据库脚本。右键点击需要导出的数据库,选择转储SQL文件,类型为结构和数据。
存储位置选择桌面即可。
导出数据库的目的是为了保存当前设计的表和存储的数据内容。下次需要时可以将该脚本导入到数据库之中,即可使用。
项目实现
创建动态web项目
打开Eclipse,点击左上角的工具栏,找到File选项。找到Dynamic Web Project选项进行创建。
如果没有该选项,则找到最后一个Other选项。
在弹出框中先找到web目录进行展开,即可找到Dynamic Web Project选项了。
然后点击Next选项。
在弹出框内输入项目名即可。当然,其他那些默认配置有需要的请自行更改。
项目创建成功后,目录结构如下图所示。
项目创建完成后,导入此次案例需要的jar包。每个jar包对应的介绍如下
jar包 | 说明 |
---|---|
mysql-connector-java-5.1.14.jar | mysql连接的jar包 |
mybatis-3.4.6.jar | mybatis数据库框架所依赖的jar包 |
jstl-1.2.jar | jstl标签库,jsp页面中使用 |
standard-1.1.2.jar | 标准库,配合jstl标签库使用 |
将上述四个标签库添加至项目依赖目录,即WebContent目录下Web-Info内的lib文件夹下。
初次复制进来,需要右键选中这些标签,然后选择Build Path 选择Add to Build Path。将这些jar包添加至项目构建路径。否则是无法在项目中生效的。
配置mybatis
在项目的src目录下创建mybaits-config.xml文件。
其配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置实体类所在的包 -->
<typeAliases>
<package name="com.lvan.pojo"/>
</typeAliases>
<environments default="devlopment">
<environment id="devlopment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_goods"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件所在的包 -->
<mappers>
<package name="com.lvan.mapper"/>
</mappers>
</configuration>
其中主要记清楚两个包和mysql连接池的配置信息即可。
根据配置文件创建对应的包。
如上述结构即可。
根据数据表创建实体类
在pojo包下创建的对应的实体类。
类名命名规则一般为数据表前缀去掉,后续单词首字母大写,如有下划线的也去掉,下划线后的首字母大写。遵循驼峰式命名规则。
如tb_goods 的实体类名为Goods
像这种简单的案例的话,属性名保持和字段名一致即可。但是要注意数据类型兼容。
正常来说 decimal 对应double int 对应int 其他用String基本都可以实现兼容,但是不建议全使用String。
生成实体类中的封装方法
先生成setter和getter方法。
选下方的Generate按钮即可生成。
效果图如下。
生成toString方法
效果图如下
到这一步,实体类即创建完成。
接口编写
根据mybatis-config.xml配置文件所述,映射文件应该写在com.lvan.mapper包内,注意是使用的package标签才能声明扫描范围为包。如果使用mapper标签则需要指定到对应的mapper.xml文件。
在mapper包下,创建一个接口文件。
接口文件的名字为实体类名后跟Mapper 如下:
即在该接口文件中声明好要实现的方法即可。
根据需求,本案例中需要实现对商品表的增删改查。因此查询商品声明的接口如下:
下述是接口示例:
- 查询商品 根据关键词进行搜索,如果查询的内容为空字符,那么就为全部查询
List<Goods> query(@Param("key")String key);
- 更新商品 更新商品的话使用实体类对象进行更新,即该实体类对象有哪些属性就更改表的哪些字段
int updateGoods(Goods goods);
- 添加商品 添加商品也是要实体类对象进行添加,sql语句中使用对象的属性进行取值
int addGoods(Goods goods);
- 删除商品 删除商品是根据id进行删除,即删除指定编号的那条数据记录
int deleteGoods(@Param("id")String id);
- 根据id获取对应的实体对象,编辑商品时可以回显商品信息到页面
Goods getGoodsById(@Param("id")String id);
代码结构如下:
也即是上述接口声明完成后,基本可以实现对商品表的管理了。
映射文件编写
在上面的教程中,已根据案例所需编写了对应的接口。本节的内容是对上述接口进行一一实现。
- 创建接口对应的映射文件,后缀名是.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="xxx.xxx.XXXMapper">
</mapper>
注意:该文件名需要与接口文件名保持一致,否则会出现无法匹配等问题。
2. 绑定命名空间
需要保持接口文件和映射文件的文件名一致,可以理解为穿情侣装。
3. 实现接口
查询接口的实现
实现代码如下:
<?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文件就是对应的男朋友,女朋友负责吩咐,男朋友负责做事-->
<mapper namespace="com.lvan.mapper.GoodsMapper">
<!-- 查询 -->
<select id="query" resultType="Goods">
select * from tb_goods where name like concat('%',#{key},'%')
</select>
</mapper>
更新接口的实现:
更新接口的代码如下:
<!-- 更新商品的实现-->
<update id="updateGoods">
update tb_goods set
<if test="name!=null">
name=#{name},
</if>
<if test="price!=0.0">
price=#{price},
</if>
<if test="store_number!=0">
store_number=#{store_number},
</if>
<if test="goods_type!=null">
goods_type=#{goods_type},
</if>
<if test="in_time!=null">
in_time=#{in_time},
</if>
id=#{id}
where id=#{id}
</update>
添加接口的实现:
具体的实现代码如下:
<!-- 添加商品 -->
<insert id="addGoods">
insert int tb_goods(name,price,store_number,goods_type,in_time)
values (#{name},#{price},#{store_number},#{goods_type},now())
</insert>
- 删除接口实现
实现代码如下:
<delete id="deleteGoods">
delete from tb_goods where id=#{id}
</delete>
- 根据id获取指定商品接口实现
代码实现如下:
<!-- 获取指定id的商品 -->
<select id="getGoodsById" resultType="Goods">
select * from tb_goods where id=#{id}
</select>
测试实现的接口
- 编写SqlUtil工具包
创建com.lvan.util包 并创建测试类
- 编写测试所需的工具类
实现代码如下:
package com.lvan.util;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlUtil {
//1.声明静态的SqlSession对象 用于获取mysql连接
public static SqlSession sqlSession;
static {
try {
//2.读取mybatis配置文件
Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
//3.根据配置对象生成对应的工厂对象
SqlSessionFactory sf=new SqlSessionFactoryBuilder().build(reader);
//4.打开连接
sqlSession=sf.openSession();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(sqlSession);
}
}
- 编写测试用例
创建测试包,编写测试类
测试查询所有商品对象
package com.lvan.test;
import java.util.List;
import com.lvan.mapper.GoodsMapper;
import com.lvan.pojo.Goods;
import com.lvan.util.SqlUtil;
public class Test {
public static void main(String[] args) {
//获取接口对象 代理对象
GoodsMapper goodsMapper=SqlUtil.sqlSession.getMapper(GoodsMapper.class);
List<Goods> goods=goodsMapper.query("");//传递空值 查询所有
System.out.println("查询全部:"+goods);
}
}
运行截图如下:
搜索功能测试用例如下:
GoodsMapper goodsMapper=SqlUtil.sqlSession.getMapper(GoodsMapper.class);
List<Goods> goods=goodsMapper.query("Q");//传递空值 查询所有
System.out.println("关键词查询:"+goods);
运行结果如下:
其他功能便不再测试,各位看官自行根据接口需求编写测试用例。
实现页面
说明:使用一个IndexServlet 进行实现,不同的功能通过参数action进行区分
首先创建一个包,名为com.lvan.servlet 并在该包下创建一个IndexServlet
删除其他多余的不要的方法只保留一个doGet方法
主页内容渲染
- 实现跳转到主页的功能
实现步骤:
1.1 定义全局代理对象
设置编码规则和响应类型
//设置编码规则
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//设置响应的内容类型
response.setContentType("text/html");
1.1 取action参数 如果不存在,则代表去首页
1.2 编写页面
在Web-content目录下创建一个index.jsp页面
更改编码规则:
改为下面的这个
编写表格标签,用户渲染数据 根据实体类的属性声明对应的表头 以及操作列
渲染数据之前,需要导入c:foreach标签所需要的标签库
这样就实现了页面数据的渲染
效果图如下:
1.3 搜索功能实现
定义:传入的action值为search 则代表搜索 search可以自定义
在表格前面加一个搜索栏 内容如下。
测试效果如下:
1.4 删除操作
页面中添加删除按钮 注意请求路径是/项目名/服务名
测试:
点击编号为4的那一项
回到主页刷新