mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
目 录
三层架构
界面层:接受用户的请求参数,显示处理结果(jsp、html、servlet)
业务逻辑层:接受了界面层传递的数据,计算逻辑,调用数据库,获取数据
数据访问层:访问数据库,执行增删改查操作等等
三层对应的包
界面层:controller包(servlet)
业务逻辑层:service包(XXXService类)
数据访问层:dao包(XXXDao类)
三层中类的交互
用户使用界面层–>业务逻辑层–>数据访问层(持久层)–>数据库
三层对应的处理框架
界面层–servlet–springmvc(框架)
业务逻辑层–service类–spring(框架)
数据访问层–dao类–mybatis(框架)
框架
什么是框架?
框架是一个模块,一个软件,半成品的软件,定义好了一些基础功能,需要加入自己所需要的功能就完整了
1.框架中定义好了一些功能,这些功能是可用的。
2.可以加入项目中自己的功能,这些功能可以利用框架中写好的功能。
框架特点:
1.框架一般不是全能的,不能做所有事情
2.框架是针对某一个领域有效
3.框架是一个软件
MyBatis框架
什么是MyBatis?它提供了哪些功能?
-
什么是MyBatis?
早期叫做iBatis,开源框架,代码在Github
mybatis是Mybatis SQL Mapper Farmework for Java(SQL映射框架) -
mybatis提供了哪些功能?
1.提供了创建Connection、Statement、ResultSet的能力
2.提供了执行sql语句的能力
3.提供了循环sql,把sql结果转为java对象,List集合的能力
4.提供了关闭资源的能力
开发人员做的是:提供sql语句 -
总结:
mybatis是一个sql映射框架,提供了数据库的操作能力,是一个增强的JDBC。
使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection、Statement、ResultSet的创建与关闭。
mybatis的配置
-
在
<mapper>
标签下:
namespace是命名空间(要求使用dao接口的全限定名称)
不同的mapper映射文件使用namespace来做区分
不同的mapper映射文件所使用的namespace的命名不允许重复 -
在
<insert>、<update>、<delete>、<select>
标签下:
id:每个标签独有(必须写)(要求使用接口中的方法名)
<select>
标签:
parameterType:为sql语句传参数的类型(可以省略不写)
resultType:返回值类型(必须写)(值是类型的全限定名称) -
sql语句必须写在相应的标签中:
<insert>、<update>、<delete>、<select>
使用【命名空间.sqlId】的形式来找到我们想要执行的sql语句
标签:通常只写id,其他属性一律不写 -
MyBatis默认情况下是手动提交事务!
mybatis基本步骤
-
加入maven依赖
-
创建Dao接口,定义操作数据的方法
-
创建mapper文件(dao/xxxDao.xml,文件名和Dao接口名一致),也叫sql映射文件:写sql语句,和接口中对应的方法语句
-
创建mybatis的一个主配置文件(resourses/mybatis-config.xml):连接数据库,指定mapper文件位置
-
使用mybatis对象 SqlSession,通过它的方法执行sql语句
这里创建工具类MybatisUtils(使用JDK动态代理,下文会讲到)
测试使用:
使用mybatis动态代理
代理什么?
mybatis帮你创建dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句
使用动态代理的方式?
- 获取SqlSession对象,SqlSessionFactory.openSession()
- 使用getMapper方法获取某个接口的对象,sqlSession.getMapper(接口.class)
- 使用dao接口的方法,调用方法就执行了mapper文件中的sql语句
使用动态代理要求?(重点)
- dao接口和mapper文件放在一个目录(dao)
- dao接口名和mapper文件名一致
- mapper文件中的namespace的值是dao接口的全限定名称
- mapper文件中
<select>,<insert>,<update>,<delete>
等的id是接口中的方法名称
对于工具类中的主要类的介绍
-
Resources:
mybatis中的一个类,负责读取配置文件
InputStream is =Resources.getResourceAsStream("mybatis-config.xml");
-
SqlSessionFactoryBuilder:
创建SqlSessionFactory对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
创建SqlSessionFactory对象:
SqlSessionFactory factory=builder.build(is);
-
SqlSessionFactory:(重要)
重量级对象,程序创建一个对象耗时比较长,使用资源比较多,在整个项目中,有一个就够用了。
作用:
获取SqlSession对象
SqlSession sqlsession=factory.openSession();
openSession()方法说明:
1.openSession()
:无参数,获取非自动提交事务的SqlSession对象
2.openSession(boolean false)
:获取非自动提交事务的SqlSession对象
3.openSession(boolean true)
:获取自动提交事务的SqlSession对象 -
SqlSession:(重要)
SqlSession接口:定义了操作数据的方法
使用要求:
SqlSession对象不是线程安全的,需要在方法内部使用,在执行Sql语句之前,使用openSession()获取SqlSession对象。
执行完毕后,需要关闭它,这样保证了它的线程安全
对于参数的理解
从java代码中把实际的值传入到mapper文件中
传参数的方法
-
一个简单类型的参数:#{任意字符}
简单类型:mybatis把java的基本数据类型和String都叫简单类型 -
多个简单类型的参数:Dao类方法中使用@Param(“自定义名称”)
-
使用一个java对象,对象的属性值作为mapper文件的参数:#{java对象的属性名}
-
使用参数的位置:#{arg0,arg1}(不常用)
-
使用Map作为参数:#{Map的key}(不常用)
#和$的区别(重点)
#:占位符,表示列值,效率高,相当于PreparedStatement
$:占位符,表示字符串连接,可能会发生sql注入,效率低,相当于Statement
mybatis返回结果
-
resultType:表示sql语句的执行结果
1.使用类型的全限定名称(常用)
2.使用别名:使用<typeAlias>
标签;使用<package name="包名">
类名就是包名 -
resultMap:自定义别名和java对象的属性名关系
-
当列名和属性名不一样的解决方式:
1.sql语句中使用列别名
select name as myname from student
2.使用<resultMap>
标签定义列名和属性的对应关系 -
like(模糊查询)
1.在java代码中指定like的内容:String sql="%李%"
2.在mapper中拼接likewhere name="%" ${name} "%"
动态sql
sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分的变化
动态sql的实现,使用的是mybatis提供的标签<if> <where> <foreach>
if是判断条件的
<if test="判断java对象的属性值">
部分sql语句
</if>
语法:
where用来包含多个<if>
的
当多个if有一个成立的话,<where>
标签会自动增加一个where关键字,并去掉<if>
中多余的and、or…
语法:
foreach循环java中的数组,list集合的。
主要用在sql的in语句中<foreach collection="" item="" open="" close="" separator="">
</foreach>
collection:表示接口中方法参数的类型,如果是数组就用array,list集合就用list
item:自定义的,表示数组和集合成员的变量
open:循环开始时的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
语法:
sql代码片段,就是复用一些语句
步骤:
先定义<sql id="自定义名称">
sql语句,表名,字段</sql>
再使用<include refid="id">
属性配置文件
-
数据库的属性配置文件(常用)
把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开
在resources目录中定义一个属性配置文件:xxx.properties
在mybatis的主配置文件,使用<property>
指定文件的位置
-
指定多个mapper文件
第一种:在<mappers>
中添加多个<mapper resource="mapper文件的路径">
第二种:在<mappers>
中添加包<package name="mapper所在的包名">
使用<package>
的要求:
mapper文件名和接口名一致
mapper文件和dao接口在同一目录
PageHelper数据分页
是国人写的一款插件,不属于mybatis
实现数据分页,需要在pom文件和mybatis-config文件中配置依赖和插件
pom:
mybatis-config:
测试: