【MyBatis】
第一章 MyBatis 简介
1.1 MyBatis
-
由来:
- MyBaits本是apache的一个开源项目iBatis,改名为MyBatis,实质上Mybatis对iBatis进行了一些改进。
-
简述:
-
MyBatis是一个优秀的持久层框架,对jdbc的操作数据库的过程进行封装,使得开发者只需要关注sql本身,而不需要花费精力去处理例如加载驱动,创建connection、创建statement、手动设置参数,结果集检索等jdbc繁琐的过程代码。
注:对jdbc的封装框架:Hibernate、dbutils、jdbcTemplate(spring自带)
-
-
实现对JDBC的封装原理:
- MyBatis通过xml或者注解的方式将要执行的的各种statement(statement、 preparedStatement、CallableStatement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果影射成Java对象并返回。
1.2 JDBC的程序代码
1.3 MyBatis的框架核心
- mybatis配置文件:
- 包括
mybatis全局配置文件和mybatis映射文件
,其中: - 全局配置文件:配置了数据源、事务等信息;
- 映射文件:配置了sql执行相关信息;
- 包括
- mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出
SqlSessionFactory
,即会话工厂。 - 通过
SqlSessionFactory
,可以创建SqlSession(会话)
,MyBatis通过SqlSession来操作数据库 - SqlSession本身不能直接操作数据库,通过底层的Executor执行接口来操作数据库,Exceutor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)
- Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中,该对象包括:sql语句、输入参数映射信息、输出结果集映射信息,其中输入参数和输出结果的映射类型包括:HashMap集合对象、POJO对象类型。
第二章 MyBatis入门
2.1 环境准备
- 创建数据库,建表,导入数据
- 下载MyBatis
- 创建项目
- 导架包(新建lib文件夹将需要的依赖包、核心包、驱动包、junit4测试包导入)
- src文件夹中添加日志文件(新建log4j.properties)
Mybatis使用的日志包是log4j的,所以需要添加log4j.properties,内容可以在mybatis-x-xx.pdf中拷贝
Log4J配置详解
- 配置根Logger,log4j.rootLogger = [ level ] , appenderName
- 【level】是日志的级别,分别有debug -> info -> warn -> error 四种日志级别;
- 【appenderName】,配置日志的输出目录,同一个日志可以配置多个输出目的地;
- 配置log输出目的地:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
- log信息的格式,无需详细了解
log4j内容:
###Global logging configuration
log4j.rootLogger=ERROR, stdout###Uncomment for MyBatis logging
log4j.logger.org.apache.ibatis=ERROR###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.2 开发步骤
-
创建PO类(对应表的model),根据需求创建;
package com.mdy.model; import java.util.Date; public class User { private int id; private String username; //用户名 private String sex; //性别 private Date birthday; //生日 private String address; //地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; } }
-
创建全局配置文件SqlMapConfig.xml(在src下创建)–配置数据源
<?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> <!-- 配置mybatis的环境信息 --> <environments default="development"> <environment id="development"> <!-- 配置JDBC事务控制,由mybatis进行管理 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源,采用dbcp连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="12345"/> </dataSource> </environment> </environments> </configuration>
-
编写映射文件(在src中,创建sqlmap文件夹,在该目录下,创建User.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"> <!-- namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离 注意:使用mapper代理开发时,namespace有特殊且重要的作用 --> <mapper namespace="test"> <!-- [id]:statement的id,要求在命名空间内唯一 [parameterType]:入参的java类型 [resultType]:查询出的单条结果集对应的java类型 [#{}]: 表示一个占位符? [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义 --> <select id="findUserById" parameterType="int" resultType="com.gyf.domain.User"> SELECT * FROM USER WHERE id = #{id} </select> </mapper>
-
加载映射文件,在SqlMapConfig.xml中进行加载;(在全局配置文件中添加)
<!--告诉mybatis要加载映射文件--> <mappers> <mapper resource="com/mdy/sqlmap/User.xml"></mapper>