The advance of Java -- SpringMVC, SpringMyBatis(Day11)

MVC与MyBatis详解

一.MVC:

1.Model: Responsible for business logic, including business processing and business data processing,
Such as Service and Dao.

2.View: Responsible for interface display and user interaction.

3.Controller: Connecting M and V to control process.

4.SpringMVC: a functional module of the Spring framework that implements the MVC architecture, and its API encapsulates some of the common features that make it easier to develop.

5.Process(setting):

Browser -> web.xml -> DispatcherServlet -> spring -> mvc.xml
handlerMapping -> Controller1.java -> handle business logic
-> return ModelAndView -> spring-mvc.xml ->
viewResolver -> leading end

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
<!--声明Controller -->
    <bean id="helloController" class="com.web.HelloController"/>
    <bean id="hihiController" class="com.web.HihiController"/>
    <bean id="pdController" class="com.web.PdController"/>
    
    <!--定义请求处理映射HandlerMapping -->
    <bean id="handlerMapping" 
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!--指定请求和Controller对应关系 -->    
        <property name="mappings">
            <props>
            	<prop key="/demo/hello.do">helloController</prop>
            	<prop key="/demo/test.do">hihiController</prop>
            	<prop key="/demo/pd.do">pdController</prop>
            </props>
        </property>
    </bean>
    
    
    
    
    <!--定义视图解析器ViewResolver -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    


(annotation):

jsp-->web.xml--(DispatcherServlet)
-->spring-mvc.xml--两个扫描器-->(@Controller、@RequestMapping、@Component、@Resource、@Service、@Repository)
-->Controller(distribute)-->Service(business)-->Dao(get result, return)
-->(ModelAndView)
-->spring-mvc.xml--(viewResovler)
-->jsp 

<!--开启注解扫描 -->
    <context:component-scan base-package="com"/>
    
    <!--开启MVC注解扫描 -->
    <mvc:annotation-driven/>
    <!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />-->
    
    <!--定义视图解析器ViewResolver -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
6.Receiving & sending value 

(1)from leafing end:

@Controller
@RequestMapping("/pd")
public class PdController {//request
	@RequestMapping("/test1.do")
	public ModelAndView test1(HttpServletRequest request) {
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        System.out.println(userName);
        System.out.println(password);
        request.setAttribute("password", password);
        request.setAttribute("userName", userName);
        
        return new ModelAndView("jsp/pd");
    }
	//Method
	@RequestMapping("/test2.do")
	public ModelAndView test2(String userName, String password) {
		System.out.println("Method");
        System.out.println(userName);
        System.out.println(password);  
        return new ModelAndView("jsp/pd");
    }
	//object
	@RequestMapping("/test3.do")
    public ModelAndView test3(User user) {
        System.out.println(user.getUserName());
        System.out.println(user.getPassword());
        return new ModelAndView("jsp/pd");
    }

(2)to leading end:

    //ModelAndView
    @RequestMapping("/test4.do")
    public ModelAndView test4() {
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("success", true);
        data.put("message", "操作成功");
        return new ModelAndView("jsp/pd", data);
    }
    //String
    @RequestMapping("/test5.do")
    public String test5() {
        return "jsp/error";
    }
    //object
    @RequestMapping("/test10.do")
    public String test10(User user){
    	if (user.getUserName() != null){
    		return "jsp/pd";
    	}else{
    		return "redirect:test5.do";
    	}
    		
    }

7.Gibberish processing(only post):

web.xml:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
8.ExceptionalHandler:

	    @ExceptionHandler
	    public String handleException(Exception e, 
	        HttpServletRequest request, HttpServletResponse response) 
	        throws Exception {
	        if(e instanceof NumberFormatException) {
	            request.setAttribute("message", "请输入数字");
	            return "jsp/message";
	        }else if(e instanceof IOException) {
	            request.setAttribute("message", e.getMessage());
	            return "jsp/message";
	        }else {
	            //throw e;
	        	request.setAttribute("message", e.getMessage());
	        	return "jsp/message";
	        }
	    }

9.Interceptor:

spring-mvc.xml:

<!--拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.web.FirstInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

FirstInteceptor.java:

public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("afterCompletion");
    }
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("postHandle");
    }
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
            Object arg2) throws Exception {
        System.out.println("preHandle");
        return true;
    }
}
10.AOP:

In computingaspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advicewithout modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development. -- Wiki

spring-mvc.xml:

<!-- 配置AOP -->
    <aop:config>
        <aop:aspect ref="operateLogger">
            <aop:before method="log1" 
                pointcut="within(com.web..*)"/>
        </aop:aspect>
    </aop:config>
OperatorLogger.xml:

/**
 *    用于记录日志的方面组件,演示Spring AOP的各种通知类型。
 */
public class OperateLogger {
    /**
     * 前置通知、后置通知、最终通知使用的方法
     */
    public void log1() {
        // 记录日志
        System.out.println("-->记录用户操作信息");
    }
    
}
EmpController.java:

@Controller
@RequestMapping("/emp")
public class EmpController {
    /**
     * 查询员工
     */
    @RequestMapping("/findEmp.do")
    public String find() {
        // 模拟查询员工数据
        System.out.println("查询员工数据,发送至列表页面.");
        
        return "emp/emp_list";
    }
}
TestController.java:

public class TestEmpController {
    
    /**
     * 测试查询员工
     */
    @Test
    public void test1() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "spring-mvc.xml");
        EmpController ctl = ctx.getBean(EmpController.class);
        ctl.find();
    }
}
11.Transaction:

spring-mvc.xml:


EmpController.java:



二.SpringMyBatis:

MyBatis is a Java persistence framework that couples objects with stored procedures or SQL statements using an XML descriptor or annotations.

MyBatis is free software that is distributed under the Apache License 2.0.

MyBatis is a fork of iBATIS 3.0 and is maintained by a team that includes the original creators of iBATIS.

-- Wiki

sqlMapConfig.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 -->
    <typeAliases><!-- 别名 -->
			<typeAlias alias="person" type="com.bsr.domain.Person"/>
			<typeAlias alias="orders" type="com.bsr.domain.Orders"/>
			<typeAlias alias="orderDetail" type="com.bsr.domain.OrderDetail"/>
			<typeAlias alias="role" type="com.bsr.domain.Role"/>
   </typeAliases>
    <!--environments:环境变量  -->
	<environments default="development">
		<environment id="development">
		   <!-- transactionManager:事务管理器 -->
			<transactionManager type="JDBC" />
			<!-- dataSource:数据源 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis1201" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<!--集中管理库表映射文件 -->
	<mappers>
		<mapper resource="com/bsr/mapper/PersonMapper.xml" />
		<mapper resource="com/bsr/mapper/OrdersMapper.xml" />
		<mapper resource="com/bsr/mapper/OrderDetailMapper.xml" />
		<mapper resource="com/bsr/mapper/RoleMapper.xml" />
	</mappers>
</configuration>
sqlMpperGenerator.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>
	<!-- 制定mysql的驱动包的路径 千万别放中文路径下 -->
	<classPathEntry location="F:\\workspace\\Mybatis1201\\lib\\mysql-connector-java-5.0.8-bin.jar" />
	<!-- 配置数据源和生成的代码所存放的位置 -->
	<context id="context1">

		<commentGenerator>
			<!-- 去除自动生成的注释 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>

		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis1201" userId="root"
			password="root" />
		<!-- 所生成的实体类的位置默认资源包src -->
		<javaModelGenerator targetPackage="com.bsr.domain"
			targetProject="Mybatis1201" />
		<!-- 所生成的sqlMap的影射文件的位置,默认资源包src -->
		<sqlMapGenerator targetPackage="com.bsr.mapper"
			targetProject="Mybatis1201" />
		<javaClientGenerator type="XMLMAPPER"  targetPackage="com.bsr.dao"
		  targetProject="Mybatis1201"/>

		<!-- 为哪些表生成代码 tableName:表名 schema:不用填写,其余属性是禁用例子查询的生成 -->
		<table schema="" tableName="role" enableCountByExample="false"
			enableUpdateByExample="false" enableDeleteByExample="false"
			enableSelectByExample="false" selectByExampleQueryId="false"
		>
		</table>
		<table schema="" tableName="person_role" enableCountByExample="false"
			enableUpdateByExample="false" enableDeleteByExample="false"
			enableSelectByExample="false" selectByExampleQueryId="false">
		</table>
		
	</context>
</generatorConfiguration>
MapperTest1.java:

package com.bsr.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.bsr.dao.PersonDao;
import com.bsr.domain.Person;
import com.bsr.mapper.PersonMapper;

public class MytatisTest01 {
	SqlSessionFactory sessionFactory =null;
    @Before
	public void setUp() throws IOException{
		InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");//1
		sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2
		
	}
    @Test
	public void selectPersonById(){
    	SqlSession sqlSession = sessionFactory.openSession();//3	相当于jdbcTemplate
    	//selectOne第一个参数:映射文件的命令空间+id,第二个参数 要传入的参数
    	Person person = sqlSession.selectOne("com.bsr.mapper.PersonMapper.selectPersonById", 1);//4
    	System.out.println(person);
    	sqlSession.close();
	}
    
    @Test
    public void selectCount(){
    	SqlSession sqlSession = sessionFactory.openSession();
    	//selectOne第一个参数:映射文件的命令空间+id,第二个参数 要传入的参数
    	Integer count = sqlSession.selectOne("com.bsr.mapper.PersonMapper.selectCount");
    	System.out.println(count);
    	sqlSession.close();
    }
    @Test
    public void selectAllPerson(){
    	SqlSession sqlSession = sessionFactory.openSession();
    	//selectOne第一个参数:映射文件的命令空间+id,第二个参数 要传入的参数    jdbcTemplate
    	List<Person> personList = sqlSession.selectList("com.bsr.mapper.PersonMapper.selectAllPerson");
    	System.out.println(personList);
    	sqlSession.close();
    }
    @Test
    public void insertPerson(){
    	SqlSession sqlSession = sessionFactory.openSession();
    	//selectOne第一个参数:映射文件的命令空间+id,第二个参数 要传入的参数
    	Person person=new Person();
    	person.setAge(26);
    	person.setGender("男");
    	person.setPersonName("王五");
    	person.setPersonAddr("北京东城区");
    	int i = sqlSession.insert("com.bsr.mapper.PersonMapper.insertPerson", person);
    	System.out.println(i);
    	sqlSession.commit();
    	sqlSession.close();
    }
    @Test
    public void updatePerson(){
    	SqlSession sqlSession = sessionFactory.openSession();
    	//selectOne第一个参数:映射文件的命令空间+id,第二个参数 要传入的参数
    	/*Person person=new Person();
    	person.setPersonId(4);
    	person.setGender("男");*/
    	Map<String, Object> map=new HashMap<String, Object>();
    	map.put("gender", "女");
    	map.put("personId", 3);
    	int i = sqlSession.update("com.bsr.mapper.PersonMapper.updatePerson", map);
    	System.out.println(i);
    	sqlSession.commit();
    	sqlSession.close();
    }
    @Test
    public void deletePersonById(){
    	SqlSession sqlSession = sessionFactory.openSession();
    	int i = sqlSession.delete("com.bsr.mapper.PersonMapper.deletePersonById", 3);
    	System.out.println(i);
    	sqlSession.commit();
    	sqlSession.close();
    }
  
    @Test
	public void testDao(){
    	SqlSession sqlSession = sessionFactory.openSession();
		PersonDao personDao = sqlSession.getMapper(PersonDao.class);
    	//PersonMapper personDao = sqlSession.getMapper(PersonMapper.class);
		Person person=new Person();
    	person.setAge(26);
    	person.setGender("男");
    	person.setPersonName("赵六");
    	person.setPersonAddr("北京海淀区");
    	
		personDao.insertPerson(person);
		sqlSession.commit();
		sqlSession.close();
	}

}
PersonMapper.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">
<!-- namespace:命名空间,不容许重复 -->
<mapper namespace="com.bsr.mapper.PersonMapper"> 
<!-- <mapper namespace="com.bsr.dao.PersonDao"> -->
    <!--resultMap:自定义数据类型javaBean
        resultType:非自定义数据类型,java.lang.Integer(int) (map,string,int)
        type:自定义的JavaBean
     -->
    <resultMap type="person" id="PersonBM">
       <result column="person_id" property="personId"/><!-- property:javaBean的属性,column:数据库表字段 -->
       <result column="person_name" property="personName"/>
       <result column="age" property="age"/>
       <result column="gender" property="gender"/>
       <result column="person_addr" property="personAddr"/>
    </resultMap>
    
   <!-- id:唯一标识 parameterType:输入的参数类型  resultType:返回值类型  变量ognl#{}-->
   <select id="selectPersonById" parameterType="int" resultMap="PersonBM">
      SELECT * FROM person p WHERE p.person_id=#{id}
   </select>
   <select id="selectCount" resultType="int">
     SELECT COUNT(*) FROM person p 
   </select>
   <select id="selectAllPerson" resultMap="PersonBM">
     SELECT * FROM person p 
   </select>
   <insert id="insertPerson" parameterType="person">
      INSERT INTO person(person_name,age,gender,person_addr) VALUES(#{personName},#{age},#{gender},#{personAddr})
   </insert>
   <update id="updatePerson" parameterType="map">
      UPDATE person p SET p.gender=#{gender} WHERE p.person_id=#{personId}
   </update>
   <!-- delete时候表名不能 加后缀名-->
   <delete id="deletePersonById" parameterType="int">
       DELETE FROM person  WHERE person_id=#{id}
   </delete>
   <!-- =====================动态sql============================ -->   
   <!-- <![CDATA[]]> --><!-- $:'%赵%'		#:'%'赵'%' -->
   <select id="selectPersonByParms" parameterType="map"  resultMap="PersonBM">
      
      SELECT * FROM person p
      <where>
          <if test="personName!=null">
             and p.person_name like '%${personName}%'		
             <!-- and p.person_name like concat('%',#{personName},'%')	 -->	
          </if>
          <if test="startAge!=null">
          	<!-- and p.age >= #{startAge} -->
            <![CDATA[ and p.age >= #{startAge}]]>
          </if>
          <if test="endAge!=null">
            <![CDATA[ and  p.age <= #{endAge}]]>
          </if>
      </where>
   </select>
   <!-- update person p set p.name='赵明',p.age=25 where p.id=2 -->
    <update id="updatePersonByParms" parameterType="person">
         UPDATE person p
         <set>
             <if test="personName!=null">
                 p.person_name =#{personName},
             </if>
             <if test="age!=null">
                 p.age =#{age},
             </if>
             <if test="gender!=null">
                 p.gender =#{gender},
             </if>
             <if test="personAddr!=null">
                 p.person_addr=#{personAddr}
             </if>
         </set>
        WHERE p.person_id=#{personId}
    </update>
    <!-- =======================批量插入,批量删除========================== -->
     <!-- SELECT * FROM person p WHERE  p.person_id  IN(4,5,8) -->
     <select id="selectBatchById" parameterType="map" resultMap="PersonBM">
            SELECT * FROM person p WHERE  p.person_id  IN
            <foreach collection="ids" open="(" close=")" separator="," index="index" item="id">
               #{id}
            </foreach>
     </select>
    
     
     <!-- 批量插入 -->
     <!-- for(Person person:list){person.getPersonName()} --><!-- collection中的persons是传入的map的key值 -->
     <!-- item中的person是加强for循环中的小person -->
     <insert id="insertBatchPersons" parameterType="list">
          INSERT INTO person(person_name,age,gender,person_addr) VALUES
          <foreach collection="list" item="person" separator="," index="idx">
               (#{person.personName},#{person.age},#{person.gender},#{person.personAddr})
          </foreach>
     </insert>
     <delete id="deleteBatch"  parameterType="map">
         DELETE FROM person WHERE person_id IN
          <foreach collection="ids" open="(" close=")" separator="," index="index" item="id">
               #{id}
          </foreach>
     </delete>
     <!-- ================================多表关联============================================= -->
     <resultMap id="PersonAndOrdersBM" type="person">
       <result column="person_id" property="personId"/>
       <result column="person_name" property="personName"/>
       <result column="age" property="age"/>
       <result column="gender" property="gender"/>
       <result column="person_addr" property="personAddr"/>
       <!-- collection:ofType多的类 -->
       <collection property="ordersList" ofType="orders">
            <id column="order_id" property="orderId" jdbcType="INTEGER" />
		    <result column="person_id" property="personId" jdbcType="INTEGER" />
		    <result column="order_no" property="orderNo" jdbcType="VARCHAR" />
		    <result column="total_price" property="totalPrice" jdbcType="REAL" /><!-- float -->
		    <result column="deliver_addr" property="deliverAddr" jdbcType="VARCHAR" />
       </collection>
     </resultMap>
     <select id="selectPersonAndOrders" resultMap="PersonAndOrdersBM">
        SELECT * FROM person p,orders os WHERE  p.person_id=os.person_id
     </select>
     <select id="selectPersonAndOrdersById" parameterType="int" resultMap="PersonAndOrdersBM">
        SELECT * FROM person p,orders os WHERE  p.person_id=os.person_id and p.person_id=#{id}
     </select> 
</mapper>











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值