2018.4.24
僅爲個人理解 不足之處歡迎指正~
本文所有內容均在
SpringMVC學習記錄(四)——簡單SpringMVC登錄註冊項目
項目基礎上修改
初始項目結構:
原Dao層所採用的數據交互方法爲基本JDBC:
UserDaoImpl.java:
package dao;
import org.springframework.stereotype.Repository;
import pojo.Login;
import pojo.User;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@Repository("userDao")
public class UserDaoImpl implements UserDao
{
//獲得連接
@Override
public Connection getConnection(){
String driver ="com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user ="root";
String password ="root";
Connection connection =null;
try {
Class.forName(driver);
connection =DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//註冊用戶
@Override
public void register(User user)
{
try {
Connection con = getConnection();
PreparedStatement preparedStatement = null;
String sql= "insert into user (username,password,phone,email) values(?,?,?,?)";
preparedStatement=con.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setString(3, user.getPhone());
preparedStatement.setString(4, user.getEmail());
preparedStatement.executeUpdate();
}
catch (Exception e) {
//
}
}
//驗證用戶登錄
@Override
public User validateUser(Login login)
{
User user=new User();
String sql="select * from user where username=?";
Connection con=getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
try
{
pstmt=con.prepareStatement(sql);
pstmt.setString(1, login.getUsername());
rs=pstmt.executeQuery();
while(rs.next())
{
user.setUsername(rs.getString(1));
user.setPassword(rs.getString(2));
user.setPhone(rs.getString(3));
user.setEmail(rs.getString(4));
}
}
catch(SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
return user;
}
}
本次修改目的在於將與數據庫交互的方法改爲Mybatis
實現將Mybatis整合入這個項目
第一步:編寫UserDao.xml
在上一篇文章提到:一個接口對應一個實現
上一篇中的Dao層如下:
而我們知道在Mybatis中 一個實體類對應一個xml
這個xml整合入SpringMVC中仍然起到實現的作用
所以我們可以將UserDaoImpl.java 替換爲UserDao.xml
首先明確需要的操作:
- 註冊所需的增加用戶
- 登錄所需的查詢用戶
首先進行增加用戶語句的編寫:
然後進行查詢用戶語句的編寫:
完整UserDao.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">
<insert id="addUser" parameterType="pojo.User" >
insert into user values (#{username},#{password},#{phone},#{email})
</insert>
<select id="getUserByusername" parameterType="string" resultType="pojo.User">
select * from user where username=#{username}
</select>
</mapper>
注意:
namespace必須對應這個xml所實現的接口
第二步:修改對應的UserDao.java
完整UserDao.java代碼如下:
package dao;
import org.mybatis.spring.annotation.MapperScan;
import pojo.User;
@MapperScan
public interface UserDao
{
User getUserByusername(String username); //根據用戶名獲取用戶
void addUser(User user); //註冊用戶
}
注意:
1.
中寫的兩個方法名與xml中的id名對應
返回值與參數列表與 resultType與parameterType對應
2.
需要加上@MapperScan纔算完成這個接口的實現
第三步:修改對應的Service層
service.java不變
package service;
import pojo.User;
public interface UserService
{
void addUser(User user);
String login(User user);
}
serviceImpl.java 根據調用的方法做微調:
package service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import pojo.Login; import pojo.User; import dao.UserDao; @Service public class UserServiceImpl implements UserService { @Resource UserDao userdao; @Override public void addUser(User user) { System.out.println("service:"); System.out.println(user.getUsername()); System.out.println(user.getPassword()); System.out.println(user.getPhone()); System.out.println(user.getEmail()); userdao.addUser(user); } @Override public String login(User user) { String username=user.getUsername(); User trueuser=userdao.getUserByusername(username); if(trueuser.getPassword().equals(user.getPassword())) { return "登錄成功"; } else { return "密碼錯誤"; } } }
第四步:三個配置文件
在整合Mybatis之後 我們理所當然的需要Mybatis的配置文件mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC
"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="pojo.User" alias="User"/>
</typeAliases>
<mappers>
<mapper resource="dao/UserDao.xml"/>
</mappers>
</configuration>
這個配置文件與我們在Mybatis學習記錄中使用的相比減少了很多東西:
主要體現在:
這是因爲這部分的配置文件將整合進spring的配置文件中
接下來配置Spring的配置文件springConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/tool"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd">
<!--配置數據源-->
<bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置sessionFactory-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="jdbcDataSource" />
<property name="mapperLocations">
<array>
<value>classpath:Dao/**/*.xml</value>
</array>
</property>
<property name="typeAliasesPackage" value="com.isea533.mybatis.model"/>
<!-- MybatisSpringPageInterceptor分頁攔截器 -->
<!--<property name="plugins">-->
<!--<bean class="com.wlxk.Util.MybatisSpringPageInterceptor"/>-->
<!--</property>-->
</bean>
<!--配置dao 自動掃描帶有@MapperScan註解的-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="dao"/>
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
</bean>
<!--全局異常處理-->
<!--service 註解掃描-->
<context:component-scan base-package="service"/>
</beans>
幾點需要注意:
1.
數據源的配置由mybatis的配置文件轉移至spring的配置文件
2.
同樣我們在Mybatis中需要獲取對象時使用的sessionFactory:
在Spring中不再需要
取而代之的是這一段配置代碼
springMVC的配置文件沒有改變:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="controller" />
<!-- 視圖頁面配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
其他代碼改動與注意點:
(1)
LoginController.java:
package controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import pojo.User;
import service.UserService;
@Controller
public class LoginController
{
@Resource
UserService userService;
@RequestMapping("/Login")
public ModelAndView login
(@RequestParam("username") String userName,
@RequestParam("password") String passWord)
{
ModelAndView mv = new ModelAndView("welcome");
User user=new User(userName,passWord,null,null);
String mes=userService.login(user);
mv.addObject("name",userName);
mv.addObject("message", mes);
return mv;
}
}
(2)
RegiesterController.java
package controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import pojo.User;
import service.UserService;
import service.UserServiceImpl;
@Controller
public class RegisterController
{
@Resource
UserService userService;
@RequestMapping(value="/register")
public ModelAndView showRegister(HttpServletRequest request,HttpServletResponse response)
{
ModelAndView mav=new ModelAndView("register");
mav.addObject("user",new User());
return mav;
}
@RequestMapping(value="/reg",method=RequestMethod.POST)
public ModelAndView addUser(HttpServletRequest request,HttpServletResponse response,
@RequestParam("username") String userName,
@RequestParam("password") String passWord,
@RequestParam("phone") String phone,
@RequestParam("email") String email)
{
User user=new User(userName,passWord,phone,email);
System.out.println("用戶信息如下:");
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getPhone());
System.out.println(user.getEmail());
userService.addUser(user);
ModelAndView mv = new ModelAndView("welcome");
String mes="註冊成功";
mv.addObject("name", user.getUsername());
mv.addObject("message", mes);
return mv;
}
}
(3)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>TestMaven</display-name>
<welcome-file-list>
<welcome-file>/WEB-INF/views/index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springConfig.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
(4)pom.xml
添加了新的包:mybatis與mybatis-spring
<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>com.tzy</groupId>
<artifactId>MVCDemo2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>MVCDemo1 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
<finalName>TestMaven2</finalName>
</build>
</project>
完整項目結構與測試:
完整項目結構如下:
index.jsp welcome.jsp register.jsp並沒有進行任何改動
如有需要請在SpringMVC學習記錄(四)——簡單SpringMVC登錄註冊項目中獲取
運行結果:
總結:
這次將Mybatis整合進入了之前的登錄註冊項目
之後打算進行AOP的模擬——增加一個登錄日誌
在這個項目的整合過程中遇到了一個問題
與
之間的版本關係似乎有點複雜 總之這是一種可以成功的搭配
謝謝~