Mybatis

简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
mybatis 官方

安装

MyBatis 的版本可以通过“https://github.com/mybatis/mybatis-3/releases”网址下载。在下载时只需选择 mybatis-3.4.5.zip 即可。
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。

如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

mybatis原理

  1. 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
    在这里插入图片描述
  4. 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
  5. Executor 执行器 :MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
  6. MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
  7. 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

配置

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

properties
把数据库的连接信息拿出来,单独写在一个配置文件中。用于将内部的配置外在化,在中引入外部配置即可。
jdbc.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/t_user
username=root
password=tiger

mybatis-config.xml

 <properties resource="sql.properties"></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

settings
用于设置mybatis运行时的参数。常用的项有:

  • cacheEnabled:是否使用缓存,boolean值,默认为false
  • lazyLoadingEnabled :是否使用懒加载,boolean值,默认为false
  • defaultStatementTimeout:设置超时时间,默认单位秒
  • mapUnderscoreToCamelCase:是否启用camel命名规则的映射,boolean值,默认为false
  • logImpl:使用的日志框架

一般只需配置logImpl:

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 控制台日志-->
</settings>

environments
环境配置,mybatis是持久层框架,它的环境自然是数据库,即数据库的配置。

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql_driver}"/>
                <property name="url" value="${mysql_url}"/>
                <property name="username" value="${mysql_username}"/>
                <property name="password" value="${mysql_password}"/>
            </dataSource>
        </environment>
</environments>

一般要配置多个环境,开发一个环境,正式使用一个环境。default指定要使用哪个environment。

mapper
用于引入映射文件。写法很多,常用的有3种:

  1. 通过映射文件的路径引入
<mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
        <mapper resource="mapper/TeacherMapper.xml"/>
</mappers>
  1. 通过mapper接口类引入
<mappers>
        <mapper class="mapper.StudentMapper"/>
</mappers>
  1. 通过包名引入
<mappers>
        <package name="mapper"/>
</mappers>

这种最常用,可以一次性引入mapper包下所有的映射文件。

XML 映射器

select

查询语句是 MyBatis 中最常用的元素之一——光能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。 MyBatis 的基本原则之一是:在每个插入、更新或删除操作之间,通常会执行多个查询操作。因此,MyBatis 在查询和结果映射做了相当多的改进。一个简单查询的 select 元素是非常简单的

<?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="mybatis.dao.UserDao">
	<select id="getUserById" parameterType="java.lang.Integer" resultType="mybatis.entity.User">
		select id, username, password from t_user where id = #{id}
	</select>
	<select id="getUsers"  resultType="mybatis.entity.User">
		select id,username,password from t_user 
	</select>
</mapper>

在这里插入图片描述
使用resultMap结果集映射
在这里插入图片描述

insert, update 和 delete

这三个映射器就比较简单,没有什么重点的。
因为是数据库修改语句,所返回的参数值是int类型(修改行数),所以只需要给方法传入值就可以对数据进行修改。
在这里插入图片描述

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

if

这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果(细心的读者可能会发现,“title” 的参数值需要包含查找掩码或通配符字符)。

<select id="findActiveBlogWithTitleLike"  resultType="Blog">
  SELECT * FROM BLOG  WHERE state = ‘ACTIVE’  | (1=1)
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

choose、when、otherwise

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

还是上面的例子,但是策略变为:传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。若两者都没有传入,就返回标记为 featured 的 BLOG(这可能是管理员认为,与其返回大量的无意义随机 Blog,还不如返回一些由管理员精选的 Blog)。

<select id="findActiveBlogLike"   resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

trim、where、set

where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

<select id="findActiveBlogLike"  resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

foreach

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *  FROM POST P  WHERE ID in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

mybatis搭建

  1. 添加依赖pom.xml
<dependencies>
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.0</version>
		</dependency>

		<!-- mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.23</version>
		</dependency>
</dependencies>
  1. 配置config, 创建jdbc.properties
<?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="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>   
  </environments>
<mappers>
	<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
  1. 添加实体类
public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String password;
	
	public User() {}
	
	public User(String username, String password) {
		this.username = username;
		this.password = password;
	}

	public User(int id, String username, String password) {
		this.id = id;
		this.username = username;
		this.password = password;
	}
	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 getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
	
}

  1. 添加dao,接口
public interface UserDao {
	@Select("select id,username,password from t_user where id = #{id}")
	public User getUserById(int id);
	
	@Select("select id,username,password from t_user")
	public List<User> getUsers();
	
	@Insert("delete from t_user where id = #{id}")
	public void delUser(int id);
	
	@Insert("insert into t_user(username,password) values(#{username},#{password})")
	public void addUser(User user);
	
	@Insert("update t_user set username = #{username} where id = #{id}")
	public void updateUser(int id,String username);
	
	@Select("select * from t_user")
	public List<User> queryUser();
}

  1. 添加mapper文件
<?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="mybaits.dao.UserDao">
	<select id="getUserById" parameterType="java.lang.Integer" resultType="mybaits.pojo.User">
		select id,username,password from t_user where id = #{id}
	</select>
	<select id="getUsers"  resultType="mybaits.pojo.User">
		select id,username,password from t_user 
	</select>
	<insert id="addUser" parameterType="mybaits.pojo.User">
		insert into t_user(username,password) values(#{username},#{password})
	</insert>
	<update id="updateUser" parameterType="mybaits.pojo.User">
		update t_user set username = #{username} where id = #{id}
	</update>
	<delete id="delUser"  parameterType="java.lang.Integer" >
		delete from t_user where id = #{id}
	</delete>
</mapper>

测试类

public class Test {
	public static void main(String[] args) {
		SqlSession session = null;
		try {		
			InputStream in = Resources.getResourceAsStream("config.xml");
			//6.创建sqlsessionfactory对象
			SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
			//7.打开session
			session = ssf.openSession();
			//8.操作sessionsatement对象
			UserDao mapper =  session.getMapper(UserDao.class);
			
			//9.session提交查询就不用
			User user =mapper.getUserById(2); 
			System.out.println(user.getUsername()+"\t"+user.getPassword());
			
			User user1 = new User("user", "123");
			mapper.addUser(user1);
			session.commit();
			
			mapper.delUser(2);
			session.commit();
			
			mapper.updateUser(2,"gznb");
			session.commit();	//提交
			
			PageHelper.startPage(1, 2);
			List<User> list = mapper.queryUser();
			PageInfo<User> us =new  PageInfo<User>(list);
			for(User u: us.getList()) {
				System.out.println(u);
			}
					
//			List<User> list = session.selectList("mybatis.dao.UserDao.getUsers");
//			for(User user: list) {
//				System.out.println(user.getUsername()+"\t"+user.getPassword());
//			}
			//10.关闭session
			session.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.rollback(); //回滚
		}
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值