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?它提供了哪些功能?

  1. 什么是MyBatis?
    早期叫做iBatis,开源框架,代码在Github
    mybatis是Mybatis SQL Mapper Farmework for Java(SQL映射框架)

  2. mybatis提供了哪些功能?
    1.提供了创建Connection、Statement、ResultSet的能力
    2.提供了执行sql语句的能力
    3.提供了循环sql,把sql结果转为java对象,List集合的能力
    4.提供了关闭资源的能力
    开发人员做的是:提供sql语句

  3. 总结
    mybatis是一个sql映射框架,提供了数据库的操作能力,是一个增强的JDBC。
    使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection、Statement、ResultSet的创建与关闭。

mybatis的配置

  1. <mapper>标签下:
    namespace是命名空间(要求使用dao接口的全限定名称
    不同的mapper映射文件使用namespace来做区分
    不同的mapper映射文件所使用的namespace的命名不允许重复

  2. <insert>、<update>、<delete>、<select>标签下:
    id:每个标签独有(必须写)(要求使用接口中的方法名
     <select>标签:
     parameterType:为sql语句传参数的类型(可以省略不写)
     resultType:返回值类型(必须写)(值是类型的全限定名称)

  3. sql语句必须写在相应的标签中:
    <insert>、<update>、<delete>、<select>

    使用【命名空间.sqlId】的形式来找到我们想要执行的sql语句
    标签:通常只写id,其他属性一律不写

  4. MyBatis默认情况下是手动提交事务!

mybatis基本步骤

  1. 加入maven依赖
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  2. 创建Dao接口,定义操作数据的方法
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  3. 创建mapper文件(dao/xxxDao.xml,文件名和Dao接口名一致),也叫sql映射文件:写sql语句,和接口中对应的方法语句
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  4. 创建mybatis的一个主配置文件(resourses/mybatis-config.xml):连接数据库,指定mapper文件位置
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  5. 使用mybatis对象 SqlSession,通过它的方法执行sql语句
    这里创建工具类MybatisUtils(使用JDK动态代理,下文会讲到
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
    测试使用:
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

使用mybatis动态代理

代理什么?

mybatis帮你创建dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句

使用动态代理的方式?

  1. 获取SqlSession对象,SqlSessionFactory.openSession()
  2. 使用getMapper方法获取某个接口的对象,sqlSession.getMapper(接口.class)
  3. 使用dao接口的方法,调用方法就执行了mapper文件中的sql语句

使用动态代理要求?(重点)

  1. dao接口和mapper文件放在一个目录(dao)
  2. dao接口名和mapper文件名一致
  3. mapper文件中的namespace的值是dao接口的全限定名称
  4. mapper文件中<select>,<insert>,<update>,<delete>等的id是接口中的方法名称

对于工具类中的主要类的介绍

  1. Resources:
    mybatis中的一个类,负责读取配置文件
     InputStream is =Resources.getResourceAsStream("mybatis-config.xml");

  2. SqlSessionFactoryBuilder:
    创建SqlSessionFactory对象
     SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
    创建SqlSessionFactory对象:
     SqlSessionFactory factory=builder.build(is);

  3. SqlSessionFactory:(重要
    重量级对象,程序创建一个对象耗时比较长,使用资源比较多,在整个项目中,有一个就够用了。
    作用:
    获取SqlSession对象
     SqlSession sqlsession=factory.openSession();
    openSession()方法说明:
     1.openSession():无参数,获取非自动提交事务的SqlSession对象
     2.openSession(boolean false):获取非自动提交事务的SqlSession对象
     3.openSession(boolean true):获取自动提交事务的SqlSession对象

  4. SqlSession:(重要
    SqlSession接口:定义了操作数据的方法
    使用要求:
     SqlSession对象不是线程安全的,需要在方法内部使用,在执行Sql语句之前,使用openSession()获取SqlSession对象。
    执行完毕后,需要关闭它,这样保证了它的线程安全

对于参数的理解

从java代码中把实际的值传入到mapper文件中

传参数的方法

  1. 一个简单类型的参数:#{任意字符}
    简单类型:mybatis把java的基本数据类型和String都叫简单类型
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  2. 多个简单类型的参数:Dao类方法中使用@Param(“自定义名称”)
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  3. 使用一个java对象,对象的属性值作为mapper文件的参数:#{java对象的属性名}
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  4. 使用参数的位置:#{arg0,arg1}(不常用)

  5. 使用Map作为参数:#{Map的key}(不常用)

#和$的区别(重点)

#:占位符,表示列值,效率高,相当于PreparedStatement
$:占位符,表示字符串连接,可能会发生sql注入,效率低,相当于Statement

mybatis返回结果

  1. resultType:表示sql语句的执行结果
     1.使用类型的全限定名称(常用)
     2.使用别名:使用<typeAlias>标签;使用<package name="包名">类名就是包名

  2. resultMap:自定义别名和java对象的属性名关系

  3. 当列名和属性名不一样的解决方式
     1.sql语句中使用列别名
     select name as myname from student
     
     2.使用<resultMap>标签定义列名和属性的对应关系
    mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  4. like(模糊查询)
     1.在java代码中指定like的内容:String sql="%李%"
     2.在mapper中拼接like where name="%" ${name} "%"

动态sql

sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分的变化
动态sql的实现,使用的是mybatis提供的标签<if> <where> <foreach>

if是判断条件的

<if test="判断java对象的属性值">
  部分sql语句
 </if>
语法:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

where用来包含多个<if>

当多个if有一个成立的话,<where>标签会自动增加一个where关键字,并去掉<if>中多余的and、or…
语法:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

foreach循环java中的数组,list集合的。

主要用在sql的in语句中
<foreach collection="" item="" open="" close="" separator="">
</foreach>
 collection:表示接口中方法参数的类型,如果是数组就用array,list集合就用list
 item:自定义的,表示数组和集合成员的变量
 open:循环开始时的字符
 close:循环结束时的字符
 separator:集合成员之间的分隔符
 
 语法:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

sql代码片段,就是复用一些语句

步骤:
  先定义<sql id="自定义名称">sql语句,表名,字段</sql>
  再使用<include refid="id">

属性配置文件

  1. 数据库的属性配置文件(常用)
    把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开
     在resources目录中定义一个属性配置文件:xxx.properties
     在mybatis的主配置文件,使用<property>指定文件的位置
     mybatis学习笔记(maven工具下)-基于IDEA2020.1.1mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

  2. 指定多个mapper文件
    第一种:在<mappers>中添加多个<mapper resource="mapper文件的路径">
    第二种:在<mappers>中添加包<package name="mapper所在的包名">

使用<package>的要求:
mapper文件名和接口名一致
mapper文件和dao接口在同一目录

PageHelper数据分页

是国人写的一款插件,不属于mybatis
实现数据分页,需要在pom文件和mybatis-config文件中配置依赖和插件

pom:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
mybatis-config:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1
测试:
mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

mybatis学习笔记(maven工具下)-基于IDEA2020.1.1

mybatis学习笔记(maven工具下)-基于IDEA2020.1.1