使用springmvc+mybatis实现增删改查并进行登录注册功能

一、第一次使用springmvc+mybatis整合出的框架,使用的是maven版本

1.使用maven有以下主要要创建maven文件夹,导入maven包并进行配置环境变量,在后面的文章中会提到maven配置。使用maven主要是依赖其pom.xml配置文件进行导入jar包的操作,浏览器打开:mvnrepository.com搜索包就可以了,在<dependency>标签中加入搜索出的链接会自动进行下载。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>wb.cn</groupId>
  <artifactId>springDemo</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>springDemo Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>4.3.3.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
    <aspectj.version>1.8.9</aspectj.version>
    <jackson.json.version>2.7.4</jackson.json.version>
    <fasterxml.jackson.version>2.7.4</fasterxml.jackson.version>
    <codehaus.woodstox.version>4.4.1</codehaus.woodstox.version>
  </properties>




  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- servlet/ jstl -->
    <dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.1.0</version>
	    <scope>provided</scope>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>
	
	<dependency>
	    <groupId>jstl</groupId>
	    <artifactId>jstl</artifactId>
	    <version>1.2</version>
	</dependency>
    
    <!-- spring -->
    <dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-core</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aop</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-web</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-oxm</artifactId>
		<version>${spring.version}</version>
	</dependency>
	
		<!-- jackson json -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-core</artifactId>
		<version>${jackson.json.version}</version>
	</dependency>
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-databind</artifactId>
	    <version>${jackson.json.version}</version>
  	</dependency>
  	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-annotations</artifactId>
		<version>${jackson.json.version}</version>
	</dependency>
	<!-- jackson xml -->
	<dependency>
		<groupId>com.fasterxml.jackson.dataformat</groupId>
		<artifactId>jackson-dataformat-xml</artifactId>
		<version>${fasterxml.jackson.version}</version>
	</dependency>
	<dependency>
		<groupId>org.codehaus.woodstox</groupId>
		<artifactId>woodstox-core-asl</artifactId>
		<version>${codehaus.woodstox.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.hibernate</groupId>
	    <artifactId>hibernate-validator</artifactId>
	    <version>5.2.4.Final</version>
	</dependency>
	
	<dependency>
	    <groupId>commons-fileupload</groupId>
	    <artifactId>commons-fileupload</artifactId>
	    <version>1.3.2</version>
	</dependency>
	
	<dependency>
	    <groupId>org.aspectj</groupId>
	    <artifactId>aspectjweaver</artifactId>
	    <version>${aspectj.version}</version>
	</dependency>
	
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-test</artifactId>
	    <version>${spring.version}</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	<!-- mybatis -->
	<dependency>
    <groupId>com.mchange</groupId>
	    <artifactId>c3p0</artifactId>
	    <version>0.9.5.2</version>
	</dependency>
	
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis</artifactId>
		<version>3.4.1</version>
	</dependency>
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis-spring</artifactId>
	    <version>1.3.0</version>
	</dependency>
	
	<!-- 日志 -->
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-api</artifactId>
	    <version>1.7.21</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-core</artifactId>
	    <version>1.1.7</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-classic</artifactId>
	    <version>1.1.7</version>
	</dependency>
	<dependency>
	    <groupId>ch.qos.logback</groupId>
	    <artifactId>logback-access</artifactId>
	    <version>1.1.7</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.6</version>
</dependency>
	
  </dependencies>
  <build>
    <finalName>sprintmvc-mybaitis</finalName>
    
    <plugins>
			<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>1.3.5</version>
				<configuration>
					<configurationFile>src/main/resources/generator.xml</configurationFile>
					<verbose>true</verbose>
					<overwrite>true</overwrite>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>org.mybatis.generator</groupId>
						<artifactId>mybatis-generator-core</artifactId>
						<version>1.3.5</version>
					</dependency>
				</dependencies>
			</plugin>
		</plugins>
  </build>
</project>



2.在这里使用的是mybatis代码生成器,可以生成出mapper、mapper.xml以及model层,具体使用配置在generator.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
	<!--
	
		java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
	
	-->

    <!-- 数据库驱动包位置 -->
    <classPathEntry location="D:\maven\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar" /> 
    <!-- <classPathEntry location="C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar" />-->
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!-- 数据库链接URL、用户名、密码 -->
         <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/bpmx33" userId="root" password="123456"> 
        <!--<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver" connectionURL="jdbc:oraclF:thin:@localhost:1521:orcl" userId="msa" password="msa">-->
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成实体类的包名和位置,这里配置将生成的实体类放在me.gacl.domain这个包下 -->
        <javaModelGenerator targetPackage="lyb.cn.ssm.model" targetProject="C:\Users\Administrator\Desktop\springDeom\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成的SQL映射文件包名和位置,这里配置将生成的SQL映射文件放在me.gacl.mapping这个包下 -->
        <sqlMapGenerator targetPackage="lyb.cn.ssm.mapper" targetProject="C:\Users\Administrator\Desktop\springDeom\src\main\java">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置,这里配置将生成的dao类放在me.gacl.dao这个包下 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="lyb.cn.ssm.dao" targetProject="C:\Users\Administrator\Desktop\springDeom\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成那些表(更改tableName和domainObjectName就可以) -->
        <table tableName="w_test" domainObjectName="Test" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
        

       
    </context>
</generatorConfiguration>

配置好自己的表名,然后再右键pom.xml,选择run as maven build path,输入mybatis-generator:generate从而实现代码生成功能,其他mybatis.xml以及spring和springmvc配置文件会在之后的源代码中,可以进行参考。

3.之后就要自己创建controller层来进行控制层的功能

(1)在controller层遇到的问题及注意事项

a.要设置@controller注解,告诉springmvc这是控制类层,才可以读取到该层

b.使用了@Autowired来进行自动注入了mapper层,具体@Autowired和@Resource区别可参考其他博客

c.对于@RequestMapping的使用

我这次只使用了几种方式,如@RequestMapping("方法名")、@RequestMapping(value="/方法名",method=RequestMethod.POST)后面加方法的这种,不过method方法在从前台数据通过表单post方法传递过来时method写post可以,但从后台controller传递到前台时写post会报错,不知道什么原因,改为了get方法.而且当使用了后面跟method这种方法时,String类型的方法不能返回到页面只能返回到controller方法中

4.Controller层方法

a.               list方法,进行查询出所有的数据返回到列表中

@RequestMapping("list")
	public ModelAndView testList(ModelAndView m){
		//System.out.println(t1.selectByPrimaryKey(10000000160001L));
		List<Test> list = new ArrayList<Test>();
		list = t1.selectList();
		m.addObject("list", list);
		m.addObject("test", "123");
		for(int i = 0;i<list.size();i++){
			System.out.println(list.get(i).getfXm());
		}
		m.setViewName("ui");
		return m;	
	}

需要注意的,参数为ModelAndView进行参数的传递,t1为前面通过自动注入得到的mapper类,ModelAndView可以通过m.addObject来进行对list的传递,类似以前servlet中的setAttribute封装,当使用ModelAndView时可以通过其方法m.setViewName(“”)来进行页面的跳转括号内为跳转的页面名称,最后return返回的值为m;

在跳转的ui.jsp采用的是easyui布局结合css,其中接受值通过EL表达式

<div id="content" region="center" title="数据汇总"
			style="padding: 20px; ">
			<div>
				<ul>
				<a href="add1"><input type = "button" value = "添加"></a>
				<a href="index"><input type = "button" value = "返回登录"></a>
				</ul>
				<table class="tablelist" style="width: 800px; height: 400px;"
					data-options="rownumbers:true,singleSelect:true,selectOnCheck:false,checkOnSelect:false,pagination:true,pageSize:20,url:'',method:'get',striped:true,rowStyler:setRowBgColor">
					<thead>
						<tr>
							<th>选择</th>
							<th>姓名</th>
							<th>性别</th>
							<th>年龄</th>
							<th>爱好</th>
							<th>日期</th>
							<th>操作</th>
						</tr>
					</thead>
					<tbody>
					<c:forEach items="${list}" var="Bean">

						<tr class="odd">
							<td><input type="radio" name="Id" value="${Bean.id }"></td>
							<td><a href="edit?id=${Bean.id}" dir="ltr" title="点击查看详情"
								onclick="">${Bean.fXm }</a></td>
							<td>${Bean.fXb }</td>
							<td>${Bean.fNl }</td>
							<td>${Bean.fDxk }</td>
							<%-- <td>${Bean.fRq }</td> --%>
							<td><fmt:formatDate value="${Bean.fRq}" pattern="yyyy-MM-dd" />
							</td>
							<td><a href="del?id=${Bean.id}" dir="ltr" onclick="">删除</a></td>
						</tr>
					</c:forEach>

					<c:if test="${empty list}">
						<tr class="odd">
							<td colspan="5" align="center">没有查询到相关记录!</td>
						</tr>
					</c:if>
				</tbody>
				</table>
			</div>
		</div>

b.编辑方法edit,前台点击名字传递一个a标签的href指向一个edit方法,跳转到了controller中的edit方法,同时把该条信息的id传递过来

@RequestMapping(value="/edit",method=RequestMethod.GET)
	public ModelAndView edit(Long id,ModelAndView m,HttpServletRequest request) throws Exception
	{
		System.out.println("进入edit方法");
		//String fXm = request.getParameter("fXm");
		Test t  = t1.selectByPrimaryKey(id);
		m.setViewName("edit");
		m.addObject("t", t);
		System.out.println(t);

		return m;
	
		
	}
对应的mapper是通过id查找信息的dao方法,返回一个对象,并跳转到edit页面中

<div class="row-fluid">
		<div class="span12">
			<form action="save" method="post">
				
				<fieldset>
					 <legend>id</legend> <input type="text"  name="id" value="${t.id} " /> 
					  <legend>名称</legend> <input type="text" name="fXm" value="${t.fXm}"/> 
					   <legend>性别</legend> <input type="text"  name="fXb" value="${t.fXb }"/> 
					    <legend>年龄</legend> <input type="text"  name="fNl" value="${t.fNl }"/>
					    <legend>日期</legend> <input type="text"  name="fRq" value="<fmt:formatDate value="${t.fRq}"  pattern="yyyy-MM-dd"  />"/> 
					    <legend>爱好</legend> <input type="text"  name="fDxk" value="${t.fDxk }"/>
					    <button type="submit" class="btn">提交</button>
				</fieldset>
			</form>
			
		</div>
	</div>

在一个form表单中得到通过对象.出来的信息,然后跳转到controller层中的save方法进行修改操作保存

@RequestMapping(value="/save",method=RequestMethod.POST)
	public String save(ModelAndView m,Test t){
		
		t1.updateByPrimaryKeySelective(t);
		//t1.updateByPrimaryKey(t);
		System.out.println("执行了更新方法");

		// t1.insert(t);
		 
		 //t1.updateByPrimaryKey(t);
		
		//m.setViewName("list");
		//m.addObject("", attributeValue)
		 return "redirect:list";
	}
这里是进行了一个通过对象来执行更新操作。之后return的方法redirect意思是跳转到controller中的方法list,又进行一次查询列表的操作。

c.添加操作add1,在前面ui.jsp页面有链接指向添加操作,为add1

@RequestMapping(value="/add1",method=RequestMethod.GET)
	public ModelAndView add1(ModelAndView m,Test t){
		System.out.println("进入了add1方法");
		m.setViewName("add");
		m.addObject(t);
		return m;
		
	}

这时跳转到了add.jsp页面中

<form action="add" method="post">
				<fieldset>
					 <legend>id</legend> <input type="text" name="id" />
					  <legend>名称</legend> <input type="text" name="fXm" /> 
					   <legend>性别</legend> <input type="text"  name="fXb" /> 
					    <legend>年龄</legend> <input type="text"  name="fNl" />
					     <legend>爱好</legend> <input type="text"  name="fDxk" />
					    <legend>日期</legend> <input type="text"  name="fRq" value="<fmt:formatDate value="${t.fRq}"  pattern="yyyy-MM-dd"  />"/> 
					    <button type="submit" class="btn">提交</button>
				</fieldset>
			</form>

提交的form action为add方法

@RequestMapping(value="/add",method=RequestMethod.POST)
	public String add(ModelAndView m,Test t){
		t1.insert(t);
		//日期格式的添加问题
		return "redirect:list";
		
	}

执行了insert方法,增加的为一个对象,并返回到list方法中

d.删除操作del方法

@RequestMapping("del")//删除操作
	public String del(ModelAndView m,Test t){
		t1.deleteByPrimaryKey(t.getId());
		 return "redirect:list"; 
	}
问题存在有开了一个页面

e.登录注册功能

由于数据库表是之前的,所以字段中没有password,暂时使用性别来进行当做密码来进行识别。

@RequestMapping("index")//
	public String index(ModelAndView m,Test t){
		//t1.deleteByPrimaryKey(t.getId());
		 return "login"; 
	}

设置一个主的登录界面跳转到login.jsp页面进行登录

<form action="login" method="post">
		<fieldset>
				<a href="add1"><input type = "button" value = "注册"></a>
		<h3>请输入您的名字,性别进行验证(测试性别相当于密码)</h3>
			<legend>名称</legend> <input type="text" name="fXm" /> 
			<legend>性别</legend> <input type="text" name="fXb" /> 
		    <button type="submit" class="btn">提交</button>
				</fieldset>
	</form>
点击提交跳转到controller中的login方法

@RequestMapping("login")
	public String login(Test t){
		String fXm = t.getfXm();
		String fXb = t.getfXb();
		
		  Test test =  t1.selectName(fXm);
		  
		System.out.println(test+"mapper");
		System.out.println(fXb+"jsp");
		if(test!=null){
			if(fXb.equals(test.getfXb())){
				return "redirect:list";
			}
			
			else{
				return "error";
			}	
			
		}else{
			return "error";
		}	
		
		
	}

这时传递过来的参数是前台传的一个实体,然后通过实体.get得到需要的字段值,对应mapper中有一个返回实体的方法

 <select id="selectName"  resultMap="BaseResultMap">
    select * from w_test where F_xm=#{fXm,jdbcType=VARCHAR}
   
  </select>
通过前台的fXm在数据库中找到其相应的性别(相当于密码),返回一个数据的实体test,为了防止空指针异常,进行if非空判断,然后判断前台的性别和数据库查出来的性别test.getfXb()是否一致来决定返回的路径

之后的注册功能实际上是又调用了一次增加方法。

部分功能如跳转问题,拦截器问题,非空校验还没有完善,之后会进行补充。

数据库图




猜你喜欢

转载自blog.csdn.net/qq_33186251/article/details/54628750