Spring整合MyBatis案例练习笔记

mac2022-06-30  63

需求:

 用户登录

技术需求:

  Servlet+Spring+Mybatis+MVC+jsp+css+html+jquery

数据库设计:

  用户表

Sql语句设计:

  select * from t_user where uname=#{0} and pwd=#{1}

实现:

  mapper层

package com.bjsxt.mapper; import com.bjsxt.pojo.User; public interface UserMapper { //用户登录 User selUser(String uname,String pwd); }

  UserMapper.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="com.bjsxt.mapper.UserMapper"> <!-- 用户登录sql配置 --> <select id="selUser" resultType="com.bjsxt.pojo.User"> select * from t_user where uname=#{arg0} and pwd=#{arg1} </select> </mapper>

  pojo层

package com.bjsxt.pojo; /** * 用户实体类 * @author Yancy * */ public class User { private int uid;//用户ID private String uname;//用户名称 private String pwd;//用户密码 public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public User(int uid, String uname, String pwd) { super(); this.uid = uid; this.uname = uname; this.pwd = pwd; } @Override public String toString() { return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((pwd == null) ? 0 : pwd.hashCode()); result = prime * result + uid; result = prime * result + ((uname == null) ? 0 : uname.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (pwd == null) { if (other.pwd != null) return false; } else if (!pwd.equals(other.pwd)) return false; if (uid != other.uid) return false; if (uname == null) { if (other.uname != null) return false; } else if (!uname.equals(other.uname)) return false; return true; } public User() { super(); // TODO Auto-generated constructor stub } }

  service层

package com.bjsxt.service; import com.bjsxt.pojo.User; public interface UserService { //用户登录 User checkUserInfoService(String uname,String pwd); }

  service.impl层 

package com.bjsxt.service.impl; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bjsxt.mapper.UserMapper; import com.bjsxt.pojo.User; import com.bjsxt.service.UserService; public class UserServiceImpl implements UserService { private UserMapper um; public UserMapper getUm() { return um; } public void setUm(UserMapper um) { this.um = um; } //用户登录 @Override public User checkUserInfoService(String uname, String pwd) { //使用对象完成数据库操作 return um.selUser(uname, pwd); } }

   servlet层

package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.bjsxt.pojo.User; import com.bjsxt.service.UserService; public class UserServlet extends HttpServlet{ UserService us; @Override public void init() throws ServletException { //传统方式 // //获取Spring容器对象 // ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // //获取业务层对象 // us = (UserService) ac.getBean("us"); //优化方式 ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext()); us = (UserService) ac.getBean("us"); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); //获取请求信息 String uname=req.getParameter("uname"); String pwd=req.getParameter("pwd"); //处理请求信息 //调用方法处理请求 User u = us.checkUserInfoService(uname, pwd); //处理响应结果 if(u!=null) { resp.sendRedirect(req.getContextPath()+"/success.jsp"); } } }

  配置文件src目录下

  applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 配置工厂bean --> <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置mapper扫描bean --> <bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactory" ref="factory"></property> <property name="basePackage" value="com.bjsxt.mapper"></property> </bean> <!-- 配置业务层bean --> <bean id="us" class="com.bjsxt.service.impl.UserServiceImpl"> <property name="um" ref="userMapper"></property> </bean> </beans>

log4j.properties

# Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... log4j.logger.com.bjsxt=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

   web.xml在WEB-INF下

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- 配置Spring文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置Servlet --> <servlet> <servlet-name>user</servlet-name> <servlet-class>com.bjsxt.servlet.UserServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping> </web-app>

 

整合问题及其解决方案:

  问题一:

    传统方式是在service层直接通过mybatis对象完成数据的操作,业务层和mapper层的耦合性非常高.

  解决一:

    使用SpringIOC技术和service层和mapper层进行解耦.

  方案一:

    直接从Spring容器对象中获取Mapper对象

      --->Spring容器还管理SqlSession对象

        --->Spring容器还管理DataSource对象

  实现一:

    参照配置文件

  问题二:

    如果在Servlet层中直接new创建业务层对象,虽然可以正常使用,但是会造成Servlet层和业务层的耦合性较高,不易于后期的的迭代升级.

  解决二:

    使用SpringIOC将Servlet层和service层进行解耦.

  实现二:

    将Service对象配置成bean,交由Spring容器管理.在Servlet中通过Spring容器对象获取业务层对象

   问题三:

    我们实现的登录代码,如果放在高并发环境,我们发现Spring容器对象一个线程中会被创建两次,这样造成占据的内存过多.

  解决三:

    ①在service层中我们使用Spring容器对象获取Mapper接口对象,Mapper接口对象本身就在Spring容器中,但是我们把Service也配置成bean了,那么是不是可以使用依赖注入呢.直接在Spring的配置文件中通过依赖注入将Mapper对象注入给service对象

    ②使用init方法,将获取us对象的动作放到服务器启动是完成.

  问题四:

    Spring容器在获取的代码的路径在init方法中耦合性较高.

  解决四:

    将Spring容器相关路径信息配置到web.xml中

  实现四:

    在web.xml中配置全局参数表明Spring路径

    配置Spring监听器

 

转载于:https://www.cnblogs.com/YancyL/p/11182126.html

最新回复(0)