一、初识MyBatis
MyBatis官网:MyBatis官网
1.什么是MyBatis
MyBatis是一个支持普通sql查询、存储过程以及高级映射的持久层框架,MyBatis框架也被称为ORM(Object/Relational Mapping,对象关系映射)框架。
ORM的主要作用是在编程中,使用面向对象的方式来操作持久化对象,把面向对象的概念与数据库中表的对应起来。
举个栗子:我定义一个类,此时就对应着数据库的一张表,这个对象的实例,就对应着表中的一条记录。
Java概念 | 数据库概念 |
---|---|
类 | 表 |
属性 | 字段/列 |
对象 | 记录/行 |
2.特点
(1)轻量级,性能出色,面向接口编程
(2)sql与Java业务代码分离
(3)可以使用xml或注解用于配置和映射
3.MyBatis面向接口编程的两个一致:
(1)映射文件的namespace要和mapper接口的全类名保持一致
(2)映射文件中sQL语句的id要和mapper接口中的方法名一致
4.Mybatis框架的执行流程
(1)读取mybatis配置文件;
(2)加载映射文件xxxMapper.xml;
(3)构建会话工厂SqlSessionFactory;
(4)构建会话对象SqlSession;
(5)Executor执行器,执行相关操作;
(6)MappedStatement对象;
(7)输入映射;
(8)输出映射;
@Test
public void insertUser() throws Exception {
// 1.读取配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2.根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3.通过sqlSessionFactory创建SqlSession
//SqlSession默认不自动提交事务,若需要自动提交,需要设置sqlSessionFactory.openSession(true)即可自动提交
SqlSession session = sqlSessionFactory.openSession(true);
// 4.使用SqlSession对象执行映射文件中定义的sql,并返回映射结果
// 4.1获取mapper接口对象
UserMapper userMapper = session.getMapper(UserMapper.class);
// 4.2测试功能
int result = userMapper.insertUser();
// 4.3提交事务
//session.commit();
// 4.4输出结果
System.out.println("result="+result);
//5.关闭SqlSession
session.close();
}
5.log4j日志的级别
FATAL(致命)> ERROR(错误)> WARN(警告)> INFO(信息)> DEBUG(调试)
从左到右打印的信息越来越详细。
6.四种mapper映射文件的引入方式
<!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
<!--1.使用类路径引入-->
<mappers>
<mapper resource="com/jd/wds/mappers/ParameterMapper.xml"/>
</mappers>
<!--2.使用本地文件路径引入-->
<mappers>
<mapper url="file:\\\E:\Spring\Mbatis\mybatis-demo02\src\main\resources\com\jd\wds\mappers\ParameterMapper.xml"/>
</mappers>
<!--3.使用接口类引入-->
<mappers>
<mapper class="com.jd.wds.mappers.ParameterMapper"/>
</mappers>
<!--4.使用包名引入-->
<mappers>
<package name="com.jd.wds.mappers"/>
</mappers>
二、Mybatis开发说明
1.需要引入的依赖
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- MySQL数据库依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!--Junit单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--log4j日志管理-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.查询功能的标签必须设置resultType或resultMap
resultType:设置默认的映射关系(字段名和属性名一致)
resultMap:设置自定义的映射关系(字段名和属性名不一致、多对一、一对多映射)
3.对user表的增删改查操作(UserMapper.xml)
<!--1.插入一条记录-->
<insert id="insertUser">
insert into user values(null,"小王","男",17,"[email protected]")
</insert>
<!--2.删除一条记录-->
<delete id="deleteUser">
delete from user where id = #{id}
</delete>
<!--3.修改一条记录-->
<update id="updateUserById">
update user set name = "小张" where id = #{id}
</update>
<!--4.查询一条记录-->
<select id="findUserById" resultType="com.jd.wds.pojo.User" >
select * from user where id = #{id}
</select>
<!--5.查询所有记录-->
<select id="findAllUser" resultType="com.jd.wds.pojo.User">
select * from user
</select>
4.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.引入外部资源文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 2.设置驼峰匹配 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 3.设置包扫描(别名) -->
<typeAliases>
<package name="cn.itcast.pojo"/>
</typeAliases>
<!-- 4.配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置连接信息 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 5.配置映射文件:用来配置sql语句和结果集类型等 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
三、Mybatis获取参数值两种方式
Mybatis获取参数值有两种方式:#{} 和 ${}
#{}本质:占位符?赋值
${}本质:字符串拼接
(1)mapper接口的方法参数为单个的字面量类型,可以通过#{} 和 ${}以任意的名称获取参数值( ${} 需要加单引号)
<select id="findUserByName" resultType="com.jd.wds.pojo.User">
select * from user where name = '${name}'
<!--select * from user where name = #{name}-->
</select>
(2)mapper接口方法的参数为多个时,以两种方式存储:
① 以0,1…为键,以参数为值;
② 以param1,param2为键,以参数为值;
此时只需要使用{arg0}或{param1}的形式访问值即可( ${}需要加单引号)
<select id="checkLogin" resultType="com.jd.wds.pojo.User">
select * from user where username=#{0} and password=#{1}
<!--select * from user where username='${param1}' and password='${param2}'-->
</select>
(3)mapper接口方法的参数为多个时,可以将这些参数手动放在一个map集合中存储,只需要通过#{} 和 ${}以键的形式访问值即可( ${}需要加单引号)
<select id="checkLoginByMap" resultType="com.jd.wds.pojo.User">
<!--select * from user where username = #{username} and password = #{password}-->
select * from user where username = '${username}' and password = '${password}'
</select>
@Test
public void checkLoginByMap(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
ParameterMapper parameterMapper = sqlSession.getMapper(ParameterMapper.class);
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("username","小张");
hashMap.put("password","2356");
User user = parameterMapper.checkLoginByMap(hashMap);
System.out.println(user);
}
(4)mapper接口方法的参数是实体类型的参数,只需要通过#{} 或 ${}的方式访问属性值即可( ${}需要加单引号)
<insert id="insertUser" >
<!--insert into user values(null,#{username},#{password},#{age},#{email})-->
insert into user values(null,'${username}','${password}','${age}','${email}')
</insert>
(5)使用@Param注解命名参数,此时mybatis会将这些参数放在一个map集合中,以两种方式进行存储:
① 以@param注解的值为键,以参数为值;
② 以param1,param2…为键,以参数为值;
此时只需要使用{arg0}或{param1}的形式访问值即可( ${}需要加单引号)
User checkLoginByParam(@Param("username")String username,@Param("password") String password);
<select id="checkLoginByParam" resultType="com.jd.wds.pojo.User">
<!--select * from user where username = #{username} and password = #{password}-->
select * from user where username = #{param1} and password = #{param2}
</select>