mybaties基于java的持久层框架,内部封装了jdbc
mybaties=ibaties3.0以后的版本,是半自动化的持久层框架
SQL与java编码分离,sql是开发人员控制。
什么是动态SQL?
同一个dao方法,根据不同的条件可以表示不同的SQL语句。主要是where语句有变化。使用mybatis提供的标签,实现动态语句SQL功能。
主要是if,where,foreach,sql.使用动态SQL的时候,dao方法的形参使用java对象
JDBC访问数据库的优缺点:
优点:直观好理解
缺点:创建好多对象;注册驱动;执行SQL ;把Student转为list集合;关闭资源;sql语句和业务逻辑混在一起
mabites能做什么?
1.注册驱动
2.创建jdbc中使用的connection,
3.执行SQL,得到resultset
4.处理resultset,把数据集中的对象向转为java对象,同时还能把java对象放到放入list集合里
5.关闭资源
6.实现java代码和SQL语句解耦合。
实现步骤:
0.创建student表(id,name,email,age)
1.新建maven项目
2.修改pom.xml文件(mybaties依赖,mysql驱动,junit),在build加入资源插件
3.创建student实体类,定义属性,属性名和类名一致
4.创建dao接口,定义操作数据库方法
5.创建xml文件(mapper文件),写SQL语句的(mybaties框架推荐是把SQL语句和java代码分开),mapper文件,定义到和dao接口同意目录下,一个表一个mapper文件
使用dao的代理要求:
mapper文件中的namespace:必须是dao接口的全限定名称
mappre文件中标签的id是dao接口中的接口名称
6.创建mybaties的主配置文件(xml文件)
1)创建链接实例数据源的datasource对象
2)指定其他mapper文件的位置,使用
7.创建测试的内容(此处以一个功能为例子)
1)使用main方法测试mybaties访问数据库
2)也可以使用junit测试访问数据库
进阶阶段:
将创建SQLsession的过程封装进java对象里,用的时候直接调用该对象的方法
补充:sqlsession不是线程安全的,使用的步骤:
1.在方法的内部,执行sql语句之前,先获取SQLsession对象
2.调用sqlsession的方法,执行sql语句
3.关闭sqlsession对象,执行sqlsession.close()
多个简单类型的参数 ,使用@param命名参数,注解是mybatis提供
// 位置:形参定义前面
// 属性:value自定义的参数名称
// 在mapper中,使用命名的参数名#{}
还可以通过参数的位置获取参数
当参数是map类型。key是mapper中的参数名,value是实际数值
#和$的区别?
#占位符,语法#{字符}。mybatis处理#{}使用的是jdbc对象的preparmentStatment对象。
特点:使用preparmentStatment对象,执行SQL语句,效率高。能够避免SQL注入,使SQL更安全。常常作为列值使用的,位于等号的右侧
占
位
符
:
语
法
占位符:语法
占位符:语法{字符}。
站
位
符
表
示
字
符
串
的
链
接
。
把
S
Q
L
语
句
的
其
他
内
容
和
站位符表示字符串的链接。把SQL语句的其他内容和
站位符表示字符串的链接。把SQL语句的其他内容和{}内容使用字符串(+)链接的方式连接在一起
特点:使用Statment对象,执行SQL语句,效率低。使用
占
位
符
的
值
,
使
用
字
符
串
链
接
方
式
,
有
S
Q
L
注
入
风
险
。
{}占位符的值,使用字符串链接方式,有SQL注入风险。
占位符的值,使用字符串链接方式,有SQL注入风险。{}数据是原样使用的,不会区分数据类型
常用作表名或列名。在能保证数据安全的情况下使用${}
当接口方法中的参数是class对象时,参数名称可直接使用对象中的参数名
resulttype(在mapper文件中=创建对象)和resultmap的区别:
resulttype
1.表示自定义类型
2.表示简单类型
3.表示map结构,只用于一行数据,否则会报错(一个key匹配多个值)
resultmap:结果映射,自定义类名和属性名之间的对应关系。用在了列名和属性名不同的情况
用法:
1.定义resultmap标签,指定类名和属性名对应的关系
2.在select标签中使用resulemap属性,指定上面定义的resultmap的id值
resultmap只能查询一行数据
因为resultmap会把数据库的列值作为key值,查到的数据作为value值。如果查询多个数据,会出现一个key对应多个map的情况,会报错
resulttype和resultmap不能同时用
like:
第一种方式:在java程序中,把like的内容组装好,把内容传给SQL语句
String name = “%g%”;
List list = studentDao.selectlikeone(name);
第二种方式,在SQL语句中,组织like内容
SQL语句like格式,where name like “%“空格#{name}空格”%”
if:
语法:
sql 代码
在mapper文件中
实体符号表:
< <
> >
>= >=
<= <=
where:
语法:里面是一个或多个if标签,当if条件判断为ture,转换为where关键字
语法:
foreach:使用foreach可以循环数组,list集合
#{item}
/foreach>
collection:表示要循环的是数组还是list集合
#{item}:获取集合成员的值
sql:sql标签用于定义SQL片段,可以是表名,几个字段,where条件都可以。以便其他SQL复用
方式:
1.在mapper中定义SQL代码片段部分SQL语句
2.在其他位置,使用include标签引用某个代码片段



