博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]后端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)
阅读量:6708 次
发布时间:2019-06-25

本文共 17576 字,大约阅读时间需要 58 分钟。

作者:Sumn 时间: 2018.7.28

余囊平平,业亦未精

0.基本介绍

0.1 Spring (由Rod Johnson创建的一个开源框架)

  Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。Spring的核心是和。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。(引自)

0.2 SpringMVC

  Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。(引自)

0.3 MyBatis

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(引自)

1.准备工作

  该项目是由基于Maven的web项目进行整合的,如何配置基于Maven的web项目 请参考我的上篇文章 项目完整目录结构如下图:

1.0 安装mysql数据库

  我这里使用的mysql版本是5.6.25,可视化工具用的是SQLYog,我在本地的mysql账号密码都是root(若放在服务器,千万别用此初始密码)。

  分享一些后台常用的软件安装包 密码:qlnq,里面有mysql安装包以及mysql可视化工具,当然你也可以自己去百度下。

1.1 新建一个数据库

  我使用的是SQLYog可视化工具,直接右键就可以创建一个新的数据库,并设置字符集为UTF-8

  创建一个User表,这里我们用到的字符集是utf8mb4而不是utf8,为的是兼容性,

1.1 IDEA插件安装

lombok插件:

另外lombok.jar能否适用于android参考Jake Wharton的这篇twitter (需要翻墙)

mybatis插件:

2.开始整合

2.0 使用maven引入所需的jar包

打开项目根目录的pom.xml文件

pom.xml

4.0.0
com.seeyou.sumn
SSMDemo
1.0-SNAPSHOT
war
SSMDemo Maven Webapp
http://www.example.com
4.0.2.RELEASE
3.2.6
1.7.7
1.2.17
junit
junit
3.8.1
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
1.2.2
javax
javaee-api
7.0
mysql
mysql-connector-java
5.1.30
commons-dbcp
commons-dbcp
1.2.2
jstl
jstl
1.2
log4j
log4j
${log4j.version}
com.alibaba
fastjson
1.1.41
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.projectlombok
lombok
1.16.6
commons-lang
commons-lang
2.6
org.codehaus.jackson
jackson-mapper-asl
1.9.13
com.fasterxml.jackson.core
jackson-core
2.7.0
com.fasterxml.jackson.core
jackson-databind
2.7.0
复制代码

  每次pom.xml加入新的jar或者更新jar版本的时候,一定要记得点击import Changes那样jar才会在你的项目中生效。

2.1 配置spring-mvc.xml

  在 resource文件夹中新建一个spring-mvc.xml

  作用:主要用于配置Controller的组件扫描器和视图解析器

spring-mvc.xml

text/plain;charset=UTF-8
text/html;charset=UTF-8
复制代码

2.2 配置jdbc.properties以及log4j.properties

  在 resource文件夹中新建一个jdbc.properties,这个文件是用于存储与mysql数据库连接的一些信息

jdbc.properties

#链接驱动driverClasss=com.mysql.jdbc.Driver#mysql地址jdbcUrl=jdbc:mysql://localhost:3306/ssmdemo#账号username=root#密码password=root#定义初始连接数initialSize=0#定义最大连接数maxActive=20#定义最大空闲maxIdle=20#定义最小空闲minIdle=1#定义最长等待时间maxWait=60000复制代码

  同样的在resource文件夹中新建一个log4j.properties,用户存储log配置的信息

log4j.properties

log4j.rootLogger=INFO,Console,File#控制台日志־log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.outlog4j.appender.Console.layout=org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n#mybatis显示SQL语句日志配置#这里填写你的mapper所在的包log4j.logger.com.seeyou.sssmdemo.mapper=DEBUG  #普通文件日志־log4j.appender.File=org.apache.log4j.RollingFileAppenderlog4j.appender.File.File=logs/SeeYou.loglog4j.appender.File.MaxFileSize=10MB#输出日志,如果换成DEBUG表示输出DEBUG以上级别日志־log4j.appender.File.Threshold=ALLlog4j.appender.File.layout=org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n复制代码

2.3配置spring-mybatis.xml文件

  在 resource文件夹中新建一个spring-mybatis.xml,并同时新建一个mapper文件夹,这一步主要是将spring和mybatis进行整合,主要的就是自动扫描,自动注入和配置数据库。

spring-mybatis.xml

复制代码

2.4将配置文件注册进web.xml文件中

  文件所在位置:src->main->webapp->WEB-INF->web.xml

  文件作用:web.xml文件是用来初始化配置信息,我将它理解为android中的AndroidManifest.xml,你只有在这里对spring-mybatis.xml以及spring-mvc.xml进行注册了,才能使其生效

web.xml

Archetype Created Web Application
contextConfigLocation
classpath:spring-mybatis.xml
log4jConfigLocation
classpath:log4j.properties
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
org.springframework.web.util.IntrospectorCleanupListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
/
/index.jsp
15
复制代码

  完成这一步,你的ssm框架雏形算是出来了,接下来试试写几个接口,并对数据库进行增删改查操作

3.编写接口并对数据库进行CRUD

3.0 创建实体类TUserDo.java

   在model这个包下创建一个与刚刚数据库中创建的表对应的实体类

TUserDo.java

//源自lombok库,通过注解以达到减少代码的Java库,如通过注解的方式减少get,set方法,构造方法等@Datapublic class TUserDo implements Serializable {    private static final long serialVersionUID = 1L;    private  int uid;    private  String uName;    private  int uAge;    private  String uSex;}复制代码

3.1 创建Mybatis java映射接口 TUserMapper.java

  该接口主要用于与映射文件进行交互,写上常用的CRUD方法,等下会和TUserMapper.xml中的映射语句一一对应。

//spring的注解,会自动创建类的实例@Repositorypublic interface TUserMapper {    /**     * insert selective.     */    int insertSelective(TUserDo record);    /**     * delete by primary key.     */    int deleteByPrimaryKey(TUserDo record);    /**     * select by primary key.     */    TUserDo selectByPrimaryKey(Long id);    /**     * update by primary key selective.     */    int updateByPrimaryKeySelective(TUserDo record);}复制代码

3.2 创建Mybatis 映射配置文件 TUserMapper.xml

  MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。(引自)

TUserMapper.xml

insert into user
u_name,
u_age,
u_sex,
#{uName,jdbcType=VARCHAR},
#{uAge,jdbcType=INTEGER},
#{uSex,jdbcType=VARCHAR},
delete from user where u_id = #{uid,jdbcType=BIGINT}
update user
u_name= #{uName,jdbcType=VARCHAR},
u_age=#{uAge,jdbcType=INTEGER},
u_sex=#{uSex,jdbcType=VARCHAR},
where u_id = #{uid,jdbcType=BIGINT}
复制代码

3.3 创建映射接口管理类 接口TUserManager.java 实现类 TUserManagerImpl.java

TUserManager.java

public interface TUserManager {    /**     * insert selective.     */    int insertSelective(TUserDo record);    /**     * delete by primary key.     */    int deleteByPrimaryKey(TUserDo record);    /**     * select by primary key.     */    TUserDo selectByPrimaryKey(Long id);    /**     * update by primary key selective.     */    int updateByPrimaryKeySelective(TUserDo record);}复制代码

TUserManagerImpl.java

//把普通pojo实例化到spring容器中,相当于配置文件中的
@Componentpublic class TUserManagerImpl implements TUserManager { //从spring中获取自动创建的实例 @Autowired protected TUserMapper tUserMapper; public int insertSelective(TUserDo record) { return tUserMapper.insertSelective(record); } public int deleteByPrimaryKey(TUserDo record) { return tUserMapper.deleteByPrimaryKey(record); } public TUserDo selectByPrimaryKey(Long id) { return tUserMapper.selectByPrimaryKey(id); } public int updateByPrimaryKeySelective(TUserDo record) { return tUserMapper.updateByPrimaryKeySelective(record); }}复制代码

3.4最后一步编写控制器类UserController.java

UserController.java

//声明控制器类@Controller/* * 相当于 http://你的ip:tomcat定义的端口(默认8080)/user/ * 例: http://192.168.17.52:8080/user/ * ip可以通过 win+R调出运行 输入cmd 在输入ipconfig 然后取IPv4地址 */@RequestMapping(value = "user")//lombok注解 自动生成log类@Log4jpublic class UserController {    @Autowired    TUserManager tUserManager;    /*     * 请求参数uName,uAge,uSex     */    // @ResponseBody:controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML    @ResponseBody    //相当于请求地址为http://192.168.17.52:8080/user/insert  请求方法为POST    @RequestMapping(value = "insert", method = RequestMethod.POST)    public String insert(HttpServletRequest request) {        log.info("执行增加");        //定义请求数        String uName = request.getParameter("uName");        int uAge = Integer.parseInt(request.getParameter("uAge"));        String uSex = request.getParameter("uSex");        log.info(uName+":"+uAge+":"+uSex);        TUserDo tUserDo = new TUserDo();        tUserDo.setUName(uName);        tUserDo.setUAge(uAge);        tUserDo.setUSex(uSex);        int i = tUserManager.insertSelective(tUserDo);        if (i > 0) {            return "添加成功";        } else {            return "添加失败";        }    }    /*     *请求参数:uid     */    @ResponseBody    @RequestMapping(value = "delete", method = RequestMethod.POST)    public String delete(HttpServletRequest request) {        log.info("执行删除");        int id = Integer.parseInt(request.getParameter("uid"));        log.info(id);        TUserDo tUserDo = new TUserDo();        tUserDo.setUid(id);        int i = tUserManager.deleteByPrimaryKey(tUserDo);        if (i > 0) {            return "删除成功";        } else {            return "删除失败";        }    }    /*     *请求参数:uid     */    @ResponseBody    @RequestMapping(value = "select", method = RequestMethod.POST)    public String select(HttpServletRequest request) {        log.info("执行查找");        int id = Integer.parseInt(request.getParameter("uid"));        log.info(id);        TUserDo tUserDo = tUserManager.selectByPrimaryKey(id);        JSONObject jsonObject = (JSONObject) JSON.toJSON(tUserDo);        return jsonObject.toJSONString();    }    /*     * 请求参数uName,uAge,uSex,id     */    @ResponseBody    @RequestMapping(value = "update", method = RequestMethod.POST)    public String update(HttpServletRequest request) {        log.info("执行修改");        int id = Integer.parseInt(request.getParameter("uid"));        String uName = request.getParameter("uName");        int uAge = Integer.parseInt(request.getParameter("uAge"));        String uSex = request.getParameter("uSex");        log.info(id+":"+uName+":"+uAge+":"+uSex);        TUserDo tUserDo = new TUserDo();        tUserDo.setUid(id);        tUserDo.setUName(uName);        tUserDo.setUAge(uAge);        tUserDo.setUSex(uSex);        int i = tUserManager.updateByPrimaryKeySelective(tUserDo);        if (i > 0) {            return "修改成功";        } else {            return "修改失败";        }    }}复制代码

4运行并调试

4.0 运行tomcat 如何运行可以参考我上篇文章

  当你的控制台弹出如下界面,并且浏览器自动打开了http://localhost:8080/ 说明运行成功了

4.1调试接口

   我这里使用的是(既可以作为接口调试工具,又可以作为抓包工具,神器,强推)

   如执行成功你会在mysql的表中看到你添加的数据,其他接口调试同理

   这里的localhost可以替换为你电脑的本地ip,如果你用android就必须使用ipv4地址,且电脑和手机在同一局域网

   这里在调试工具的url中输入中文你的tomcat会报如下错误

28-Jul-2018 13:41:53.167 信息 [http-nio-8080-exec-7] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687)	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)	at java.lang.Thread.run(Unknown Source)复制代码

网上查了下,大概原因是:

在tomcat 8.0.35之后 ,tomcat对url的参数做了比较规范的限制,必须按照RFC 7230 and RFC 3986规范,对于非保留字字符,如果不做转义处理,一律都会报The valid characters are defined in RFC 7230 and RFC 3986 错误。

   解决这个问题的办法有几个:

   把非保留字字符做转义

   就是使用保留字字符

   要么就是换比较底一点的tomcat版本

   将json数据进行urlencode编码就可以了 即把json中的{}编码

实际上,我在使用app请求时并未发现该错误,因为app的情求会对请求参数自动编码。

5 结尾

   如果遇到什么问题,可以进天星的群找我,有问必答。如果有哪些地方写的不好,不合理,也请大家指出并给出意见,谢谢

天星群号:557247785

转载地址:http://oublo.baihongyu.com/

你可能感兴趣的文章
93. [NOIP2001] 数的划分
查看>>
c++友元实现操作符重载
查看>>
LeetCode_Maximum Depth of Binary Tree
查看>>
MongoDB入门学习(一):MongoDB的安装和管理
查看>>
beans.factory.BeanCreationException beans.factory.annotation.Autowired(required=true)
查看>>
grep常见使用方法总结
查看>>
视频云的选型调研
查看>>
MySQL 性能调优的10个方法
查看>>
http协议的再次理解
查看>>
Android 利用Gson生成或解析json
查看>>
License友好的前端组件合集
查看>>
OCR 基本知识
查看>>
Oracle中对数字加汉字的排序(完好)
查看>>
Redis具体解释
查看>>
thinkphp中cookie和session中操作数组的方法
查看>>
rman备份OBSOLETE和EXPIRED参数来历及区别
查看>>
NewLife.Redis基础教程
查看>>
BlockingQueue(阻塞队列)详解
查看>>
Hystrix快速入门
查看>>
十大励志电影
查看>>