一.MyBatis简介
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java
Objects,普通的Java对象)映射成数据库中的记录 - MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
MyBatis下载地址:https://github.com/mybatis/mybatis-3
二.搭建MyBatis
1.开发环境
IDE:idea 2019 构建工具:maven 3.6.0 MySQL版本:MySQL 5.7 MyBatis版本:MyBatis 3.5.7
2.创建maven工程
引入依赖
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
3.创建MyBatis的核心配置文件
MyBatis官方推荐MyBatis的核心配置文件:mybatis-config.xml 核心配置文件的存放位置是src/main/resources目录下
<?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="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
4.创建mapper接口
public interface UserMapper {
int insertUser();
}
5.创建MyBatis的映射配置文件
ORM对象关系映射 对象:Java的实体类对象 关系:关系型数据库(MySQL) 映射:二者之间的关系
1.映射文件的命名规则: 一般为实体类的类名+Mapper.xml 例如:UserMapper类对应的配置文件为UserMapper.xml 一个映射文件对应一个实体类,对应一张表的操作 MyBatis映射文件用于编写SQL,访问以及操作表中的数据 MyBatis映射文件存放的位置是/src/main/resources/mappers目录下
2.MyBatis中面向接口操作数据,要保证两个一致 mapper接口的全类名和映射文件的命名空间(namespace)保持一致 mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
<?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">
<mapper namespace="com.yxm.test.UserMapper">
<insert id="insertUser">
insert into user values (null,'springyang','123456');
</insert>
</mapper>
6.Junit测试功能
package com.yxm.test;
import com.yxm.test.dao.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
public class UserTest {
@Test
public void test1() throws Exception {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.insertUser();
System.out.println("结果:"+result);
}
}
需要注意:测试类要在src/test下新建测试类才能使用junit测试,因为pom文件中已经指定了scope 为test,如果不需要可删除。
三.MyBatis加入log4j日志功能
1.在maven加入log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.在mybatis-config.xml的settings标签中配置log4j日志
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
3.在src/resources文件夹下新建log4j.properties文件
### 配置根/在什么地方会打印日志 ###
log4j.rootLogger = debug,console,fileAppender
### 设置输出sql的级别,其中logger后面的内容全部为jar包中所包含的包名 ###
log4j.logger.org.apache=dubug
log4j.logger.java.sql.Connection=dubug
log4j.logger.java.sql.Statement=dubug
log4j.logger.java.sql.PreparedStatement=dubug
log4j.logger.java.sql.ResultSet=dubug
### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 配置输出到文件 ###
log4j.appender.fileAppender = org.apache.log4j.FileAppender
log4j.appender.fileAppender.File = logs/log.log
log4j.appender.fileAppender.Append = true
log4j.appender.fileAppender.Threshold = DEBUG
log4j.appender.fileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
以上配置会同时打印到控制台并生成日志文件
四.核心配置文件详解
核心配置文件中的标签必须按照固定的顺序: properties?,settings? typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,refl ectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
properties
引入外部properties文件 新建外部jdbc.properties文件,连接数据库
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/ssm
jdbc.username = root
jdbc.password = 123456
<properties resource="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
setting
MyBatis标签属性配置,例如日志配置。
typeAliases
设置类型别名 typeAlias:设置某个类型的别名 type:设置需要设置别名的类型 alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名
<typeAliases>
<typeAlias type="com.yxm.test.pojo.User"></typeAlias>
</typeAliases>
以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写
<typeAliases>
<package name="com.yxm.test.pojo"></package>
</typeAliases>
environments
配置多个连接数据库的环境 属性default:设置默认使用的环境的id transactionManager:设置事务管理方式type=“JDBC|MANAGED” JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事 务的提交或回滚需要手动处理 MANAGED:被管理,例如Spring dataSource:配置数据源 属性:type: 设置数据源的类型 type=“POOLED|UNPOOLED|JNDI” POOLED:表示使用数据库连接池缓存数据库连接 UNPOOLED:表示不使用数据库连接池 JNDI:表示使用上下文中的数据源
mappers
mapper 引入单个映射文件
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
package以包为单位引入配置文件
<mappers>
<package name="com.yxm.test.mappers"/>
</mappers>
以包为单位引入映射文件的两个要求
1.mapper接口所在的包和映射文件所在的包要一致。 2.mapper接口要和映射文件的名字一致。
五.MyBatis的增删改查
新增
<insert id="insertUser">
insert into user values (null, 'springyang', '123456');
</insert>
删除
<delete id="deleteUser">
delete from user where id=12;
</delete>
修改
<update id="updateUser">
update user set username='yxm' where id=1;
</update >
查询单个实体类对象
<select id="getUserById" resultType="com.yxm.test.pojo.User">
select * from user where id = 2
</select>
返回值User
查询多个实体类对象
<select id="getUserList" resultType="com.yxm.test.pojo.User">
select * from user
</select>
返回值List<User>
查询select标签必须设置resultType或者resultMap,用于设置实体类和数据库的映射关系 resultType:自动映射,用于属性名和表中字段名一致的情况 resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
六.${}和#{}区别及特殊的SQL语句
${}本质就是字符串拼接,#{}的本质就是占位符赋值, #{}在MyBatis作为参数时,会将参数转化为?,相当于JDBC中的preparestatment,使用#{}可以防止SQL注入。
List<User> queryLike();
<select id="queryLike" resultType="com.yxm.test.pojo.User">
SELECT * FROM USER WHERE username LIKE '%m%'
</select>
int deleteUser();
<delete id="deleteUser">
delete from user where id in ('11','12')
</delete>
List<User> getUsers(@Param("tableName") String tableName);
<select id="getUsers" resultType="com.yxm.test.pojo.User">
select * from ${tableName}
</select>
七.自定义映射resultMap
resultMap处理字段和属性的映射关系,常用属性如下:
属性 | 说明 |
---|
| 父标签 | id | 表示自定义映射的唯一标识 | type | 查询数据映射的实体类类型,即查询结果返回实体类 | | 子标签 | id | 设置主键的映射关系 | result | 设置普通字段的映射关系 | association | 设置多对一的映射关系 | collection | 设置一对多的映射关系 | property | 设置实体类中的属性名 | column | 设置表中的字段名 |
<resultMap id="userMap" type="User">
<id property="id" column="id"></id>
<result property="username" column="user_name"/>
<result property="password" column="password"/>
</resultMap>
<select id="queryUserMap" resultMap="userMap">
select * from user
</select>
八.动态SQL
- if
if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会被执行,否则不会执行。
<select id="getEmpList" resultType="Emp">
select * from t_emp
where 1=1
<if test="ename != '' and ename != null">
and ename =
</if>
<if test="age != '' and age != null">
and age =
<if test="sex != '' and sex != null">
and sex =
</select>
<select id="getEmpList2" resultType="Emp">
select * from t_emp
<where>
<if test="ename != '' and ename != null">
ename =
</if>
<if test="age != '' and age != null">
and age =
</if>
<if test="sex != '' and sex != null">
and sex =
</if>
</where>
</select>
- trim
- choose、when、otherwise
- foreach
<insert id="insertEmp">
insert into t_emp values
<foreach collection="emps" item="emp" separator=",">
(null,
</foreach>
</insert>
属性: collection:设置要循环的数组或集合 item:表示集合或数组中的每一个数据 separator:设置循环体之间的分隔符 open:设置foreach标签中的内容的开始符 close:设置foreach标签中的内容的结束符
- SQL片段
sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入
九.MyBatis逆向工程
添加依赖和插件
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
创建逆向工程的配置文件
文件名必须是:generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root"
password="123456">
</jdbcConnection>
<javaModelGenerator targetPackage="com.atguigu.mybatis.pojo" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.mybatis.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="t_emp" domainObjectName="Emp"/>
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
执行MBG插件的generate目标
效果
|