01-1-环境配置

1.框架概述

1)什么是框架

程序开发中的框架往往是对常见功能的封装,通常与具体业务无关,也可以认为是软件的半成品。程序框架理解为基础或者机械标准件(例如螺丝螺母标准的机械部件)。
假如你要造一辆马车,在没有框架的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后组成轮子,门,等部件,然后组装起来。但如果你用了框架,就相当于你有现成的轮子,门等部件,你只需要组装一下就可以了。
一个框架是一组可复用的设计构件。
框架是一个半成品,软件是成品。我们在它的基础上开发出成品(软件)。
01-1-环境配置 - 图1

2)框架解决的问题

1.解决了技术通用的问题

在JavaEE体系中,有着各种各样的技术。不同的软件企业,根据自身的业务需求选择不同的技术,容易造成应用依赖技术,增加了项目开发实现的复杂性和技术风险性。而框架技术就可以解决上述问题。

2.提升了开发效率

企业项目中使用框架,只需要专注实现业务需求。使用框架的方便性,提升了开发效率

3.提升了系统稳定性

一个成熟的框架,经过了在众多企业项目中的验证使用,稳定性有保障


2.Mybatis框架介绍

2.1 mybatis框架介绍

  1. mybatisApache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis201311月又迁移到了github(GitHub 是一个面向开源及私有 软件项目的托管平台)。
  2. MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射(多表)。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它对 jdbc 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 jdbc 繁杂的过程代码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJOPlain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.mybatis的优点

  1. 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
  2. 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
  3. 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。

    2.mybatis的不足

  4. 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。

  5. SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
  6. Mybatis框架还是比较简陋(半自动化框架),功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

    3.官方网站及框架包下载

    官网地址:http://www.mybatis.org/mybatis-3/

    4.mybatis框架整体架构

    01-1-环境配置 - 图2

    2.2 MyBatis的ORM方式

    Object Relational Mapping 对象关系映射
    01-1-环境配置 - 图3
    Mybatis有两种映射方式:
    1. 1.通过XML映射;
    2. 2.通过注解;
    小结:
    1、mybatis解决了三层(web,service,dao)中哪一层的问题?
    1. dao
    2、mybatis框架是对什么技术进行的封装?
    1. JDBC

3.MyBatis框架入门开发【掌握】TODO

3.1Mybatis快速入门

数据准备:

  1. create table user (
  2. id int primary key auto_increment,
  3. username varchar(20) not null,
  4. birthday date,
  5. sex char(1) default '男',
  6. address varchar(50)
  7. );
  8. insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
  9. insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
  10. insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
  11. insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');
  12. select * from user;
  1. https://mybatis.org/mybatis-3/zh/index.html
  2. -- 官网参考地址

需求1:使用Mybatis框架,从User表中根据用户id查询用户信息;
1.创建项目
2.创建lib目录,并导入mysql-connector-java-5.1.37.jar,mybatis-3.5.0.jar,log4j.jar
01-1-环境配置 - 图4
3.创建实体类User

  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private Date birthday;
  5. private String sex;
  6. private String address;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getUsername() {
  14. return username;
  15. }
  16. public void setUsername(String username) {
  17. this.username = username;
  18. }
  19. public Date getBirthday() {
  20. return birthday;
  21. }
  22. public void setBirthday(Date birthday) {
  23. this.birthday = birthday;
  24. }
  25. public String getSex() {
  26. return sex;
  27. }
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. public String getAddress() {
  32. return address;
  33. }
  34. public void setAddress(String address) {
  35. this.address = address;
  36. }
  37. @Override
  38. public String toString() {
  39. return "User{" +
  40. "id=" + id +
  41. ", username='" + username + '\'' +
  42. ", birthday=" + birthday +
  43. ", sex='" + sex + '\'' +
  44. ", address='" + address + '\'' +
  45. '}';
  46. }
  47. }

4.在src下创建核心配置文件:mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql:///day06_2"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="1234"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="mapper/UserMapper.xml"/>
  19. </mappers>
  20. </configuration>

5.在src下创建映射文件UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.heima.UserMapper">
  6. <select id="findById" resultType="com.heima.pojo.User">
  7. select * from user where id = #{id}
  8. </select>
  9. </mapper>

6.编写测试类代码

  1. public class TestAll {
  2. @Test
  3. public void test1(){
  4. //1.加载核心配置文件,构建会话工厂
  5. String resouce="mybatis-config.xml";
  6. InputStream in = null;
  7. try {
  8. in = Resources.getResourceAsStream(resouce);
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. }
  12. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
  13. //2.获取会话对象
  14. SqlSession sqlSession = sessionFactory.openSession();
  15. //3.调用sqlsession API完成查询
  16. User user = (User)sqlSession.selectOne("com.heima.UserMapper.findById", 1);
  17. System.out.println(user);
  18. //4.关闭资源
  19. sqlSession.close();
  20. }
  21. }

7.配置log4j.properties日志

  1. ### 设置Logger输出级别和输出目的地 ###
  2. log4j.rootLogger=debug, stdout
  3. ### 把日志信息输出到控制台 ###
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.Target=System.out
  6. log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

8.效果
01-1-环境配置 - 图5


3.2 Mybatis老式开发小结

1)旧式开发加载流程:
PPT演示:
01-1-环境配置 - 图6
2)使用mybatis老式的开发模式弊端:

  1. 1)要使用指定的sql必须使用命名空间.id进行字符串拼接,维护性比较差;
  2. 2)并且这个sql用多少次,就拼接多少次,维护性比较差;

3)Mybatis框架的核心类有哪些?

  1. SqlSessionFactoryBuilder 会话工厂构建类 主要用来构建会话工厂的
  2. SqlSessionFactory :会话工厂类 主要用来生产会话对象的;
  3. SqlSession:会话对象,底层是对Connection连接对象的封装;

4.mybatis的dao层动态代理实现【掌握】

4.1 Mybatis动态代理快速入门

1)介绍

  1. Mybatis存在2种开发方式:
  2. 1)旧版本mybatis执行的方式(了解即可);
  3. 2)动态代理实现操纵数据库(掌握);

核心步骤:

  1. 1)接口与xml映射文件绑定;
  2. 接口名称与xml映射文件命名空间要一致;
  3. 接口方法与xmlcrud标签ID要一致;
  4. 2)通过SqlSession获取代理对象;
  5. eg:sqlSession.getMapper(接口);

2)需求

练习:使用mybatis动态代理根据用户ID查询用户信息
第一步:新建接口 UserMapper;

  1. public interface UserMapper {
  2. /**
  3. * 根据用户id查询用户信息
  4. * @param id
  5. * @return
  6. */
  7. User findUserById(Integer id);
  8. }

第二步:将接口和映射文件绑定,在映射文件中书写SQL语句;;

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.heima.mapper.UserMapper">
  6. <select id="findUserById" resultType="com.heima.pojo.User">
  7. select * from user where id = #{id}
  8. </select>
  9. </mapper>
  1. 说明:接口与xml映射文件进行绑定,分两步:
  2. 1)接口的全限定名称与xml的命名空间名称要一致
  3. 2)接口中的方法名称与xmlcrud标签的id要一致;

第四步:获取UserMapper的动态代理对象完成查询;

  1. /**
  2. * 基于动态代理实现查询
  3. */
  4. @Test
  5. public void test2(){
  6. //1.加载核心配置文件,构建会话工厂
  7. String resource="mybatis-config.xml";
  8. InputStream in = null;
  9. try {
  10. in = Resources.getResourceAsStream(resource);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
  15. //2.获取会话对象
  16. SqlSession sqlSession = sessionFactory.openSession();
  17. //3.获取接口的代理对象
  18. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  19. //4.调用接口方法,进行处理
  20. User user = mapper.findUserById(1);
  21. System.out.println(user);
  22. //5.释放资源
  23. sqlSession.close();
  24. }

原理图:
PPT演示:
01-1-环境配置 - 图7


4.2 mybatis动态代理小结

Mybatis动态代理开发流程?

  1. 1)导入依赖的jar mybatis.jar jdbc驱动包 log4j.jar
  2. 2)定义pojo类型;
  3. 3)定义操纵pojo类的接口
  4. 4)定义xml映射文件,然后与接口进行绑定
  5. 4.1 xml的命名空间与接口的全限定名称要一致;
  6. 4.2 xml中的crud的标签id与接口中的方法名称要一致;
  7. 5)配置核心配置文件 (1.配置数据源 2.加载xml映射文件)
  8. 6)通过SqlSessionFactoryBuilder类加载核心配置文件,构建会话工厂;
  9. 7)通过会话工厂获取会话对象;
  10. 8)通过会话对象调用getMapper(接口.class)获取代理对象(正常使用接口完成数据库的操作)
  11. 9)释放资源,关闭连接(session.close())

5.mybatis核心配置

【mybatis全局配置介绍】
mybatis-config.xml,是MyBatis的全局配置文件,包含全局配置信息,如数据库连接参数、插件等。整个框架中只需要一个即可

  1. 参考:https://mybatis.org/mybatis-3/zh/configuration.html

01-1-环境配置 - 图8
说明:上述标签在实际使用过程中,要严格遵循使用顺讯,否则报错;

5.1 properties(属性)

1.作用:

  1. 1、通过子标签property设置属性;
  2. 2、加载外部的java资源文件(properties文件);

01-1-环境配置 - 图9

2.两种使用标签的方式

  1. 方式1(了解即可):
  2. 1、通过properties的子标签设置属性;
  3. 2、使用${key}获取设置的属性值;
  1. 方式2:
  2. 1.通过properties标签 resource属性引入加载外部properties文件

2.练习

练习1:使用properties下的内部配置全局参数(了解即可)

  1. <!--文件内部定义全局参数-->
  2. <properties>
  3. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  4. </properties>

练习2:核心配置文件通过表中的resource属性引入外部jdbc.properties文件
第一步:创建jdbc.properties配置文件:

  1. jdbc.driverClass=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql:///day06_2
  3. jdbc.user=root
  4. jdbc.password=1234

第二步:引入外部的配置文件

  1. <!--通过properties引入外部配置文件,使用resource属性 推荐-->
  2. <properties resource="jdbc.properties"/>

第三步:加载value值

  1. <environments default="development">
  2. <environment id="development">
  3. <transactionManager type="JDBC"/>
  4. <dataSource type="POOLED">
  5. <property name="driver" value="${jdbc.driverClass}"/>
  6. <property name="url" value="${jdbc.url}"/>
  7. <property name="username" value="${jdbc.user}"/>
  8. <property name="password" value="${jdbc.password}"/>
  9. </dataSource>
  10. </environment>
  11. </environments>

小结:
properties标签作用?

  1. 1.定义全局变量;
  2. 2.定义全局变量2中方式
  3. 2.1 内部定义
  4. <properties>
  5. <property name="key" value="值"/>
  6. </properties>
  7. 2.2 外部引入(推荐)
  8. <properties resource="外部配置文件路径"/>

5.2 settings(设置)

settinngs是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
01-1-环境配置 - 图10
settings参数有很多,我们先学习驼峰匹配mapUnderscoreToCamelCase,翻译过来就是映射下划线到驼峰式命名。
练习1:修改数据库username字段名称为user_name,并建立与pojo映射关系,配置驼峰映射
1)pojo:

  1. public class User {
  2. private Integer id;
  3. //表:user_name --->类:userName/username
  4. private String username;
  5. private Date birthday;
  6. private String sex;
  7. private String address;
  8. //setter getter toString
  9. }

2)设置开启驼峰映射

  1. <!--开启驼峰映射-->
  2. <settings>
  3. <!--作用:表:user_name 类:userName/username 自动映射-->
  4. <setting name="mapUnderscoreToCamelCase" value="true"/>
  5. </settings>

3)测试

  1. /**
  2. * 基于动态代理实现查询
  3. */
  4. @Test
  5. public void test2(){
  6. //1.加载核心配置文件,构建会话工厂
  7. String resource="mybatis-config.xml";
  8. InputStream in = null;
  9. try {
  10. in = Resources.getResourceAsStream(resource);
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
  15. //2.获取会话对象
  16. SqlSession sqlSession = sessionFactory.openSession();
  17. //3.获取接口的代理对象
  18. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  19. //4.调用接口方法,进行处理
  20. User user = mapper.findUserById(1);
  21. System.out.println(user);
  22. //5.释放资源
  23. sqlSession.close();
  24. }

小结:
1.开启驼峰自动映射的配置和作用?

  1. 1)配置
  2. <setttings>
  3. <setting name="mapUnderscoreToCamelCase" value="true"/>
  4. </setttings>
  5. 2)作用
  6. 自动将表中字段比如:user_name 映射到pojo属性:username/userName,无需给sql中字段取别名;

5.3 typeAliases(类型别名)

1.作用

类型别名是给类的全限定名称(包名.类名) 取一个短名称。存在的意义仅在于用来减少类完全限定名的冗余
01-1-环境配置 - 图11
可以通过设置一些短名来代替全限定名,有两种方式:

  1. 方式一:使用typeAliases标签的子标签typeAlias手动设置类型别名(逐一设置维护);
  2. 方式二:使用typeAliases标签的子标签package包扫描映射别名(推荐);

2.需求

练习1:使用typeAliases标签的子标签typeAlias简化UserMapper.xml中pojo类的名称

  1. <!--方式1:取别名,逐个取别名-->
  2. <typeAliases>
  3. <typeAlias type="com.heima.pojo.User" alias="user"/>
  4. </typeAliases>

练习2:使用typeAliases标签的子标签package包扫描映射别名

  1. <!--方式2:通过扫包取指定包下的pojo类取别名 (推荐)-->
  2. <typeAliases>
  3. <!--package name指定要取别名的包名-->
  4. <package name="com.heima.pojo"/>
  5. </typeAliases>

3.内置别名

这是一些为常见的 Java 类型内建的相应的类型别名。它们都是不区分大小写的,注意对基本类型名称重复采取的特殊命名风格。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator
  1. 说明:
  2. 基本类型别名是_基本类型名称;
  3. 包装类型别名时包装类首字母小写;

练习3:完成根据id查询用户姓名的功能;
1)定义接口方法:

  1. //练习3:完成根据id查询用户姓名的功能;
  2. String getNameById(Integer id);

2)接口方法与xml映射文件sql进行绑定

  1. <select id="getNameById" resultType="string">
  2. select user_name from user where id=#{id}
  3. </select>

3)测试

  1. @Test
  2. public void test3(){
  3. //1.加载核心配置文件,构建会话工厂
  4. InputStream in = null;
  5. try {
  6. in = Resources.getResourceAsStream("mybatis-config.xml");
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
  11. //2.获取会话对象
  12. SqlSession session = sessionFactory.openSession();
  13. //3.获取代理对象
  14. UserMapper mapper = session.getMapper(UserMapper.class);
  15. String name = mapper.getNameById(1);
  16. System.out.println(name);
  17. //4.关闭资源
  18. session.close();
  19. }

5.4 typeHandlers和environments(了解)

1)typeHandlers(类型处理器)【了解】

  1. MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。<br />![](https://cdn.nlark.com/yuque/0/2021/png/280648/1640162301194-395b0fd1-0bbb-49a9-ae3b-205c015e78a0.png#)<br />**提示** 从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。
  1. https://mybatis.org/mybatis-3/zh/configuration.html#settings

说明:mybatis内置的一些类型处理器,企业开发中使用默认的类型处理器;

2)environments【了解】

  1. MyBatis 可以配置成适应多种环境,例如,开发、测试和生产环境需要有不同的配置;
  2. 尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
  3. 虽然,这种方式也可以做到很方便的分离多个环境,但是实际使用场景下,我们更多的是选择使用spring来管理数据源,来做到环境的分离。
  1. 父标签: environments(环境配置)
  2. 子标签:
  3. environment(环境变量)
  4. transactionManager(事务管理器)
  5. dataSource(数据源)

练习:
练习1.xml配置多环境数据源,比如dev,test.online等,并在xml下指定online为默认环境运行;

  1. <!--environments内部可以配置多个数据源,default指定默认数据源-->
  2. <environments default="online">
  3. <!--environment配置具体数据源 id表示数据源的唯一表示-->
  4. <environment id="dev">
  5. <!--transactionManager事务管理器,type="jdbc":表示事务交给jdbc取管理-->
  6. <transactionManager type="JDBC"/>
  7. <!--dataSource表示数据源 type="POOLED"表示使用mybatis自带的连接池-->
  8. <dataSource type="POOLED">
  9. <property name="driver" value="${jdbc.driverClass}"/>
  10. <property name="url" value="${jdbc.url}"/>
  11. <property name="username" value="${jdbc.user}"/>
  12. <property name="password" value="${jdbc.password}"/>
  13. </dataSource>
  14. </environment>
  15. <environment id="test">
  16. <transactionManager type="JDBC"/>
  17. <dataSource type="POOLED">
  18. <property name="driver" value="${jdbc.driverClass}"/>
  19. <property name="url" value="${jdbc.url}"/>
  20. <property name="username" value="${jdbc.user}"/>
  21. <property name="password" value="${jdbc.password}"/>
  22. </dataSource>
  23. </environment>
  24. <environment id="online">
  25. <transactionManager type="JDBC"/>
  26. <dataSource type="POOLED">
  27. <property name="driver" value="${jdbc.driverClass}"/>
  28. <property name="url" value="jdbc:mysql:///day06_3"/>
  29. <property name="username" value="${jdbc.user}"/>
  30. <property name="password" value="${jdbc.password}"/>
  31. </dataSource>
  32. </environment>
  33. </environments>

练习2.xml配置多环境数据源,比如dev,test.online等,并使用会话构建工厂指定dev运行环境;
说明:在构建会话工厂的build方法中指定运行环境;

  1. /**
  2. * 在build方法下指定数据源
  3. */
  4. @Test
  5. public void test4(){
  6. //1.加载核心配置文件,构建会话工厂
  7. InputStream in = null;
  8. try {
  9. in = Resources.getResourceAsStream("mybatis-config.xml");
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. //在build方法下指定要切换的数据源的标识,会覆盖默认的数据源配置
  14. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in,"dev");
  15. //2.获取会话对象
  16. SqlSession session = sessionFactory.openSession();
  17. //3.获取代理对象
  18. UserMapper mapper = session.getMapper(UserMapper.class);
  19. String name = mapper.getNameById(1);
  20. System.out.println(name);
  21. //4.关闭资源
  22. session.close();
  23. }

小结:
Mybatis2种切换数据源的方式?

  1. 1)在核心配置文件下指定
  2. 格式:
  3. <environments default="dev">
  4. <environment id="dev">
  5. <property name="driver" value="com.mysql.jdbc.Driver"/>
  6. .....
  7. </environment>
  8. </environments>
  9. 2)方式2:在build方法指定
  10. new SqlSessionFactoryBuilder().build(in,"数据源标识");

5.5 mappers(映射器)

1.介绍

mappers(映射器):UserMapper.xml====>UserMapper.java接口 关联.
作用:维护接口和映射文件之间的关系.
使用方式:
1、加载XML映射文件,关联UserMapper.java接口
【1】 从src下加载映射文件;
【2】 从本地磁盘中加载映射文件,但是需要添加file:///协议
说明:如果项目采用基于xml的开发模式,建议使用方式1开发;
2、加载接口,关联映射文件
条件:1、接口名和映射文件名保持一致;2、路径保持一致;
【3】class:加载单独的接口:
【4】批量加载class:
说明:如果基于注解开发的开发的话,推荐使用方式4开发

2.练习

1)使用mapper下resource属性加载xml映射文件关联接口

  1. <mappers>
  2. <!--通过resource属性加载工程下相对路径下的映射文件-->
  3. <mapper resource="mapper/UserMapper.xml"/>
  4. </mappers>

2)使用完全限定资源符加载映射文件(了解即可)

  1. <!--通过url属性指定xml映射文件的绝对路径 [了解]-->
  2. <mapper url="file:///E:\上课视频资料\121\day06\mybatisday06\src\mapper\UserMapper.xml"/>

3)使用映射器接口实现类的完全限定类名 (了解即可)

  1. 前提条件:
  2. 1、接口名和映射文件名保持一致;
  3. 2、路径保持一致;
  4. 3.映射文件中的namespace必须与接口的全限定名称一致;
  1. <!--class指定接口的全限定名称,mybatis底层就可以获取接口的名称,然后因为
  2. 接口与xml文件名称相同且同路径,所以就可以获取xml映射文件; [了解]
  3. -->
  4. <mapper class="com.heima.mapper.UserMapper"/>

4)加载接口,关联映射文件方式package(推荐)

  1. 前提条件:
  2. 1.接口与映射文件名称必须相同;
  3. 2.接口与映射文件路径必须相同;
  4. 3.映射文件中的namespace必须与接口的全限定名称一致;
  1. <!--package表示通过扫包加载接口,然后获取接口名称,就获取了xml映射文件名称
  2. name属性指定接口的路径-->
  3. <package name="com.heima.mapper"/>

说明:package扫包加载的方式是mybatis注解开发优先推荐的方式;
如果基于xml开发,推荐使用方式1:resouce加载外部资源;


5.6 mappers映射器小结

1.加载xml映射文件的4种方式:

  1. 1)通过resource属性,相对路径加载(基于xml开发推荐的)
  2. eg:
  3. <mappers>
  4. <mapper resource="xml的相对路径"/>
  5. </mappers>
  6. 2)通过url绝对路径加载(了解即可)
  7. 弊端:路径是绝对的,可维护性很差
  8. eg:
  9. <mappers>
  10. <mapper url="file:///xml的绝对路径"/>
  11. </mappers>
  12. 3)通过class属性加载(了解即可)
  13. 约束条件:
  14. 3.1 接口名称与xml映射文件名称要一致;
  15. 3.2 接口路径与xml映射文件路径也要一致;
  16. eg:
  17. <mappers>
  18. <mapper class="接口的全限定名称"/>
  19. </mappers>
  20. 4)通过package扫包方式(基于注解开发推荐使用)
  21. 约束条件:
  22. 3.1 接口名称与xml映射文件名称要一致;
  23. 3.2 接口路径与xml映射文件路径也要一致;
  24. eg:
  25. <mappers>
  26. <package name="接口的包路径"/>
  27. </mappers>

2.基于package扫描的原理?

  1. 前提:
  2. 1.接口名称与xml映射文件名称要一致;
  3. 2.接口路径与xml映射文件路径也要一致;
  4. 通过package指定接口的路径之后,mybatis就会加载这个包下的接口,获取接口的名称,因为接口名称和路径与xml一致,所以也就获取xml映射文件;

3.思考:基于package扫描存在的缺点?

  1. 1)约束条件太多了;
  2. 2)java文件与xml文件存放在同一个路径下,可维护性差;

6.编写会话工具类


  1. 在静态代码块中创建会话工厂对象
  2. 编写静态方法得到会话对象
  3. 编写静态方法得到会话工厂对象
    1. public class MybatisUtil {
    2. //全局维护一个会话工厂
    3. private static SqlSessionFactory sqlSessionFactory;
    4. private static ThreadLocal<SqlSession> threadLocal=new ThreadLocal<>();
    5. //在静态代码块中加载mybatis核心配置文件,初始化sqlSessionFactory
    6. static {
    7. //抽取初始化工厂的方法
    8. initFactory();
    9. }
    10. //封装初始化session工厂的方法
    11. private static void initFactory() {
    12. String resource="mybatis-config.xml";
    13. InputStream in = null;
    14. try {
    15. in = Resources.getResourceAsStream(resource);
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
    20. }
    21. /**
    22. * 获取sqlSession对象
    23. * @return
    24. */
    25. private static SqlSession getSqlSession(){
    26. SqlSession sqlSession = threadLocal.get();
    27. if(sqlSession==null){
    28. sqlSession=sqlSessionFactory.openSession();
    29. //放回线程中 通过threadLocal为每一个线程都维护一个私有的会话对象,防止出现并发问题
    30. threadLocal.set(sqlSession);
    31. }
    32. return sqlSession;
    33. }
    34. /**
    35. * 封装获取动态代理对象的方法
    36. * @param tClass
    37. * @param <T>
    38. * @return
    39. */
    40. public static <T> T getMapper(Class<T> tClass){
    41. SqlSession sqlSession = getSqlSession();
    42. T mapper = sqlSession.getMapper(tClass);
    43. return mapper;
    44. }
    45. /**
    46. * 关闭资源
    47. */
    48. public static void close(){
    49. SqlSession sqlSession = threadLocal.get();
    50. if(sqlSession!=null){
    51. sqlSession.close();
    52. }
    53. }
    54. /**
    55. * 事务提交
    56. */
    57. public static void commit(){
    58. SqlSession sqlSession = threadLocal.get();
    59. if(sqlSession!=null){
    60. sqlSession.commit();
    61. }
    62. }
    63. /**
    64. * 事务回滚
    65. */
    66. public static void rollback(){
    67. SqlSession sqlSession = threadLocal.get();
    68. if(sqlSession!=null){
    69. sqlSession.rollback();
    70. }
    71. }
    72. }

7.Mybatis环境搭建

1.需求
搭建mybatis环境,完成dao层根据id查询用户数据功能;
2.数据准备:

  1. create table user (
  2. id int primary key auto_increment,
  3. username varchar(20) not null,
  4. age int,
  5. birthday date,
  6. sex char(1) default '男',
  7. address varchar(50)
  8. );
  9. insert into user values (null, '孙悟空',30,'1980-10-24','男','花果山水帘洞');
  10. insert into user values (null, '白骨精',20,'1992-11-12','女','白虎岭白骨洞');
  11. insert into user values (null, '猪八戒',20,'1983-05-20','男','福临山云栈洞');
  12. insert into user values (null, '蜘蛛精',30,'1995-03-22','女','盤丝洞');
  13. select * from user;

3.具体操作步骤

  1. 1.创建工程
  2. 2.导入依赖jar包;
  3. 3.创建接口和实体类;
  4. 4.配置mybatis全局配置文件和映射文件;
  5. 5.测试;

8.Mybatis映射文件配置

  1. Mapper映射文件中定义了操作数据库的sql,**每一个sql都被包含在一个statement**中。映射文件是mybatis操作数据库的核心。<br />SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):<br />![](https://cdn.nlark.com/yuque/0/2021/png/280648/1640162301274-a7ab4eb6-9e37-4970-96c9-d81b379ec65d.png#)<br /> 映射文件中需要直接书写SQL语句对数据库进行操作,对数据库操作SQL语句主要有**CRUD这四类**。这四类对应到映射文件中的配置为四类标签:`select`,`insert`,`update`,`delete` 。

8.1.select标签

select标签属性:

属性名 说明 是否必须
id 这条SQL语句的唯一标识,和接口的方法名一致
parameterType 入参类型
resultType/resultMap 返回值类型

练习1:根据id查询用户生日;
1)定义接口方法

  1. /**
  2. * 根据用户id查询用户的生日
  3. * @param id
  4. * @return
  5. */
  6. Date findBirthdayByUserId(Integer id);

2)xml文件sql绑定接口方法

  1. <select id="findBirthdayByUserId" resultType="java.sql.Date">
  2. select birthday from user where id=#{id}
  3. </select>

3)测试

  1. @Test
  2. public void test6(){
  3. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  4. Date birthday = userMapper.findBirthdayByUserId(3);
  5. System.out.println(birthday);
  6. MybatisUtil.close();
  7. }

8.2.insert标签

属性:

属性 说明 是否必须
id 这条SQL语句的唯一标识,和接口的方法名一致

说明:#{username},#{birthday},#{sex},#{address} 大括号里面的值必须和pojo的实体类User类中的属性名一致,否则会报错。
注意事项:Mybatis默认事务手动提交,可设置事务自动提交:

  1. SqlSession sqlSession = sqlSessionFactory.openSession(true);

1)定义接口方法:
2)绑定映射文件
3)测试
小结:
1.insert标签插入pojo注意事项?


8.3.update标签

属性 说明 是否必须
id SQL语句的唯一标识,和接口的方法名一致

1)定义接口方法
2)绑定映射文件
3)测试


8.4.delete标签

属性:

属性 说明 是否必须
id SQL语句的唯一标识,和接口的方法名一致

1)定义接口方法
2)映射文件绑定接口方法
3)测试


总结:

  1. 1)核心配置文件配置标签mybatis-config.xml(要求:能理解即可)
  2. <configuration>
  3. <properties resource="外部的properties文件"/>
  4. <settings>
  5. <setting name="xxx" value="布尔值,表示开启或者关闭"/>
  6. <setting name="mapUnderscoreToCamelCase" value="true"/>
  7. </settings>
  8. <typeAliases>
  9. <typeAlias type="pojo的全限定名称" alias="别名" />
  10. <package name="pojo的包路径"/>
  11. </typeAliases>
  12. <!-- 2种指定数据源的方式1 default 2)SqlSesionFactoryBuilder ---> build(in,数据源唯一标识) -->
  13. <environments default="指定默认的数据库环境">
  14. <environment id="xxx 要唯一">
  15. <!--transactionManager标识事务交给jdbc去管理-->
  16. <transactionManager type="JDBC"/>
  17. <!--数据源配置标签 type="POOLED" 表示使用mybatis自带的连接池-->
  18. <dataSource type="POOLED">
  19. <property name="driver" value="${jdbc.driverClass}"/>
  20. <property name="url" value="${jdbc.url}"/>
  21. <property name="username" value="${jdbc.username}"/>
  22. <property name="password" value="${jdbc.password}"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <mappers>
  27. <!-- 4中加载xml映射文件的方式 -->
  28. <mapper resource="外部的映射文件路径"/>
  29. <package name="接口的包路径"/>
  30. </mappers>
  31. </configuration>
  32. 2)映射文件中常用标签
  33. 1.select
  34. 格式:
  35. <select id="对应接口中的方法名称" resultType="pojo名称默认首字符小写/_基本类型/jdk对象类型小写">
  36. select * from t where id=#{任意变量}
  37. </select>
  38. 2.insert
  39. 格式:
  40. <insert id="xx">
  41. insert into t values(null,#{对应pojo中属性名称},....)
  42. </insert>
  43. 3.update
  44. 格式:
  45. <update id="xxx">
  46. update t set 字段1=#{对应pojo中属性名称},.... where id=#{id}
  47. </update>
  48. 4.delete
  49. 格式:
  50. <delete id="xxx">
  51. delete from t where id=#{id}
  52. </delete>