1.sql映射器Mapper

MyBatis基于动态代理机制,让我们无需再编写Dao的实现。

传统Dao接口,现在名称统一以Mapper结尾,还有我们映射器配置文件要和映射器在同一个包。

1.1使用映射器步骤:

(1)根据需求,创建模型相关的Mapper接口

(2)编写映射文件

  a)*Mapper.xml的命名空间,必须和接口的“全限定名”一致

  b)定义sql标签的id,需要和“接口的方法”一致

 <?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="cn.itsource._01_mapper.TeacherMapper">
<!-- 查询 findAll()
resultType 返回类型
-->
<select id="findAll" resultType="Teacher">
select * from t_teacher
</select>
</mapper>

(3)测试

 @Test
public void findAll() {
SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
//MyBatis动态代理
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
mapper.findAll().forEach(t -> System.out.println(t));
}

2.高级查询

 <?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="cn.itsource._02_query.TeacherMapper">
<!-- 查询 findAll()
resultType 返回类型
-->
<select id="findAll" resultType="Teacher">
select * from t_teacher
</select>
<select id="queryAll" parameterType="teacherQuery" resultType="Teacher">
select * from t_teacher
<where>
<if test="name!=null">
and name like concat("%",#{name},"%")
</if>
<if test="minAge!=null">
and age &gt; #{minAge}
</if>
<if test="maxAge!=null">
and age &lt; #{maxAge}
</if>
<!-- 放入CDATA区域里面被xml忽略解析
<if test="maxAge != null">
<![CDATA[
and age < #{maxAge}
]]>
</if>-->
</where>
</select>
</mapper>

注意:

1.where:里面所有的条件如果都在前面加上and,并且最后会把第一个and替换为where

2.if 判断条件是否满足,如果是并且用and

3.模糊查询
  方案1:不能用#
         and ( name like %#{keywords}% or
password like %#{keywords}% )
  方案2:用$  sql注入
         and ( name like '%${keywords}%'
or password like '%${keywords}%' )
  方案3:用mysql中字符串拼接函数concat
         and ( name like
concat('%',#{keywords},'%') or password like '%${keywords}%' )

4.如果有特殊符号:

  方案1:转义符号,如“<”可以写成"&lt;",">"写成"&gt;"等等

  方案2:CDATA(上面的例子已经使用过)

3.ResultMap结果集映射

3.1为什么要使用结果映射

解决表字段名和对象属性名不一样的情况

关联对象查询,在mybatis不会默认查询出来,需要自己查询结果并且通过resultMap来配置

3.2关联映射分类

表与表之间的关系有:

一对一,一对多,多对一,多对多…

3.3关联映射处理方式

MyBatis提供两种方式处理我们关联对象,嵌套查询嵌套结果

嵌套结果:发送一条sql,查询所有的信息(本身+关联对象)

嵌套查询:发送1+n条sql

3.3.1多对一(一对一)——嵌套结果

 <!--嵌套结果(多对一),发送一条sql查询数据-->
<resultMap id="studentMap" type="student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="teacher" javaType="teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
<result property="age" column="tage"/>
</association>
</resultMap>
<select id="findAll" resultMap="studentMap">
select s.id,s.name,s.age,t.id tid,t.name tname,t.age tage
from t_student s join t_teacher t on s.teacher_id=t.id
</select>

3.3.2多对一(一对一)——嵌套查询

 <!--嵌套查询,发送1+n条sql查询数据-->
<resultMap id="studentMap" type="student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<association property="teacher" javaType="teacher" column="teacher_id" select="queryByTeacherId"/>
</resultMap>
<select id="findAll" resultMap="studentMap">
select * from t_student
</select>
<select id="queryByTeacherId" parameterType="long" resultType="teacher">
select * from t_teacher where id=#{id}
</select>

3.3.3一对多(多对多)——嵌套结果

 <!--嵌套结果(一对多),发送一条sql查询数据-->
<resultMap id="teacherMap" type="teacher">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="students" javaType="arrayList" ofType="student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="age" column="sage"/>
</collection>
</resultMap>
<select id="findAll" resultMap="teacherMap">
select t.id,t.name,t.age,s.id sid,s.name sname,s.age sage
from t_teacher t join t_student s on t.id=s.teacher_id
</select>

3.3.4一对多(多对多)——嵌套查询

 <!--嵌套查询,发送1+n条sql查询数据-->
<resultMap id="teacherMap" type="teacher">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="students" column="id" javaType="arrayList" ofType="student" select="queryStudent"/>
</resultMap>
<select id="findAll" resultMap="teacherMap">
select * from t_teacher
</select>
<select id="queryStudent" parameterType="long" resultType="student">
select * from t_student where teacher_id=#{id}
</select>

4.缓存

4.1 jpa

一级缓存(自带)命中条件:同一个EntityManagerFactory,同一个EntityManager,同一个OID

二级缓存(需要配置实现):同一个EntityManagerFactory,不同的EntityManager,同一个OID

4.2 MyBatis

一级缓存:属于sqlSession级别,同一个SqlSessionFactory,同一个SqlSession,同一个id

二级缓存:属于sqlSessionFactory,同一个SqlSessionFactory,不同的SqlSession,同一个id

序列化:把对象转换成二进制形式,方便传输(特别需要保存到磁盘或者硬盘,需要进行序列化)

反序列化:把二进制的数据转换成对象

5.SSM集成

Spring+SpringMvc+MyBatis

框架集成核心:如果你的项目中,用到了Spring框架,那么其他框架主要就是和Spring集成。

那么和Spring集成的核心思路:

  1.把当前框架的核心类交给Spring管理

  2.如果框架有事务,那么事务也要统一交给Spring管理

步骤:

(1)导入jar包:今天以导入jar的方式,不是maven

(2)配置文件

applicationContext.xml:

  jdbc.properties--->Datasource ---->SqlSessionFactory----扫描Mapper--->事务管理器-开启注解事务

 <?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"
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
">
<context:component-scan base-package="cn.itsource.ssm.service"/>
<!--读取jdbc.properties-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--*Mapper.xml的位置-->
<property name="mapperLocations" value="classpath:cn/itsource/ssm/mapper/*Mapper.xml"/>
<!--别名配置-->
<property name="typeAliasesPackage">
<value>
cn.itsource.ssm.domain
cn.itsource.ssm.query
</value>
</property>
</bean>
<!-- 处理mapper接口 spring会扫描包产生很多子类 注入到service层-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itsource.ssm.mapper"/>
</bean>
<!--事务配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

applicationContext-mvc.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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描controller层-->
<context:component-scan base-package="cn.itsource.ssm.controller"/>
<!--静态资源放行-->
<mvc:default-servlet-handler/>
<!--mvc特有注解支持-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--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>
<!--springMvc核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--编码过滤器-->
<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>
</web-app>

(3)包的层次结构:

MyBatis进阶讲解+ssm集成的更多相关文章

  1. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  2. Spring MVC 学习总结(十)——Spring+Spring MVC+MyBatis框架集成(IntelliJ IDEA SSM集成)

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  3. spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)

    java-websocket该建筑是easy.儿童无用的框架可以在这里下载主线和个人教学好java-websocket计划: Apach Tomcat 8.0.3+MyEclipse+maven+JD ...

  4. java:Mybatis框架3(二级缓存,延时和积极加载,SSI(Ibatis)集成,SSM集成)

    1.二级缓存: 需要导入二级缓存jar包: mybatis03: ehcache.xml: <ehcache xmlns:xsi="http://www.w3.org/2001/XML ...

  5. Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)

    当任何时候觉你得难受了,其实你的大脑是在进化,当任何时候你觉得轻松,其实都在使用以前的坏习惯. 通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车 ...

  6. Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(转)

    通过前面的学习,你可能大致了解了Quartz,本篇博文为你打开学习SSMM+Quartz的旅程!欢迎上车,开始美好的旅程! 本篇是在SSM框架基础上进行的. 参考文章: 1.Quartz学习——Qua ...

  7. (转) Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)

    http://blog.csdn.net/u010648555/article/details/60767633 当任何时候觉你得难受了,其实你的大脑是在进化,当任何时候你觉得轻松,其实都在使用以前的 ...

  8. MyBatis高级及其SSM框架搭建

    代码生成器 首先meaven项目中导入支持包 <dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-c ...

  9. ssm集成redis

    身在一个传统的IT公司,接触的新技术比较少,打算年后跳槽,所以抽空学了一下redis. 简单的redis测试,咱们这边就不讲了,现在主要讲讲ssm集成redis的过程,因为现在项目用的就是ssm的框架 ...

随机推荐

  1. Altium Designer 18 画keepout层与将keepout层转换成Mechanical1层的方法

    画keepout的方法 先选中Keepout层:然后 右键->Place->Keepout->然后选择要画圆还是线 Keepout层一般只用来辅助Layout,不能作为PCB的外形结 ...

  2. Python的os,shutil和sys模块

    *********OS*********** os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'n ...

  3. Sublime Text最好的中文教程

    原文链接:http://lucida.me/blog/sublime-text-complete-guide/ 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的 ...

  4. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

  5. jenkins 如何让job对应一个节点

    1.配置job:如图,在label expression 里面填写[节点标签名]或者是[节点名称]. 2.配置节点: 3.构建:第一个红线,表明使用哪个节点进行构建.  第二个红线,表明工作目录.

  6. redis与memcached区别

    不同点: (1) redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形 ...

  7. windows系统tomcat上开发的j2ee程序,如何适配linux系统上奔跑的websphere7

    公司需要将几个windows系统tomcat中间件下开发的j2ee系统部署到linux系统websphere7中间件下去运行. 这就需要做系统的适配工作.由于时间比较久了,具体问题就不详细写了.把这个 ...

  8. 基于webpack实现多html页面开发框架二 css打包、支持scss、文件分离

    本节主要介绍webpack打包的时候CSS的处理方式 一.解决什么问题      1.CSS打包      2.CSS处理浏览器兼容      3.SASS支持      4.CSS分离成单独的文件 ...

  9. Pycharm常见快捷键

    Ctrl+/注释(取消注释)选择的行 Shift + Enter开始新行 Ctrl + Enter智能换行 TAB Shift+TAB缩进/取消缩进所选择的行 Ctrl + Alt + I自动缩进行 ...

  10. apache thrift 和 apache jersey 记录

    几篇好的入门文档链接: 1. Hello World by Thrift Using Java 2. Thrift 实例 Helloworld 3. Thrift版的Hello World 4. Th ...