java学习之 MyBatis-day01
初识框架
框架是一种经过校验、具有一定功能的半成品软件.
-
经过校验:指框架本身经过测试,且框架自身所具有的功能已经实现
-
具有一定功能:指框架可以完成特定的功能,不同的框架功能不同
-
半成品软件:指框架自身是一个软件,但是该软件无法直接运行,需要配合其他的程序才可以完成指定的工作.
程序架构
一.分层

二.架构分工

三.架构职责

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

准备环境
添加项目需要的 jar 包
-
lombok-1.18.20.jar
Lombok,自动生成 getter/setter/toString 等方法
使用的前提是已经在 idea 中安装了 lombok 插件
-
mysql-connector-java-5.1.26-bin.jar
MySQL 数据库的 JDBC 驱动包,访问 MySQL 必须导入备 jar 包
-
mybatis-3.4.5.jar
MyBatis 框架的核心 jar 包
-
创建操作的表
-
根据表结构创建实体类
-
mybatis 主配置文件: mybatis-config.xml
-
在项目的 resources(resources root)下创建 mybatis-config.xml 配置文件
-
拷贝 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"> -
添加环境配置(事务管理器 / 连接池 / 映射文件)
▼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> -
db.properties配置文件
在主配置文件中配置的内容较多, 其中包括我们修改频率较高的数据库连接信息(driver/url/username/password)等,我们可以在修改这些信息的过程中误改或者误删到其他的配置,为了解决这个问题,我们仍然是将这些信息配置到db.propertie 配置文件中,然后再合并到主配置文件即可,如下:
▼properties复制代码driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis username=root password=adminmybatis-config.xml
▼xml复制代码<configuration> <!-- 关联db.properties:为了把连接数据库的信息单独放到一个配置文件 --> <properties resource="db.properties" /> </configuration>- 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 执行流程(理解)
-
加载主配置文件 (mybatis-config.xml & XxxMapper.xml) 到内存中,将数据封装成对象 Configuration/Environment/TransactionManager/DataSource/Statement Collection等
-
通过操作拿到访问数据库的基本信息,根据这些数据创建 SqlSessionFactory 对象
-
从 SqlSessionFactory 对象中获取到 SqlSession 对象,然后执行SQL
-
INSERT INTO user(name,age,salary) VALUES(#{name},#{age},#{salary})
被翻译成
INSERT INTO user(name,age,salary) VALUES(?, ?, ?)
-
使用 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 的运行.
- 将日志相关的 jar 包添加到项目中

-
在 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 -
将配置中的 包路径修改为项目中对应的路径,我们这里可以使用: 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>

