一,使用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语句要区分列名大小写,大小写会导致查询结果产生影响。