1.
SSH:Spring 中间层(容器框架,整合框架) Struct(控制层,Servlet) Hibernate(DAO,持久层框架)
Structs2  Hibernate 两个重量级框架,入门比较难,不容易上手,比较笨重;

SSM:轻量级框架,比较灵活,入门简单,上手快;

Spring(在软件行业内称为:一站式解决方案)
Spring MVC (Spring框架中的一个模块)
MybatisDao层

为什么使用框架开发?

JSP 、Servlet开发存在什么问题?
控制层:Servlet ,一个功能模块,5-6个Servlet,web.xml配置文件中,48行。
比如现在有50个功能模块,2000多行的配置文件;同时servlet里存在大量的重复代码,代码可重复利用率低;
一个功能模块维护困难,成本问题

Servlet一个代表一个功能模块?

Dao层?
代码存在大量的重复;
dao层,在需求变动的情况下,MyBatis框架

2.
MyBatis(日志文件log4j.properties/全局配置文件/mapper 具体每一dao的映射配置)
sqlMapConfig.xml 是mybatis的全局配置文件:优化设置,环境配置
mapper.xml  配置mybatis 的映射输入和 映射输出

SqlSession 会话 来执行底层的操作
这个对象是 框架帮你new的 ,依赖一个SqlSession会话工厂来创建;

SqlSession 会话对数据库进行增删改查,但  是SqlSession并不直接对数据库进行操作,而是通过底层一个Executor执行器来完成的;

Executor依赖底层 mapped Statement 底层封装对象,需要知道要执行的sql是什么,sql要传入的参数是什么,以及查询后返回的Java类型是什么;

3.
映射,对应
//sqlmapconfig.xml 全局配置,就相当于对整个Mybatis的映射
//而输入输出映射,则是两个属性,
parameterType映射preparStatement里的?输入,和输出的对象。
resultType映射输出,查询单条记录,就是一个对象对应的Javabean

4.
mapper.xml
每一个mapper对应一个dao的映射
我们通过流加载全局配置,要想加载到mapper,要在全局配置中进行配置

//如何对这些sql语句进行管理
//mapper.xml 文件 中mapper根标签中的属性:
命名空间属性namespace:

//id时这个sql的唯一标识,parameterType就是输入映射
//resultType 将查询结果封装到哪一个pojo中去
查询<select id="" parameterType="Integer" resultType="">
select * from user where user_id=#{value}//占位符当输入为基本数据类型,可以写value;也可以写下面执行调用方法时的userid
</select>

//当MyBatis框架,加载mapper.xml文件的时候,解析,并将sql命令进行封装mappedStatemented

执行时:
//        sql所在的mapper和id         输入映射值    
session.selectOne("userMapper.queryUserById", userId);

5.
//mybatis是根据 查询结果中的列名 与pojo中属性进行匹配
当不匹配时,可以做一个映射配置:
    <!-- 自定义一个关联映射,id用于主键列的映射,result用于普通列的映射 -->
    <resultMap type="com.langsin.pojo.User" id="userMap">
     <id column="user_id" property="user_id"/>
     <result column="user_name" property="user_name"/>
    </resultMap>

6.获取自增长主键,加入到输入映射

<!-- 插入用户记录,并对自增长的主键自动获取,塞入到输入映射对象中去 -->
    <insert id="addUser" parameterType="com.langsin.pojo.User">
    <!-- 对插入的数据的主键进行查询操作,并把查询的结果值,塞入到映射对象中的keyProperty的属性中去 -->
    <!-- order属性,代表在insert 语句之前或之后再执行selectkey的语句 -->
    <selectKey keyProperty="user_id" resultType="int" order="AFTER">
    select     last_insert_id();
    </selectKey>
    insert into user values(null,#{user_name},#{user_pass},#{role_code},#{cname},#{is_login},#{telphone},#{address});
    </insert>

执行结果debug日志:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1771243284.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@69930714]
DEBUG [main] - ==>  Preparing: insert into user values(null,?,?,?,?,?,?,?); 
DEBUG [main] - ==> Parameters: 李四(String), null, null, lisi(String), null, null, null
DEBUG [main] - <==    Updates: 1
DEBUG [main] - ==>  Preparing: select last_insert_id(); 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@69930714]
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@69930714]
DEBUG [main] - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@69930714]
DEBUG [main] - Returned connection 1771243284 to pool.

7.获取非自增长,插入到输入映射
<selectKey keyProperty="user_id" resultType="String" order="BEFORE">
    select  uuid();
</selectKey>

8.#{占位符} ${拼接符}
占位符:代替?
拼接符:字符串拼接,是不安全可以进行sql注入,如果是varchar类型的传入参数,要在前后加上单引号'${value}',#{value}会自动包裹单引号

9.mybatis做原始的DAO开发(这个类可以不用我们自己去实现,见10条)
public class UserDaoImpl implements UserDao{
    private SqlSession session=null;
    
    @Override
    public User queryUserById(Integer userId) throws Exception {
        session=SqlSessionConn.getSqlSession();
        User user =session.selectOne("userMapper.queryUserById", userId);
        session.close();
        return user;
    }

@Override
    public int insertUser(User user) throws Exception {
        // TODO Auto-generated method stub
        return 0;
    }

@Override
    public int deleteUserById(Integer userid) throws Exception {
        // TODO Auto-generated method stub
        return 0;
    }

@Override
    public int updateUser(User user) throws Exception {
        // TODO Auto-generated method stub
        return 0;
    }

}

10.
mybatis之前通过读取框架的配置文件,生成工厂,生成的SqlSession,使用的一些方法,
以及读取mapper.xml(namespace,sql语句标签及id属性,输入映射,输出映射)
代替了传统的jdbc操作。

进一步的,对于整个dao层的开发,mybatis中只需要定义dao层的mapper接口,实现类由mybatis动态实现(框架通过增删查改的标签和id的方法名知道具体方法实现需要的sql语句)
mybatis的高级mapper代理方式开发DAO层规范:

AAAAAAAAAAAAAAAAAAAAA:下面四条是mapper.xml内部,是为了让框架能动态new实现类
#1
mapper.xml的namespace 属性要与mapper接口的地址保持一致;(为了实现类,给哪个接口写的)
#2
mapper 接口中的方法名 和mapper.xml中statement 的id保持一致;(为了方法,方法名是啥,sql语句是啥)
#3
mapper 接口中的方法的输入参数要与mapper.xml配置文件中的paramterType保持一致;(为了输入,输出映射,方法传入什么,执行后返回什么)
#4
mapper 接口中的方法的返回值类型要与mapper.xml配置文件中的resultType保持一致;

BBBBBBBBBBBBBBBBBBBBBBBB:第五条,为了让框架能够加载到mapper.xml文件
#5
全局配置文件中配置Mapper,将mapper.xml文件,和dao层mapper接口放在同一个包下,并且改成同一个名字;

<mappers>
    <!-- 配置mapper.xml文件 -->
    <!-- <mapper resource="./mybatis/user.xml"/> -->
    <!--
     class属性:解析全局配置文件,遇到mapper,如果发现mapper中存在属性class
     在这个class所在的包/文件夹下查看是否存在一个mapper.xml文件,而且该文件的名称
     要与mapper接口的名称保持一致,如果找到加载这个mapper.xml文件
     -->
    <mapper class="com.langsin.mapper.UserMapper"/>
    </mappers>
进一步可以只配置包:
    <mappers>
    <package name="com.langsin.mapper"/>
    </mappers>
#6
service层里只需要:
                               Integer userId=1;
        /**
         * 为UserMapper类型的变量mapper赋值,赋值一个对象
         * 该对象由mybatis帮助实现
         * Mybatis框架会为 UserMapper接口动态的创建一个类,动态代理类
         */
        UserMapper mapper=session.getMapper(UserMapper.class);
        User user=mapper.queryUserById(userId);
        System.out.println(user);
        session.close();

11.为输出或输入映射对象设置类型别名
               <typeAliases>
     <typeAlias type="com.langsin.pojo.User" alias="user"/>
    </typeAliases>
 
进一步的,用包名去配置,别名为类名首字母小写:
               <typeAliases>
     <!-- <typeAlias type="com.langsin.pojo.User" alias="user"/> -->
     <package name="com.langsin.pojo"/>
    </typeAliases>

补充:mybatis内置了一些别名,比如我们写string,就是对应String类

12.typeHandler 类型处理器,无论是mybatis在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成Java类型。

13.输入映射 
传入
#基本数据类型
#pojo对象

(提出问题?)
(之前开发中每一张表都会对应一个pojo,当多表关联查询,查询的条件来自多个表,输入映射传什么?)
#解决方法一:hashMap
使用hashMap集合作为参数传入,#{}里写map的key值即可
例如:查询角色为普通用户,姓王的信息
select r.*,u.* 
from user u  join role r
on  r.role_code=u.role_code
where  r.role_name='普通用户' and u.cname  like '%王%';

补充:在mapper文件中,框架会根据方法的返回值,如果是集合session调用selectlist方法,如果是返回一个对象session调用selectone方法;

#解决方法二:自定义pojo
对原有的pojo的基础上进行二次封装,写一个queryBean

14.输出映射
resultType:映射Java或者pojo对象;
resultMap:使用resultMap属性完成高级输出结果的映射。
例如查询结果的列名与POJO对象的属性名不一致,可以通过定义一个resultMap对查询结果列名和POJO属性名之间做一个映射关系。

resultMap的高级操作:比如多对多关联查询时,见下文

15.动态sql:最终执行的sql语句,根据输入的查询条件来决定的;
    <select id="queryRoleUser" parameterType="HashMap" resultMap="roleUserMap">
    
        select r.*,u.*
        from user u LEFT JOIN role r
        on r.role_code=u.role_code
        <!-- where r.role_name=#{roleName} and u.cname like #{cname}; -->
        <where>
        <if test="roleName!=null and roleName!=''">
        and r.role_name=#{roleName}
        </if>
        <if test="cname!=null and cname!=''">
        and u.cname like #{cname}
        </if>
        </where>
    </select>

16.SQL片段:多条查询语句,包含相同的查询条件;
    <select id="queryRoleUser" parameterType="HashMap" resultMap="roleUserMap">
    
        select r.*,u.*
        from user u LEFT JOIN role r
        on r.role_code=u.role_code
        <!-- where r.role_name=#{roleName} and u.cname like #{cname}; -->
        <include refid="queryUserStatus"></include>
    </select>
    
    <sql id="queryUserStatus">
        <where>
        <if test="roleName!=null and roleName!=''">
        and r.role_name=#{roleName}
        </if>
        <if test="cname!=null and cname!=''">
        and u.cname like #{cname}
        </if>
        </where>
    </sql>
注意:这里使用if进行判断空的时候,要使用属性名,所以要用hashmap,或者传入一个pojo;

17.使用foreach遍历:可以用来进行批量删除;
之前:
前端通过一组checkbox (相同name)选中后,将所有要删除的记录的id拼接字符串,提交
提交后,后台解析字符串,拼接字符串:select from tuser where uid in(id1,id2,id3,id4,,,,,);

使用foreach遍历:
                <select id="queryUserByIds" parameterType="userId" resultMap="userMap">
         SELECT * FROM user 
         <if test="idList!=null">
          <where>
          user_id in
          <foreach collection="idList" item="userId" open="(" separator="," close=")">
          #{userId}
          </foreach>
          </where>
         </if>
    </select>
测试:
public void queryUserByIds() throws Exception {
        UserId userId = new UserId();
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(3);
        userId.setIdList(list);
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> userlis = mapper.queryUserByIds(userId); 
}

SSM之Mybatis框架初步相关推荐

  1. SSM之Mybatis框架

    最近在学SSM框架,现在来简单介绍一下,SSM里的mybatis框架. 首先来介绍一下ORM 1.ORM简介 Object Relational Mapping:对象关系映射. 简单的理解:ORM是通 ...

  2. SSM之Mybatis框架高级

    1.resultMap高级操作:联合查询操作 #1 一对一关联查询 例如:根据订单关联查询用户 输出映射: resultType:自定义一个拓展的的pojo resultMap: 这里的resultM ...

  3. MyBatis框架学习 DAY_02:使用XML配置文件/多参数问题 / FOREACH /IF / #{}和${} / 创建SSM框架流程

    XML文件配置SQL 1. 使用XML文件配置SQL语句 2. 关于多参数的问题 2. 练习 3. 动态SQL -- foreach 4. 动态SQL -- if 5. 关于#{}和${}格式的占位符 ...

  4. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

    SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee ...

  5. Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...

  6. SSM框架实现用户查询、注册、登录——IDEA整合Spring、Spring MVC、Mybatis 框架

    目录 零.前言 一.说明 1.整合说明 2.最终目标 3.数据库准备 二.搭建整合环境 1.创建 maven 工程 2.导入依赖坐标 3.创建java和resources文件夹 4.创建类和接口文件 ...

  7. Java语言开发在线美食推荐网 美食推荐系统 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能、大数据、机器学习项目开发

    Java语言开发在线美食推荐网 美食推荐系统 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能.大数据.机器学习项目开发FoodRecomm ...

  8. SSM持久层框架MyBatis,看这一篇就够了

    前言: 此篇仅为个人初期学习笔记,如有错误,请xd们指正 你这么好看,还.... MyBatis 前言 一.MyBatis简介 二.搭建MyBatis项目 1. 开发环境 2. 创建maven工程 3 ...

  9. SSM、SSH框架 | Mybatis | Spring | Maven

    1.三层架构 1.1 表现层: 用于展示数据 1.2 业务层: 处理业务需求 1.3 持久层: 直接和数据库进行交互 1.4 架构间的关系 1.5 框架组合 1.5.1 SSH:Struts .Spr ...

最新文章

  1. linux pps 包 网卡,linux下安装PPS
  2. JavaScript面向对象的支持(7)
  3. 星外主机管理系统可以装到内网_智慧消防管理系统_消防物联网远程管理平台...
  4. DL之DeepLabv3:DeepLab v3和DeepLab v3+算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  5. EasyUI中Datebox日期框的简单使用
  6. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_24-CMS前端页面查询开发-使用钩子方法实现立即查询...
  7. java如何让cpu过负荷_服务器开发过载问题如何解决
  8. AMPL Matlab 自动求导(AD)求解雅克比、海森矩阵
  9. android 四大组件,安卓四大组件及其作用
  10. rabbitmq使用mqtt协议
  11. 在线版和离线版电路仿真以及开源电子硬件设计介绍
  12. 数据库原理基本SQL语句练习题及答案1
  13. vue-element换肤所有主题色和基础色均可自主配置
  14. Python当前时间是一年中第几周
  15. 再谈GC1:GC简介,分代与回收算法
  16. ❤️解决非线性回归问题的机器学习方法总结:多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型
  17. mathcad入门二
  18. 【学习笔记】无监督行人重识别
  19. 福布斯约稿 | 客户体验的全景分析:从了解到行动
  20. Ribbon 的替代品 Spring Cloud Loadbalancer 使用与原理分析

热门文章

  1. MYSQL  GROUP BY 对多个字段进行分组
  2. 如何更好地理解Javascript对象的自有属性和原型继承属性
  3. MongoDB查询时排序字段为int类型和string类型的区别
  4. 外包以小时计算金额的费用_基金申购赎回费用计算实例
  5. IDEA中修改自动生成的Servlet模板,提高编码效率
  6. IDEA依赖冲突分析神器—Maven Helper
  7. 深入理解ArrayList
  8. 在字典中根据条件来筛选数据
  9. Java限流之 —— Nginx限流
  10. spring boot入门学习---热部署