Spring MVC特点
spring mvc是一个基于MVC模式的表现层框架,在spring2.5以后新增了注解功能。和同类的MVC表现层相比,有如下特点:
1. 基于的是servlet/jsp模式
2. 控制权不再需要继承其他类,只需要使用@Controller注解
3. 不需要有formbean之类的对象了,方法参数中需要的页面值,可通过@RequestParam直接从页面请求中获得。
4. 控制器方法签名定义灵活。
5. 返回页面直接在方法中指定,可以是String也可以是其他,比如ModelAndView或void等。
6. 性能也很优秀,和struts1相当,性能高于struts2
请求------------------》前端控制器--------------------》应用控制器---------------》业务组件
前端控制器:负责接收客户端请求,根据请求路径访问应用控制器。将页面参数填充实体bean。负责转发页面和对标签类的支持。org.springframework.web.servlet.DispatcherServlet
业务控制器:负责产生业务组件,调用业务方法完成业务,返回需要转发的路径
默认情况下:DispatcherServlet会寻找WEB-INF下,命名规范为[servlet-name]-servlet.xml文件。
也可以通过init-param改变默认配置
<?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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
@RequestMapping(value="ps/{id}",method=RequestMethod.GET)
public void test(@PathVariable("id") int myid){
}
<a href="ps/1.do">访问</a>
表示只能处理get方式,利用PathVariable(“id”)得到路径参数
spring管理整个项目,每个spring组件都由spring容器产生。所以在web容器启动时,要读取spring的配置文件。从而加载spring容器的组件。
log4j:日志文件
公共类: Logger
公共接口:Appender
公共抽象类:Layout
log4j日志级别:5个级别等级由低到高
debug:调试级别
info:信息级别
warn:警告级别
error:错误级别
fatal:崩溃级别
MYbatis
1. mybatis 是一种持久层框架,也熟悉ORM映射,前身是ibatis
2. 相比于hibernate,hibernate为全自动化,配置文件书写后不需要书写SQL语句,但欠缺灵魂,很多时候需要优化
3. mybatis为半自动化,需要自己写SQL语句,需要自己定义映射,增加了程序员的一些操作,但带来了设计上的灵活,并且也支持了hibernate的一些特点,如延迟加载,缓存,映射等
4. 对数据库的兼容性比hibernate差,移植性不好,但可以编写灵活和高性能的SQL语句
mybatis组成
核心对象:SqlSessionFactory SqlSession
配置文件: mybatis.cfg.xml相当于 hibernate的hibernate.cfg.xml
多个类配置文件:user.xml相当于hibernate的映射类文件
支持注解配置
mybatis设置URL时,加上allowMultiQueries=true,表示允许一个语句块中添加多条SQL语句(URL添加多条语句需要使用 & 来转意,而不是仅用 &)
mybatis.xml命名空间
在orm文件根目录下就爱如<mapper namespace=”user”> 设置命名空间、
作用:
1. 更好的分类SQL语句块,更好维护
2. 防止SQL语句块重名
在设置了命名空间后,那么在相应的程序调用中,方可以使用”命名空间.语句块名”进行调用相应的sql语句
#和$
#在生成SQL时,对于字符类型参数,会拼装引号
$在生成SQL时,不会拼装引号,可用于order by 之类的参数拼装
CDATA标签:用于把整段文本解释为纯字符数据而不是标记的其in公开。包含大量< > & 或者“ 字符。CDATA节中的所有字符都会被当作元素字符数据常量部分,而不是XML标记
CDATA 是不被解析器解析的文本。文本内标签不会被当作标记
mybatis的映射:
一对一
bean的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="message">
<!-- 定义查询的属性和列名的映射关系 -->
<resultMap type="message"id="messageMap">
<!-- 如果属性名和列名一致,可以不写 -->
<result property="m_id"column="m_id"/>
</resultMap>
<!-- 添加语句块,id表示给该语句块起的名称,parameterType="message"表示参数类型
useGeneratedKeys="true"表示运行使用自动增长列
keyProperty="m_id"表示将自动增长列的内容填充添加对象的属性名 -->
<insert id="add"parameterType="message" useGeneratedKeys="true"keyProperty="m_id">
<!-- #{xx} 表示从实参对象里取出该属性,填充数据库,属性可以和数据库字段不一致 -->
insert intot_message(m_name,m_tel)values(#{m_name},#{m_tel});
</insert>
<!-- 删除语句块 -->
<delete id="del"parameterType="int">
delete from t_message where m_id=#{id};
</delete>
<!-- 修改语句块 -->
<update id="update">
update t_message set m_tel=#{ppp}where m_id=#{mid};
</update>
<!-- 查询语句块 -->
<!-- 如果字段不一样方法1:select m_id,m_name,m_tel as phone fromt_message;通过别名做映射 -->
<!-- 方法2:映射集合(就不能使用resultType="message",而是 resultMap="messageMap") -->
<select id="findAll"resultMap="messageMap">
select * from t_message;
</select>
<!-- 按id查询 -->
<select id="findById"parameterType="int" resultMap="messageMap">
select * from t_message where m_id=#{id};
</select>
<!-- 按姓名查询,如果在java代码中传值没有加上%模糊查询,则sql语句需要这么写-->
<!-- select * from t_message where m_name like '%${name}%'; -->
<select id="findByName"parameterType="String" resultMap="messageMap">
select * from t_message where m_name like#{name};
</select>
<!-- 按姓名和电话查询(传多个参,必然是map集合,不需要写parameterType) -->
<select id="findByItem"resultMap="messageMap">
select * from t_message where m_name like'%${name}%' and m_tel like '%${tel}%'
</select>
<!-- 如果SQL语句中有 < > & 等特殊字符,建议书写在CDATA标签中,XML解析器都当作文本处理,不会认为是标签 -->
<!-- 按ID范围查询大于小于符号需要用转义符 > <或者使用<![CDATA[..]]>-->
<select id="findRangeId"resultMap="messageMap">
<!-- <![CDATA[select * from t_message where m_id>=#{start} andm_id<#{end};]]>
-->
<!-- 当查询条件需要动态生成时,需要使用动态SQL,模糊查询可以不使用 -->
select * from t_message where 1=1
<if test="start!=0">
and m_id>=#{start}
</if>
andm_id<#{end};
</select>
<!-- 动态查询当前页面集合 -->
<select id="findByPage"resultMap="messageMap">
select * from t_message where 1=1
<include refid="cutSql"/>
limit #{start},#{pageSize};
</select>
<!-- 将条件抽象出来 -->
<sql id="cutSql">
<if test="name!=null andname!=''">
and m_name like '%${name}%'
</if>
<if test="tel!=null andtel!=''">
and m_tel like '%${tel}%'
</if>
</sql>
<!-- 查询总记录数 -->
<select id="cutCount"resultType="int" >
select count(*) from t_message where 1=1
<include refid="cutSql"/>
</select>
<!-- 批量添加 -->
<select id="addList">
insert into t_message(m_name,m_tel) values
<!-- collection="mlist" 遍历集合的名称,item为每次循环中取出的元素,separator为分隔符 -->
<foreach collection="mlist"item="bean" separator=",">
(#{bean.m_name},#{bean.m_tel})
</foreach>
</select>
<!-- 批量删除 -->
<select id="delMore">
delete from t_message where m_id in (
<foreach collection="idArray"item="id" separator=",">
#{id}
</foreach>
);
</select>
</mapper>
mybatis.cfg.xml配置
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 给指定类型取别名 -->
<typeAlias type="com.lovo.bean.MessageBean"alias="message"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<!-- 设置数据库的连接 -->
<dataSource type="POOLED">
<property name="driver"value="org.gjt.mm.mysql.Driver"/>
<!-- allowMultiQueries=true 表示允许在一个语句块中执行多条SQL语句 -->
<property name="url"value="jdbc:mysql://localhost:3306/classtrain2?characterEncoding=utf-8&allowMultiQueries=true"/>
<property name="username"value="root"/>
<property name="password"value="111111"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="orm/MessageBean.xml"/>
</mappers>
</configuration>