目录
1、MyBatis的全局配置文件:myBatis-config.xml
1.1.2 MyBatis的全局配置文件:myBatis-config.xml
1.2.1 mapUnderscoreToCamelCase:开启驼峰命名的自动匹配
1.4 typeHandlers:数据库类型和java类型的映射
1.6 environments:MyBatis配置多种环境
1.7 databaseIdProvider:MyBatis支持多种不同的数据库厂商
1.7.1 不同类型的数据库厂商配置:jdbc.properties
1.7.2 MyBatis全局配置文件给不同数据库厂商起别名:mybatis-config.xml
1.7.3 MyBatis全局配置文件中不同数据库环境下的environment配置:mybatis-config.xml
1.7.4 mapper.xml文件中使用不同的数据库厂商标识ID
1.7.5 每个表所对应的xxxMapper.xml配置文件需要注册在MyBatis全局配置文件中才能被使用
2.2 向DB中插入一条数据时自动返回该条数据的自增主键ID
2.3.1 参数是单个时,MyBatis不会做特殊处理直接使用即可
2.3.3 参数是entity时,建议使用@Param命名参数
2.4 MyBatis中 #{ } 和 ${ } 之间的区别和联系
2.5.2 myBatis的返回值是一个entity时把它封装成一个Map
2.5.3 myBatis的返回值是多个entity时, 把它封装成一个Map(key=id, value=entity)时
2.6.1 无级联版本:DAO层接口+mapper.xml配置文件+测试
2.6.2 select-resultMap-关联查询-级联属性封装
0、Maven项目结构
1、MyBatis的全局配置文件:myBatis-config.xml
1.1 properties:引入外部配置文件
1.1.1 数据库配置文件:jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=root
1.1.2 MyBatis的全局配置文件:myBatis-config.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>
<!--1.MyBatis可以使用properties标签来引入外部的properties配置文件:
(1)url:引用网络路径下或者磁盘路径的资源
(2)resource:引入类路径下的资源
-->
<properties resource="jdbc.properties"/>
<!--配置MyBatis运行环境的全局配置文件-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置POOLED类型的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>
<!--把一个个的mapper配置文件注册到全局配置文件中-->
<mappers>
<mapper resource="mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
1.2 settings:设置MyBatis的属性
1.2.1 mapUnderscoreToCamelCase:开启驼峰命名的自动匹配
<!--2.MyBatis的设置,settings标签包含很多的设置项
(1)name:设置项的名称
(2)value:设置项的取值-->
<settings>
<!--开启在控制台打印SQL日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--开启自动的驼峰命名匹配-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
1.3 typeAlisses:项目中定义的类的别名
<!--3.MyBatis中entity别名的设置,这里使用的是包,也即包下的所有类都有别名了,默认的别名是类名的首字母小写-->
<typeAliases>
<package name="com.wind.entity"/>
</typeAliases>
1.4 typeHandlers:数据库类型和java类型的映射
1.5 plugins:MyBatis插件
1.6 environments:MyBatis配置多种环境
<!--4.配置MyBatis运行环境的全局配置文件-->
<!--
(1)environments:环境们,MyBatis可以配置多种不同的环境以提供给不同的角色使用,比如配置一个环境给开发使用【development】,再配置一个环境给测试使用【test】。
(2)environment:每一个具体的环境信息,id 是该环境信息的唯一标识,比如配置一个环境给开发使用【development】,再配置一个环境给测试使用【test】,
它被用在environments标签后面的default属性中。
同时,environment必须要有两个标签:
(2.1)transactionManager:配置数据库的事务管理器
JDBC:JdbcTransactionFactory
MANAGED:ManagedTransactionFactory
(2.2)dataSource:配置数据源,有三种选择
POOLED:PooledDataSourceFactory
UNPOOLED:UnpooledDataSourceFactory
JNDI:JndiDataSourceFactory
-->
<environments default="test">
<!--1.给测试使用的数据源环境-->
<environment id="test">
<transactionManager type="JDBC"/>
<!--配置POOLED类型的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>
<!--2.给开发使用的数据源环境-->
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置POOLED类型的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>
1.7 databaseIdProvider:MyBatis支持多种不同的数据库厂商
1.7.1 不同类型的数据库厂商配置:jdbc.properties
1.7.2 MyBatis全局配置文件给不同数据库厂商起别名:mybatis-config.xml
1.7.3 MyBatis全局配置文件中不同数据库环境下的environment配置:mybatis-config.xml
1.7.4 mapper.xml文件中使用不同的数据库厂商标识ID
1.7.5 每个表所对应的xxxMapper.xml配置文件需要注册在MyBatis全局配置文件中才能被使用
<!--单个mapper注册:把一个个的mapper配置文件注册到全局配置文件中-->
<mappers>
<mapper resource="mapper/EmployeeMapper.xml"/>
</mappers>
2、MyBatis的映射文件
2.1 MyBatis的增删改查
2.1.1 EmployeeTest 类
import com.wind.dao.EmployeeDao;
import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class EmployeeTest {
public static void main(String[] args) {
//1.加载MyBatis配置文件
InputStream inputStream = EmployeeTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.获取实现接口的代理对象
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
System.out.println(employeeDao);
//增
EmployeeEntity entity = new EmployeeEntity();
entity.setName("小刘");
entity.setGender("男");
entity.setEmail("999@qq.com");
Integer addResult = employeeDao.addEmployee(entity);
System.out.println(addResult);
//删
Boolean deleteResult = employeeDao.deleteEmployee(20);
System.out.println(deleteResult);
//改
EmployeeEntity entity2 = new EmployeeEntity();
entity2.setId(4);
entity2.setName("小刘2");
entity2.setGender("男");
entity2.setEmail("999222@qq.com");
Boolean updateResult = employeeDao.updateEmployee(entity2);
System.out.println(updateResult);
//查
EmployeeEntity entity3 = employeeDao.queryEmployeeById(4);
System.out.println(entity3);
//提交数据
sqlSession.commit();
//上面那个sqlSession关闭
sqlSession.close();
}
}
2.1.2 EmployeeDao 接口
package com.wind.dao;
import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.annotations.Param;
/**
* @Description: 这是与MyBatis中的mapper.xml文件相互绑定的接口。注意:该接口是用来操作DB的。
*/
public interface EmployeeDao {
//增
Integer addEmployee(@Param("entity") EmployeeEntity entity);
//删
Boolean deleteEmployee(@Param("id") int id);
//改
Boolean updateEmployee(@Param("entity") EmployeeEntity entity);
//查
EmployeeEntity queryEmployeeById(@Param("id") int id);
}
2.1.3 EmployeeMapper.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">
<!--每一个mapper.xml文件都有一个命名空间,该命名空间表示:该mapper.xml文件和哪个接口绑定起来。
注意:该接口是用来操作DB的。-->
<mapper namespace="com.wind.dao.EmployeeDao">
<insert id="addEmployee">
insert into TBL_Employee (name, gender, email)
values (#{entity.name}, #{entity.gender}, #{entity.email})
</insert>
<delete id="deleteEmployee">
delete from TBL_Employee
where id = #{id}
</delete>
<update id="updateEmployee">
update TBL_Employee
set name = #{entity.name}, gender = #{entity.gender}, email = #{entity.email}
where id = #{entity.id}
</update>
<select id="queryEmployeeById" parameterType="int" resultType="EmployeeEntity">
select *
from TBL_Employee
where id = #{id}
</select>
</mapper>
2.1.4 测试结果
2.2 向DB中插入一条数据时自动返回该条数据的自增主键ID
2.3 MyBatis的参数处理
2.3.1 参数是单个时,MyBatis不会做特殊处理直接使用即可
Boolean deleteEmployee(@Param("id") int id);
<delete id="deleteEmployee">
delete from TBL_Employee
where id = #{id}
</delete>
2.3.2 参数是多个时,建议使用@Param命名参数
EmployeeEntity queryEmployeeByIdName(@Param("id") int id, @Param("name") String name);
<select id="queryEmployeeByIdName" resultType="EmployeeEntity">
select *
from TBL_Employee
where id = #{id} and name = #{name}
</select>
2.3.3 参数是entity时,建议使用@Param命名参数
Integer addEmployee(@Param("entity") EmployeeEntity entity);
<insert id="addEmployee" keyProperty="entity.id" useGeneratedKeys="true">
insert into TBL_Employee (name, gender, email)
values (#{entity.name}, #{entity.gender}, #{entity.email})
</insert>
2.3.4 参数是map时,建议使用@Param命名参数
EmployeeEntity queryEmployeeByMap(Map<String, Object> map);
//下面是测试代码
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 4);
map.put("name", "小刘2");
EmployeeEntity employeeEntity = employeeDao.queryEmployeeByMap(map);
System.out.println(employeeEntity);
<select id="queryEmployeeByMap" resultType="EmployeeEntity">
select *
from TBL_Employee
where id = #{id} and name = #{name}
</select>
2.4 MyBatis中 #{ } 和 ${ } 之间的区别和联系
2.5 Select元素详解
2.5.1 myBatis的返回值是个List集合时
List<EmployeeEntity> queryEmployeeByName(@Param("name") String name);
//下面是测试代码
List<EmployeeEntity> list = employeeDao.queryEmployeeByName("%小%");
System.out.println(list);
<select id="queryEmployeeByName" resultType="com.wind.entity.EmployeeEntity">
select *
from TBL_Employee
where name like #{name}
</select>
2.5.2 myBatis的返回值是一个entity时把它封装成一个Map
Map<String, Object> queryEmployeeReturnMap(@Param("id") int id);
//下面是测试代码
Map<String, Object> objectMap = employeeDao.queryEmployeeReturnMap(1);
System.out.println(objectMap);
<select id="queryEmployeeReturnMap" resultType="java.util.Map">
select *
from TBL_Employee
where id = #{id}
</select>
2.5.3 myBatis的返回值是多个entity时, 把它封装成一个Map(key=id, value=entity)时
//是多条记录的内容封装成map
//key=EmployeeEntity的ID,value=EmployeeEntity
//key=EmployeeEntity的name,value=EmployeeEntity也OK的
@MapKey("id")
Map<Integer, EmployeeEntity> queryEmployeesReturnMap(@Param("name") String name);
//下面是测试代码
Map<Integer, EmployeeEntity> entityMap = employeeDao.queryEmployeesReturnMap("%小%");
System.out.println(entityMap);
<select id="queryEmployeesReturnMap" resultType="com.wind.entity.EmployeeEntity">
select *
from TBL_Employee
where name like #{name}
</select>
2.6 MyBatis结果集的自动映射
2.6.1 无级联版本:DAO层接口+mapper.xml配置文件+测试
EmployeeEntity queryEmployeeById(@Param("id") int 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.xml文件都有一个命名空间,该命名空间表示:该mapper.xml文件和哪个接口绑定起来。
注意:该接口是用来操作DB的。-->
<mapper namespace="com.wind.dao.EmployeeDao">
<resultMap id="myEmployeeEntity" type="com.wind.entity.EmployeeEntity">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
</resultMap>
<select id="queryEmployeeById" parameterType="int" resultMap="myEmployeeEntity">
select *
from TBL_Employee
where id = #{id}
</select>
</mapper>
import com.wind.dao.EmployeeDao;
import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EmployeeTest {
public static void main(String[] args) {
//1.加载MyBatis配置文件
InputStream inputStream = EmployeeTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//2.获取实现接口的代理对象
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
System.out.println(employeeDao);
EmployeeEntity employeeEntity = employeeDao.queryEmployeeById(1);
System.out.println(employeeEntity);
//提交数据
//sqlSession.commit();
//上面那个sqlSession关闭
sqlSession.close();
}
}
2.6.2 select-resultMap-关联查询-级联属性封装
(1)方式一:级联查询
(2)方式二:级联查询:一个Entity的一个属性是另一个entity的普通字段时,使用association
(3)方式三:分步查询:association,非懒加载
(4)方式四:分步查询:association,懒加载的方式,在全局配置文件中新增2个配置
(5)方式五:Entity的一个属性是一个list集合时,使用collection