java学习之 MyBatis-day01

初识框架

框架是一种经过校验、具有一定功能的半成品软件.

  • 经过校验:指框架本身经过测试,且框架自身所具有的功能已经实现

  • 具有一定功能:指框架可以完成特定的功能,不同的框架功能不同

  • 半成品软件:指框架自身是一个软件,但是该软件无法直接运行,需要配合其他的程序才可以完成指定的工作.

程序架构

一.分层

三层架构.png

二.架构分工

image.png

三.架构职责

三层架构职责.png

MyBatis 基础

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集

使用流程

image-20200530114424946.png

准备环境

添加项目需要的 jar 包

  1. lombok-1.18.20.jar

    Lombok,自动生成 getter/setter/toString 等方法

    使用的前提是已经在 idea 中安装了 lombok 插件

  2. mysql-connector-java-5.1.26-bin.jar

    MySQL 数据库的 JDBC 驱动包,访问 MySQL 必须导入备 jar 包

  3. mybatis-3.4.5.jar

    MyBatis 框架的核心 jar 包

  4. 创建操作的表

  5. 根据表结构创建实体类

  6. mybatis 主配置文件: mybatis-config.xml

  7. 在项目的 resources(resources root)下创建 mybatis-config.xml 配置文件

  8. 拷贝 xml 的约束

    xml
    复制代码
    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  9. 添加环境配置(事务管理器 / 连接池 / 映射文件)

    xml
    复制代码
    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="dev"> <environment id="dev"> <!-- MyBatis 内置的事务管理器 JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名 --> <transactionManager type="JDBC"/> <!-- MyBatis 内置的连接池 POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别名 --> <dataSource type="POOLED"> <!-- driver:这是POOLED连接池对象的驱动类的属性名, Druid连接池对象的驱动类属性名是driverClassName --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis"/> <property name="username" value="root"/> <property name="password" value="admin"/> </dataSource> </environment> </environments> <mappers> <mapper resource="xxx/mapper/UserMapper.xml"/> </mappers> </configuration>
  10. db.properties配置文件

    在主配置文件中配置的内容较多, 其中包括我们修改频率较高的数据库连接信息(driver/url/username/password)等,我们可以在修改这些信息的过程中误改或者误删到其他的配置,为了解决这个问题,我们仍然是将这些信息配置到db.propertie 配置文件中,然后再合并到主配置文件即可,如下:

    properties
    复制代码
    driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis username=root password=admin

    mybatis-config.xml

    xml
    复制代码
    <configuration> <!-- 关联db.properties:为了把连接数据库的信息单独放到一个配置文件 --> <properties resource="db.properties" /> </configuration>
    1. mapper 映射文件: UserMapper.xml

    mybatis中,访问数据库的SQL语句是编写在mapper配置文件中的,程序员按照这个文件约定的格式进行配置即可在包 cn.wolfcode.day09.mapper 中创建配置文件: UserMapper.xml

    拷贝下面的约束信息到配置文件中

    xml
    复制代码
    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    在配置文件中添加 SQL 语句

    xml
    复制代码
    <!-- 一个项目可以操作多张表 每张表都需要一个mapper配置文件来编写SQL语句 每条SQL语句都需要有一个唯一的标识 这个唯一的标识由 namespace + sqlid 组成 使用下面的namespace+sqlid就得到了保存用户信息的唯一标识: cn.wolfcode.mybatis.mapper.UserMapper.insert 接下来,我们就可以使用上面的标识找到这条SQL语句了 --> <mapper namespace="cn.wolfcode.mybatis.mapper.UserMapper"> <insert id="insert"> insert into user(name,age,salary,hiredate) values(#{name}, #{age}, #{salary}, #{hiredate}) </insert> </mapper>

注意: 一定记得在 mybatis-config.xml 配置文件中关联映射文件

xml
复制代码
<mappers> <!-- 这里是mapper文件的路径,所以使用/分割 --> <mapper resource="xxx/mybatis/mapper/UserMapper.xml"/> </mappers>

2.4_MyBatis 执行流程(理解)

  1. 加载主配置文件 (mybatis-config.xml & XxxMapper.xml) 到内存中,将数据封装成对象 Configuration/Environment/TransactionManager/DataSource/Statement Collection等

  2. 通过操作拿到访问数据库的基本信息,根据这些数据创建 SqlSessionFactory 对象

  3. 从 SqlSessionFactory 对象中获取到 SqlSession 对象,然后执行SQL

  4. INSERT INTO user(name,age,salary) VALUES(#{name},#{age},#{salary})

    被翻译成

    INSERT INTO user(name,age,salary) VALUES(?, ?, ?)

  5. 使用 PreparedStatement 来执行指定的SQL

    从传递进来的 User 对象中依次获取到 name/age/salary 这些属性的值

    这里需要使用到内省机制来访问对象中的属性

注:

在加载完当前映射文件之后,会将SQL中的 #{} OGNL表达式翻译成对应的占位符?

3_获取自动生成的主键

在开发中,如果需要获取到数据库中自动生成的主键,那么使用 MyBatis 应该如何实现呢?

xml
复制代码
<insert id="insert" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> insert into user(name,age,salary,hiredate) values(#{name}, #{age}, #{salary}, #{hiredate}) </insert>

useGeneratedKeys: 是否要获取自动生成的主键

keyColumn: 表中的主键列

keyProperty: 主键列对应的属性 表示从获取哪个列的值封装到哪个属性中

4_日志管理 (掌握)

在持久层的开发过程中,我们程序员需要随时观察SQL的执行情况,如果sql有问题,我们能够及时发现 所以,如果能够在控制台中将我们执行的 SQL 全部打印出来,那么就可以方便的观察SQL的相关问题

配置日志文件监控 MyBatis 的运行.

  1. 将日志相关的 jar 包添加到项目中

image-20200427083931199.png

  1. 在 resources(resources root)中创建配置文件, log4j.properties ,添加下面的内容(直接拷贝)

    properties
    复制代码
    # Global logging configuration log4j.rootLogger=ERROR, stdout # 配置要打印日志的包 log4j.logger.xxx=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  2. 将配置中的 包路径修改为项目中对应的路径,我们这里可以使用: cn.wolfcode.mybatis

到此,我们每执行一条 SQL, 都会在控制台中打印出来,这非常有助于我们对 SQL 的分析,特别是 SQL 不正确的时候

7_类型别名

在查询操作中, 我们需要使用 resultType 属性指定数据封装的类型, 这里的值是类型的全限定名, 每次都写的话比较麻烦,为了简化这里的配置,我们可以在主配置文件(mybatis-config.xml)中对指定的类型做别名的配置

xml
复制代码
<!-- 为指定包中的类来生成别名,默认是类的简单名称 --> <typeAliases> <package name="包名"/> </typeAliases>

如此,我们在查询的SQL中, 使用类的全限定名和使用别名是等价的

修改前:

xml
复制代码
<select id="selectAll" resultType="XXX.domain.User"> select * from user </select>
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP