一、创建数据库表

打开Navicat Premium,点击左上角连接,选择mysql

 

输入你的数据库用户名和密码信息,可以先点击下测试连接,如果显示连接成功,说明能连接到数据库,然后点击确定。如果显示1045类的错误,估计你数据库服务没打开。然后再左侧localhost_3306右键新建数据库,输入新建的数据库名,选择utf-8字符集,然后确定。

点击查询----新建查询

输入以下sql代码:

create table t_user (
id int primary key AUTO_INCREMENT,
username varchar(30),
password varchar(32),
last_visit datetime
) ENGINE=InnoDB;

这里ENGINE=InnoDB代表我们的表是支持事务的,主键id我们设置自增长。

然后左侧表,右键刷新,t_user表就创建成功了。last_visit字段代表最后访问时间,其他字段不用解释大家也知道。

二、代码讲解

1、首先我们需要定义一个用来封装数据库表字段的pojo,这里我们创建了一个User类,属性和t_user表字段对应。

2、我们在dao层定义我们的接口方法,包括查询用户,插入用户,更新最后访问时间。

3、创建mapper文件,mapper文件的命名必须和接口的命名一致(例如UserMapper.java和UserMapper.xml)

上面mapper文件的定义中,用查询用户sql来举例,id="findUserByUserName" 代表方法名称,parameterType="string"代表方法的参数类型,string可以直接小写,因为它是mybatis自定义的别名(基本数据类型都可以小写),当然你也可以直接写java.lang.String。resultType="user",这里的user代表的是com.neu.pojo.User,这里之所以可以直接用类名小写表示全限定类名,是因为在sqlMapConfig.xml文件中配置了批量定义别名,意思就是在com.neu.pojo包下的类在mapper文件中都可以用类名小写来表示。如果不配置,必须写全限定类名com.neu.pojo.User。

还有要注意的一点:如果传入的参数类型(parameterType)是pojo类型,那么#{}中的变量名称必须是pojo中对应的属性,例如用户注册和更新最后访问时间对应的sql语句中#{}的变量必须是User类中的属性,为了保持良好的编码习惯,不管我们传入的是什么类型的参数,都尽量和pojo的属性保持一致,例如查询用户对应的sql语句,虽然传入的参数是string类型,但是我们也使用了#{username}。

4、配置applicationContext-dao.xml

有了上面的mapper文件和pojo后,我们就可以配置dao层的spring文件了,在此之前,我们先配置下数据库的连接信息

在db.properties文件中我们配置了数据库的用户名,密码,驱动,url信息。之所以把这些信息抽取到外部文件,是为了方便管理。然后我们去配置下dao层的spring文件

【1中配置】加载刚才的db.properties文件,【2中配置】引用了db.properties定义的字段,配置连接源,只有配置了【1中配置】的<context:property-placeholder>标签,在【2中配置】才可以使用${}符号引用jdbc.username等字段。【3中配置】是让mybatis来管理我们的数据库,需要指定数据源和mybatis的配置文件。【4中配置】用来扫描mapper,需要指定接口所在的包位置。

5、创建业务代码

在com.neu.service.UserService类中我们实现了三个业务方法。首先需要让spring自动注入一个UserMapper接口类型对象

@Autowired代表按照类型注入,这里其实注入的是个代理对象,spring怎么能自动注入呢?我们需要在service层的spring配置文件中进行配置,来看applicationContext-service.xml

这里我们配置了注解扫描,意思就是扫描此包下所有类的中的注解,至于如何注入就是spring帮我们完成了。在刚才的业务类中,我们还需要在类上加上@Service注解,spring底层会自动为我们创建实例,待会controller层需要自动注入这个实例。

然后我们就可以使用userMapper来定义业务代码了

6、配置事务

在实际的开发环境中,我们需要为service层的方法加上事务管理,这个很好理解,例如我们的业务涉及到转账操作,转账业务至少包括两个sql语句,一个是加钱操作,一个是减钱操作,那么这两个操作必须都成功执行才能提交事务,否则就必须回滚事务。来看下applicationContext-transaction.xml

【1】中配置了事务管理器,需要指定数据源。【2】中定义了切面,切面由切点和增强两部分组成,切点用来确定哪些方法需要增强,增强包括增强逻辑和切点的方位信息。切面的意思就是,我们需要在哪个方法的哪个位置执行哪个增强代码,举个例子,我们在addUser(User user)方法执行前开启事务,在方法执行后提交或者回滚事务,addUser(User user)这个方法就是切点,开启事务和提交事务或者回滚事务对应的代码就是增强逻辑,而方法执行前或者执行后就代表方位信息。pointcut="execution(* com.neu.service.*.*(..))"代表切点,execution()是固定写法,第一个*代表方法的返回值,com.neu.service.*.*(..)中第一个*代表这个包下的所有类,第二个*代表类中所有的方法,..代表参数任意。所以com.neu.service.UserService下的所有方法都会被增强,【3】中定义增强,需要一个事务管理器属性。就是【1】中定义的,然后就是事务属性的配置,不同的方法名开头的方法定义了不同的事务传播行为,具体代表什么意思还需读者自行查询书籍或者资料,一两句话说不清。

7、创建controller

在controller中我们需要注入service,因为我们需要调用业务代码,前面是不是说了这里要用的。spring自动创建的UserService实例会注入进来,这里的controller类需要加上@Controller注解,目的也是让spring为我们自动创建实例,然后调用对应的handler。spring为什么能够自动创建controller呢,当然我们需要配置注解扫描了,来看springmvc.xml

上面的配置就会扫描com.neu.controller包下所有带注解的类,继续看配置:

【2】的配置没什么好解释的,就是配置最新的处理器映射器和处理器适配器。【3】中配置视图解析器,prefix代表前缀,suffix代表后缀,例如我们在controller中返回一个index.jsp页面,那么我们直接写return "index"就可以了,视图解析器就会知道我们要返回的是WEB-INF/jsp/index.jsp这个页面。springmvc.xml文件中还有【4】【5】配置,我们待会再讲!继续看controller

当我们在浏览器输入http://localhost:8080/的时候,这个请求就会映射到index()方法,同理输入http://localhost:8080/login和http://localhost:8080/register就会分别映射到showLogin()和showRegister方法。那么凭什么你说映射就映射,当然了,我们需要配置url的拦截形式,来看web.xml配置文件。

这里我们的url拦截形式是/,意思就是除了jsp页面之外,所有的资源都会拦截,注意我说的是所有资源,包括静态资源(css,js等)。所以当我们输入http://localhost:8080/或者http://localhost:8080/login的时候,DispatcherServlet对请求url进行解析,就会得到请求资源标示符/或者/login,然后就能够在controller中查找到对应的handler,这个时候对应的方法也就匹配上了,然后就执行,返回页面,让视图解析器去解析你返回的到底是哪个jsp,解析完之后再进行渲染,最后响应浏览器。读者可能疑惑,为什么url中没有工程名com-neu-web,这是因为我们在pom文件中配置了,在配置tomcat插件那个位置,只要配置了<path>/</path>就可以在url中不写工程名。还有一点说下,这里springmvc的处理请求流程说的比较简单,详细的请求过程会在第三部分细说。

8、web.xml配置

有了以上的配置和代码后,我们就可以在web.xml中去加载这些配置文件了

【1】是配置post乱码过滤器,【2】是加载spring的配置文件classpath:spring/applicationContext-*.xml,这里的使用*代表会加载以下三个文件:

三、启动项目

至此,我们的项目就可以启动了,主页和登录还有注册页面都可以显示了。这里只是显示,功能我们还没讲,我会在第三部分继续讲解。右键com-neu-web项目,选择run as  ,  选择maven build...,然后再Goals中输入clean tomcat7:run  点击run

看到如下信息说明启动成功:

在浏览器访问: http://localhost:8080/  ,我们的主页就出来了,看见这个小熊就说明访问成功!

点击请先登录,会跳转到登录页面,来我们点点试试,看看登录页面。

然后再点击Create Account试试,注册页面也就出来了。

先到这停吧,剩下的内容我会在第三部分继续讲解!

Spring,Mybatis,Springmvc框架整合项目(第二部分)的更多相关文章

  1. Spring,Mybatis,Springmvc框架整合项目(第一部分)

    一.说在前面的话 本篇博文实现一个注册登录小项目,使用spring,mybatis,springmvc框架进行整合,我们创建的是一个maven工程,主要是方便jar包版本的管理.项目使用eclispe ...

  2. Spring+mybatis+struts框架整合的配置具体解释

    学了非常久的spring+mybatis+struts.一直都是单个的用他们,或者是两两组合用过,今天总算整合到一起了,配置起来有点麻烦.可是配置完一次之后.就轻松多了,那么框架整合配置具体解释例如以 ...

  3. Spring,Mybatis,Springmvc框架整合项目(第三部分)

    一.静态资源不拦截 第二部分最后显示的几个页面其实都加载了css和js等文件,要不然不会显示的那么好看(假装好看吧),前面已经说了,我们在web.xml中配置了url的拦截形式是/,那么Dispatc ...

  4. SSM(SpringMVC+Spring+MyBatis)三大框架使用Maven快速搭建整合(实现数据库数据到页面进行展示)

    本文介绍使用SpringMVC+Spring+MyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程. 技术选型:SpringMVC+Spring+M ...

  5. SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...

  6. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  7. SpringMVC+Spring+Mybatis+Maven+mysql整合

    一.准备工作1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:htt ...

  8. (一)springmvc+spring+mybatis+maven框架搭建

    (一)springmvc+spring+mybatis+maven框架搭建 1.说明 工作之余,为了学习点东西.先搭建个框架. 以后要往里面加东西,比如rabbitMQ.redis.shiro等. 也 ...

  9. spring + Mybatis + pageHelper + druid 整合源码分享

    springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis  ...

随机推荐

  1. HDU6440(费马小定理)

    其实我读题都懵逼--他给出一个素数p,让你设计一种加和乘的运算使得\[(m+n)^p = m^p+n^p\] 答案是设计成%p意义下的加法和乘法,这样:\[(m+n)^p\ \%\ p = m+n\] ...

  2. Virtual Judge使用指南

    https://cn.vjudge.net/ Virtual Judge并不是常规的Online Judge平台,他通过爬取其他OJ的题目,让我们可以直接在VJ上查找并提交各种OJ的题目,然后将我们的 ...

  3. shell脚本由基础变量及特殊变量($@、$*、$#等)到实战。

    一.shell脚本建立: shell脚本通常是在编辑器(如vi/vim)中编写,也可以在命令行中直接执行: 1.脚本开头:     规范的脚本第一行需要指出有哪个程序(解释器)来执行脚本中的内容,在L ...

  4. Mybatis中的复合条件查询

    1.Map中根据字段名存儲: 定义接口:List<Student> selectByCondition1(Map<String,Object> map); 映射文件: < ...

  5. mongodb 原子操作findAndModify

    原子操作模型数据findAndModify 推荐的方法,以保持原子将保留所有的相关信息,这些信息经常更新,一个文档中使用嵌入文档.这将确保所有的更新为一个单一文档是原子. 考虑下面的 products ...

  6. 洛谷P2827 蚯蚓(单调队列)

    题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...

  7. POJ 3162 Walking Race (树的直径,单调队列)

    题意:给定一棵带边权的n个节点的树,首先要求出每个点的最长路,然后写成序列d[1],d[2]...d[n],然后求满足 区间最大值-区间最小值<=k 的最大区间长度为多少? 思路: 分两步进行: ...

  8. 洛谷 P1181 数列分段Section I(水题日常)

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...

  9. Codeforces Round #317 (Div. 2) C Lengthening Sticks (组合,数学)

    一个合法的三角形的充要条件是a<b+c,其中a为最长的一边,可以考虑找出所有不满足的情况然后用总方案减去不合法的情况. 对于一个给定的总长度tl(一定要分完,因为是枚举tl,不分配的长度已经考虑 ...

  10. UVA116 Unidirectional TSP 单向TSP

    分阶段的DAG,注意字典序的处理和路径的保存. 定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移. #include<bits/stdc++.h ...