使用mybatis实现新闻项目
- 创建一个新的项目,使用maven中webapp模板
maven的定义
-
将之前使用servlet写的新闻项目中web文件下的除了webINFO的其他内容复制到webapp文件下
-
导入jar包:原新闻项目下的webINFO中lib下的所有jar包按照名字去maven仓库网站查询,在pom.xml中添加jar包依赖
其余jar包一一按照此方法添加依赖
- webINFO中设置默认打开的主页面
- main中创建java目录,存放dao层(去除实现类impl包只保留接口文件)、entity层、工具类,main下创建resources目录,存放配置文件
移入resources下
-
将数据库配置文件
database.properties
中的数据库表修改:
首先在navicat中找到此表
配置文件进行修改
-
mybatis-config.xml文件修改
-
resources中创建目录mapper
-
dao层中的接口名称需要修改,全部为xxxMapper
-
resources下的mapper中创建模板xxMapper,名称为接口文件名,并在namespace中进行接口文件位置指定
- 配置文件
mybatis-config.xml
进行mapper映射
如果mapper下的xml文件有如下报错,就alt+enter去下载这个文件
Mybatis改造持久层
与servlet写的项目结构相比,此处接口文件保持一致,但接口文件名称要改为xxMapper
,dao层中的继承接口的实现类全部使用resources下的mapper中的xml文件实现。
-
把dao层的实现类内容搬到mapper下的xml文件中,将测试要使用的创建
sqlsession
工具类移入dao层的utils目录下
-
用户映射:UserMapper.xml,将原dao层的实现类文件中的sql语句复制过来,并修改参数的传入,实现接口方法如下:
<select id="queryUser" resultType="User">
SELECT uid,uname,upwd from news_users where uname=#{userCode}
</select>
- 分类映射:TopicMapper.xml,实现接口方法如下:
- 新闻映射:NewsMapper.xml,多个参数的接口方法要加入注解
xml文件中写sql语句分页的注意事项:
#{}
是预编译,传进来的数据会加上“” 当做字符串处理,例如#{1}=“1” ,是无法计算分页的第一项参数(当前条数),因此需要使用${}
;
${}
就是字符串替换,直接替换占位符$
一般传入数据库对象 使用$
可能会造成sql注入 使用比较少
xml文件中写sql语句添加一条新闻的注意事项:
传入参数为一个新闻对象,添加新闻的sql语句中,问号处(value值)要与新闻对象的属性名一致,在数据库里面一列对应一个值,那么添加新闻的sql语句中:数据库中的列属性要的值 对应于 新闻对象的属性名的值
-
评论映射:CommentMapper.xml
-
main下创建test目录,test目录下创建包com.ScQ,容纳单元测试类进行测试
@Test
public void TestA(){
SqlSession sqlSession = MyBatisUtil.createSqlSession();
User user = sqlSession.getMapper(UserMapper.class).queryUser("admin");
System.out.println(user.getUname());
MyBatisUtil.closeSqlSession(sqlSession);
}
service业务层与servlet层的改装
- 先将原service与servlet包复制到java目录下的com.ScQ包下
- 对于service的接口方法使用继承接口的实现类进行内容实现:使用sqlsession进行mapper内方法的调用查询数据库获取结果。CommentServiceImpl.java
NewsServiceImpl.java:
TopicServiceImpl.java:
UserServiceImpl.java
注意事项:由于工具类创建sqlsession时,选择false,设置为手动提交事务,因此所有对于数据库改变的语句(增删改除了查询)全部要加入sqlsession.commit()
才能够改变数据库
- web.xml中配置我们在servlet层写的servlet文件,启动tomcat时可以识别到这些servlet文件
- 启动tomcat
断点调试
- 遇到一个报错如下: 首先看到是sql语句的问题,limit -10,10,那么就是分页sql语句的-10有问题,参数的问题,-10的结果出现在xml文件和servlet、serviceImpl调用方法传递参数中,因此排查这三处,查看xml文件sql语句书写没有问题、serviceImpl调用方法传递参数没有问题,因此在servlet中关于分页的代码处打入断点
debug模式重新启动tomcat,打开页面F9先放开,输入用户名和密码点击登录,直接跳转到错误页面,说明servlet没有找到错误处
看到报错下面显示16行有错误,因此在此文件第16行处打入断点
返回重新登录页面,点击登录后,idea中按F8查看代码的执行过程,F8执行到分页有值后,查看值的内容是否正确,可以看到总页数为空,那么就是此处出现了问题
可以推测是这个查询新闻总数的方法出现问题,而实现这个方法是在mapper里面的xml文件中实现的,因此去mapper里面的xml文件中对于这个方法进行查找,看看是否是sql语句写的不对
可以看到是条件的拼接没有放到if标签内造成的
也可以通过在test中对此方法进行测试,可以看到对这个方法具体的报错,此处也可以看到是参数传递的错误,如果我们传入一个空字符串,sql语句不应该拼接where,但是此处拼接,说明是xml中的sql语句书写错误
如果此时并未找到问题,查看到报错的页面位置
那么就在servlet里面index=3处打断点
F9放掉返回到16行断点处,F8继续执行,