Mybatis之新闻发布系统

使用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继续执行,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值