MyBatis知识点

一,使用jdbc开发时,和mybatis相比的不足
1.数据库连接时,使用时就创建,不使用就释放,造成资源浪费
2.使用数据库连接池管理数据库连接
二,硬编码不利于sql语句维护
把sql放在xml文件中,修改sql不需要重新编译java代码
三,预编译设置参数,硬编码,修改sql语句也不需要重新编译
把sql语句和占位符设置参数放在xml中
四,result遍历结果集硬编码
五,sql语句耦合不方便优化

框架,就是重复的一整套代码,与具体业务无关

查询结果自动映射java对象

Mybatis前身是iBatis,mybatis持久化,半自动的框架,apache下的顶级项目,自动生成满足需要的sql语句
特点:
1)支持自定义SQL、存储过程、及高级映射
2)实现自动对SQL的参数设置
3)实现自动对结果集进行解析和封装
4)通过XML或者注解进行配置和映射,大大减少代码量
5)数据源的连接信息通过配置文件进行配置

Mybatis是对JDBC进行了简单的封装,与Hibernate相比,配置更加简单,灵活,执行效率高,半自动化的ORM框架,需要手写SQL
执行流程->
sqlMapConfig.xml全局配置文件->
配置映射文件mapper.xml->
sqlSessionFactory(会话工厂)Transaction (事务)Connection (连接)Execution (执行) ->
sqlSessions会话 线程不安全,会导致数据库产生脏读(使用 MyBatis 的主要 Java 接口就是 SqlSession。SqlSessions 是由 SqlSessionFactory 实例创建的。)->
Executor执行器->
mapped statement->(输出参数类型,java简单类型,hashmap,pojo)

parameterType:指定输入参数的类型,这里id的类型为int
resultType:输出结果类型,表示sql语句执行后输出结果(单条结果)

sqlsession会话去执行惭怍数据库映射文件,错误应该为"%${value}%"
ps:#{value}的写法执行结果是没有查到任何记录
因为模糊查询记录需要%hello%形式,添加%%后的正确写法为%${value}%
${}:表示拼接SQL串,将接受到的参数不加任何修饰拼接到sql中,但是拼接sql会引起sql注入
v a l u e : 接 受 参 数 的 内 容 , 如 果 传 入 是 简 单 类 型 , {value}:接受参数的内容,如果传入是简单类型, value:{}中只能使用value

parameterType:输入参数类型就是pojo(用户信息)
#{}:指定pojo的属性名,接受到pojo对象的属性值,mybatis通过使用OGNL表达式获取对下那个
id:可以不用写,因为数据库中id是自增的

#{}表示一个占位符号,详单与语句中的?
表 示 一 个 拼 接 符 号 , 会 引 用 s q l , 所 以 不 建 议 使 用 {}表示一个 拼接符号,会引用sql,所以不建议使用 sql使{}tableName时候用

1.#{}预编译
2.${}非预编译(直接sql拼接,不能防止sql注入)
参数类型有三种:
1.基本数据类型
2.HashMap(使用方法和pojo类似)
3.Pojo自定义包装类型

mybatis利用mapper代理开发dao(重点掌握)
mapper 代理开发,就不需要接口的实现类,只需要接口UserMapper.java和映射文件UserMapper.xml就可以
注意点:
1,在UserMapper.xml文件中namespace等于UserMapper接口地址
2,UserMapper.java接口中的方法名要和UserMapper.xml中的statement的id一致
3,UserMapper.java接口中的方法输入参数要和UserMapper.xml中的statement的parameterType指定的类型一致
4,UserMapper.java接口中的方法的返回值类型要和UserMapper.xml中的statement的resultType指定的类型一致

mapper代理开发dao出现的问题总结:
1,代理对象内部调用selectOne或selectList
如果mapper方法返回单个pojo对象(非集合对象),可以通过selectOne也可以通过selectList
如果mapper方法返回集合对象(非集合对象)如果mapper方法返回集合对象,代理对象内部通过selectList查询 数据库,不能使用selectOne查询,否则会出错。
mapper接口方法参数只有一个
根据规范编写的代理对象的传入参数只能有一个(mapper.xml文件中的parameterType参数只有一个),不利于系统的扩展
扩展:
解决:即使mapper接口中只有一个参数,可以使用包装类型的pojo满足不同的业务需求

mybatis细节分析:
1.properties
(1)首先被读取,可以在properties加入jdbc.properties可以不用硬编码了

(2)settings全局参数设置
mybatis框架运行时可以调整一些运行参数,会影响mybatis运行行为,建议不要修改

(3)别名typeAliases

<typeAliases>
           <!--针对单个别名定义
               type:类型的路径
               alias:别名 -->
          <typeAlias type="com.jary.mybatis.po.User" alias="user" />
          <!--还可以进行批量别名定义
          指定包名,mybatis自动扫描包中的po类 -->
          <package name="com.jary.mybatis.po" />
<package>自动扫描包内类名
      </typeAliases> 

扫描完毕后就能在mapper.xml中使用了
user代替了com.jary.mybatis.po.User

4.映射文件(mapper)
通过resource加载单个的映射文件

<mapper resource = "mapper/UserMapper.xml">

通过mapper接口加载单个mapper,要遵循一定的规范:
通过resource加载单个的映射文件(推荐使用)

<mapper resource="mapper/UserMapper.xml" />

通过mapper接口加载单个mapper,要遵循一定的规范:
(1)前提是使用mapper代理开发(已经有4个规范)
(2)需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在同一目录下

<mapper class="com.jary.mybatis.mapper.UserMapper" />

通过批量加载mapper(推荐使用):实现条件是
要满足mapper接口加载映射文件和使用mapper代理开发同时满足

<package name = "cn.itcast.mybatis.mapper">

mybatis的一些细节剖析结束
mybatis的核心输入映射和输出映射开始
输入映射:
1.通过parameeterType可以是简单类型,hashmap,pojo

输出映射
1,resultType
使用resultType进行输出映射时,只有查询输出结果列名和pojo属性名一致才会创建pojo
pojo属性名和查询结果没有一个一致,不会创建pojo对象
pojo属性名和查询结果有一个一致,创建pojo

2,resultMap
使用resultMap进行映射时,查询结果列名和pojo属性名不一致,resultMap会进行映射保持一致
需要执行这两步:
1,定义resultMap

<resultMap type="user" id="userResultMap">

<id:表示查询结果唯一标识
column:查询出来列名
property:type指定的pojo类型中的属性名
result:对普通名映射定义

<id column="id_" property="id" />
<result column = "username_" property="username">
</resultMap>

使用resultMap作为statement的输出映射类型

<select id="" parameterType="int" resultMap="userResultMap">

mybatis的合兴输入映射和输出映射结束:
mybatis的动态 sql和sql片段开始
动态sql
mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接和组装
需求:用户信息查询的综合信息需要使用动态sql
对查询条件进行判断,如果出入参数不为空,才进行拼接

配置映射文件
Mapper标签:用来配置不同的statement
Namespace属性:用来配置名称空间,来区分不同的映射文件中的statement
编写crud的statement:select,update,insert,delete
Select:专门用于查询的statement,可以编写查询语句
id属性:该statement的唯一表示,一般用来被引用
resultType结果集类型
parameterType:参数类型,可以省略,一般都能省略

使用步骤:
1,获取全局配置文件的输入流,加载全局配置文件
2,通过全局配置文件的输入流创建SqlSessionFactory
3,通过SqlSessionFactory获取SqlSession
4,通过SqlSession操作crud
5,关闭SqlSession,释放资源

openSession(true)自动提交事务;
Mapper接口开发方法只需程序员提供共Mapper接口(相当于dao接口),实现类由Mybaits
Mabits是Mybatis的另外一种写法

namespace的值为接口的全限定类名
statement中的id为接口中的方法名称

配置数据库,管理映射文件
mapUnderscoreToCamelCase 默认值 为false

开启驼峰匹配,完成经典的数据库命名到java属性的映射
经典数据库 命名:如果多个单词之间,通常使用下划线进行连接
java中命名:第二个单词首字母大写
驼峰匹配:相当于去掉数据中的名字下划线,和java进行匹配

typeAliases标签
之前咱们在映射文件中用到java类型时,都是使用类的全路径

<typeAliases>
	<typeAlias type = "cn.itcast.pojo.User" alias = "User" />
</typeAliases>

全路径开启包扫描就可以了

<typeAliases>
	<packaging id="cn.itcast.pojo"/>
</typeAliases>
<update id = "updateUser">
UPDATE tb_user
SET user_name = #{userName},
password = #{password},

sql语句要区分列名大小写,大小写会导致查询结果产生影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值