Mybatis知识点

下载网址
https://github.com/mybatis/mybatis-3/

MyBatis简介

1)MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3)MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4)Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架

为什么要使用MyBatis现有持久化技术的对比
1)JDBC
①SQL夹在Java代码块里,耦合度高导致硬编码内伤
②维护不易且实际开发需求中sql有变化,频繁修改的情况多见

2)Hibernate和JPA
①长难复杂SQL,对于Hibernate而言处理也不容易
②内部自动生产的SQL,不容易做特殊优化
③基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降

3)MyBatis
①对开发人员而言,核心sql还是需要自己优化
②sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据

MyBatis 技术

开发环境的准备

1、导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包
myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar

2、导入log4j 的配置文件
在这里插入图片描述

3、创建MyBatis的全局配置文件
参考MyBatis的官网手册
(如何连接数据库)

<?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>
    
    <!-- 引入SQL映射文件,Mapper映射文件
    这一步需在下一步创建完SQL映射文件之后 再过来修改
    -->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

多个映射mapper

-<mappers>

<!-- <mapper resource="EmpMapper.xml" />
<mapper resource="DeptMapper.xml" /> -->

<!-- 此种写法要求mapper接口和mapper映射文件必须在同一个包下 -->
<package name="com.atguigu.mapper"/>

</mappers>

4、创建Mybatis的sql(mapper)映射文件
参考MyBatis的官方手册
(如何操作数据库)

<?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.mybatis.mapper.UserMapper">
    <!--
		<select>:定义查询语句
		id:设置SQL语句的唯一标示
		resultType:结果类型,即实体类的全限定名
	 -->
    <select id="getUserByUid" resultType="com.mybatis.bean.User">
       select * from user where uid = ${value}
      </select>
</mapper>

5、创建mapper接口

public interface UserMapper {
    public User getUserByUid(String uid);
}

6、将四五步创建的sql(mapper)映射文件和mapper接口实现绑定
①Mapper接口与Mapper映射文件的绑定
在Mppper映射文件中的<mapper>标签中的namespace中必须指定Mapper接口的全类名

②Mapper映射文件中的增删改查标签的id必须指定成Mapper接口中的方法名.

注:
1、mapper接口的全类名要和mapper映射文件的namespace保持一致
2、接口中的方法名要和sql语句中的id保持一致

在这里插入图片描述
7、测试
获取mybatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类

package com.mybatis.mapper;

import com.mybatis.bean.User;
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.IOException;
import java.io.InputStream;

public class TestMybatis {

    @Test
    public void test() throws IOException {
        //通过ibatis的Resource类的getResourceAsStream方法读取全局配置文件为IO流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

        //通过IO流新建一个SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //getMapper():会通过动态代理动态生成UserMapper的代理实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserByUid("1");
        System.out.println(user);

    }
}

在这里插入图片描述
总结:
整体mybatis结构:
执行:
通过全局配置先连接数据库———>执行mapper接口中的方法————>执行mapper配置文件的sql语句

在这里插入图片描述

environments

<!-- 
		<environments>:设置连接数据库的环境
		default:设置默认使用的数据库环境
	 -->
	<environments default="mysql">
		<!-- 
			<environment>:设置某个具体的数据库的环境
			id:数据库环境的唯一标示
		 -->
		<environment id="mysql">
			<!-- type="JDBC|MANAGED" -->
		<!-- type="JDBC|MANAGED",JDBC:使用JDBC原生的事务管理方式,即提交和回滚都需要手动处理 -->
			<transactionManager type="JDBC" />
			
			<!-- type="POOLED|UNPOOLED|JNDI" -->
			<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>
		
		<environment id="oracle">
			<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>
//SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
/*empMapper.addEmp(new Emp(null, "admin", 23, "女"));
		sqlSession.commit();//提交事务*/

SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务

properties

<!-- <properties>
		<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
	</properties> -->
	
	<!-- 
		<properties>:设置或引入资源文件
		resource:在类路径下访问资源文件
		url:在网络路径或磁盘路径下访问资源文件
	 -->
	<properties resource="jdbc.properties"></properties>

<environment id="mysql">
			<!-- type="JDBC|MANAGED" -->
			<transactionManager type="JDBC" />
			
			<!-- type="POOLED|UNPOOLED|JNDI" -->
			<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>

#{}和${}

mybatis中获取参数有两种方式:#{}和${}
${}:用于Statement:通过字符串的拼接需要手动假单引号:

Emp emp = new Emp(null, "admin", 23, "男");
mapper.insertEmp(emp);
<!-- insert into emp values(null, #{ename}, #{age}, #{sex}) -->//直接将至拼接成sql语句
insert into emp values(null, '${ename}', ${age}, '${sex}') 

#{}:适用于PreparedStatement,可以使用通配符使用
建议使用#{},在特殊情况下,需要使用${},例如模糊查询和批量删除。

<select resultType="Dept" id="getDeptByDid">select did,dname from dept where did = #{did} </select>

不同的参数类型,${}和#{}的不同取值的方式:

在这里插入图片描述

动态SQL

1)动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作

2)动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似

3)MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作
if
choose (when, otherwise)
trim (where, set)
foreach

4)OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
访问对象属性: person.name
调用方法: person.getName()
调用静态属性/方法: @java.lang.Math@PI
@java.util.UUID@randomUUID()
调用构造方法: new com.atguigu.bean.Person(‘admin’).name
运算符: +,-*,/,%
逻辑运算符: in,not in,>,>=,<,<=,==,!=
注意:xml中特殊符号如”,>,<等这些都需要使用转义字符

if where
1)If用于完成简单的判断.
2)Where用于解决SQL语句中where关键字以及条件中第一个and或者or的问题

<select id="getEmpsByConditionIf" resultType="com.atguigu.mybatis.beans.Employee">
		select id , last_name ,email  , gender  
		from tbl_employee 
		<where>
			<if test="id!=null">
				and id = #{id}
			</if>
			<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
				and last_name = #{lastName}
			</if>
			<if test="email!=null and email.trim()!=''">
				and email = #{email}
			</if>
			<if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">
				and gender = #{gender}
			</if>
		</where>
</select>

trim
1)Trim 可以在条件判断完的SQL语句前后 添加或者去掉指定的字符
prefix: 添加前缀
prefixOverrides: 去掉前缀
suffix: 添加后缀
suffixOverrides: 去掉后缀

<select id="getEmpsByConditionTrim" resultType="com.atguigu.mybatis.beans.Employee">
		select id , last_name ,email  , gender  
		from tbl_employee 
		<trim prefix="where"  suffixOverrides="and">
			<if test="id!=null">
				 id = #{id} and
			</if>
			<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
				 last_name = #{lastName} and
			</if>
			<if test="email!=null and email.trim()!=''">
				 email = #{email} and
			</if>
			<if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">
				gender = #{gender}
			</if>
		</trim>
</select>

set
1)set 主要是用于解决修改操作中SQL语句中可能多出逗号的问题

<update id="updateEmpByConditionSet">
		update  tbl_employee  
		<set>
			<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
				 last_name = #{lastName},
			</if>
			<if test="email!=null and email.trim()!=''">
				 email = #{email} ,
			</if>
			<if test="&quot;m&quot;.equals(gender) or &quot;f&quot;.equals(gender)">
				gender = #{gender} 
			</if>
		</set>
		 where id =#{id}
	</update>

choose(when、otherwise)
choose 主要是用于分支判断,类似于java中的switch case,只会满足所有分支中的一个

<select id="getEmpsByConditionChoose" resultType="com.atguigu.mybatis.beans.Employee">
		select id ,last_name, email,gender from tbl_employee
		<where>
			<choose>
				<when test="id!=null">
					id = #{id}
				</when>
				<when test="lastName!=null">
					last_name = #{lastName}
				</when>
				<when test="email!=null">
					email = #{email}
				</when>
				<otherwise>
					 gender = 'm'
				</otherwise>
			</choose>
		</where>
</select>

foreach
1)foreach 主要用于循环迭代
collection: 要迭代的集合
item: 当前从集合中迭代出的元素
open: 开始字符
close:结束字符
separator: 元素与元素之间的分隔符
index:
迭代的是List集合: index表示的当前元素的下标
迭代的Map集合: index表示的当前元素的key

<select id="getEmpsByConditionForeach" resultType="com.atguigu.mybatis.beans.Employee">
		 select id , last_name, email ,gender from tbl_employee where  id in 
		 <foreach collection="ids" item="curr_id" open="(" close=")" separator="," >
		 		#{curr_id}
		 </foreach>
</select>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuochaoHN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值