SSM之Mybatis框架初步
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框架初步相关推荐
- SSM之Mybatis框架
最近在学SSM框架,现在来简单介绍一下,SSM里的mybatis框架. 首先来介绍一下ORM 1.ORM简介 Object Relational Mapping:对象关系映射. 简单的理解:ORM是通 ...
- SSM之Mybatis框架高级
1.resultMap高级操作:联合查询操作 #1 一对一关联查询 例如:根据订单关联查询用户 输出映射: resultType:自定义一个拓展的的pojo resultMap: 这里的resultM ...
- MyBatis框架学习 DAY_02:使用XML配置文件/多参数问题 / FOREACH /IF / #{}和${} / 创建SSM框架流程
XML文件配置SQL 1. 使用XML文件配置SQL语句 2. 关于多参数的问题 2. 练习 3. 动态SQL -- foreach 4. 动态SQL -- if 5. 关于#{}和${}格式的占位符 ...
- SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)
SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee ...
- Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发
Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...
- SSM框架实现用户查询、注册、登录——IDEA整合Spring、Spring MVC、Mybatis 框架
目录 零.前言 一.说明 1.整合说明 2.最终目标 3.数据库准备 二.搭建整合环境 1.创建 maven 工程 2.导入依赖坐标 3.创建java和resources文件夹 4.创建类和接口文件 ...
- Java语言开发在线美食推荐网 美食推荐系统 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能、大数据、机器学习项目开发
Java语言开发在线美食推荐网 美食推荐系统 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis框架 人工智能.大数据.机器学习项目开发FoodRecomm ...
- SSM持久层框架MyBatis,看这一篇就够了
前言: 此篇仅为个人初期学习笔记,如有错误,请xd们指正 你这么好看,还.... MyBatis 前言 一.MyBatis简介 二.搭建MyBatis项目 1. 开发环境 2. 创建maven工程 3 ...
- SSM、SSH框架 | Mybatis | Spring | Maven
1.三层架构 1.1 表现层: 用于展示数据 1.2 业务层: 处理业务需求 1.3 持久层: 直接和数据库进行交互 1.4 架构间的关系 1.5 框架组合 1.5.1 SSH:Struts .Spr ...
最新文章
- linux pps 包 网卡,linux下安装PPS
- JavaScript面向对象的支持(7)
- 星外主机管理系统可以装到内网_智慧消防管理系统_消防物联网远程管理平台...
- DL之DeepLabv3:DeepLab v3和DeepLab v3+算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- EasyUI中Datebox日期框的简单使用
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_24-CMS前端页面查询开发-使用钩子方法实现立即查询...
- java如何让cpu过负荷_服务器开发过载问题如何解决
- AMPL Matlab 自动求导(AD)求解雅克比、海森矩阵
- android 四大组件,安卓四大组件及其作用
- rabbitmq使用mqtt协议
- 在线版和离线版电路仿真以及开源电子硬件设计介绍
- 数据库原理基本SQL语句练习题及答案1
- vue-element换肤所有主题色和基础色均可自主配置
- Python当前时间是一年中第几周
- 再谈GC1:GC简介,分代与回收算法
- ❤️解决非线性回归问题的机器学习方法总结:多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型
- mathcad入门二
- 【学习笔记】无监督行人重识别
- 福布斯约稿 | 客户体验的全景分析:从了解到行动
- Ribbon 的替代品 Spring Cloud Loadbalancer 使用与原理分析