欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis工作原理及入门demo

程序员文章站 2022-07-12 22:19:13
...

MyBatis的工作原理

  1. 读取MyBatis配置文件:mybatis-config.xml 为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件:映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory
  4. 创建会话对象:由会话工厂创建ssos对象,该对象中包含了执行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相关的jar包:
Mybatis工作原理及入门demo
创建持久化类:类中声明的属性与数据库中数据表的字段一致。

package gzc.entity;
public class MyUser {
	private Integer uid;
	private String uname;
	private String usex;
	public Integer getUid() {
		return uid;
	}
	public void setUid(Integer uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUsex() {
		return usex;
	}
	public void setUsex(String usex) {
		this.usex = usex;
	}
	@Override
	public String toString() {
		return "MyUser [uid=" + uid + ", uname=" + uname + ", usex=" + usex + "]";
	}
}

创建映射文件 :这里创建MyUserMapper.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">
 <!-- namespace属性绑定dao接口 -->
<mapper namespace="gzc.dao.UserDao">
	 <!-- 根据uid 查询一个用户信息 -->
	 <select id="selectUserById" resultType="gzc.entity.MyUser" parameterType="Integer">
	 	select * from myuser where uid = #{uid}
	 </select>
	 <!-- 查询全部用户信息 -->
	 <select id="selectAllUser" resultType="gzc.entity.MyUser">
	 	select * from myuser
	 </select>
	 <!-- 添加一个用户  #{uname} 为gzc.entity.MyUser的属性值-->
	 <insert id="addUser" parameterType="gzc.entity.MyUser">
	 insert into myuser values(#{uid},#{uname},#{usex})
	 </insert>
	 <!-- 修改一个用户 -->
	 <update id="updateUser" parameterType="gzc.entity.MyUser">
	 	update myuser set uname=#{uname},usex=#{usex} where uid=#{uid}
	 </update>
	 <!-- 删除一个用户 -->
	 <delete id="deleteUser" parameterType="gzc.entity.MyUser">
	 delete from myuser where uid=#{uid}
	 </delete>
</mapper>

创建UserDao接口

package gzc.dao;
import java.util.List;
import gzc.entity.MyUser;
public interface UserDao {
	// 接口定义的方法名与Mapper映射id一致
	public MyUser selectUserById(Integer uid);
	public List<MyUser> selectAllUser();
	public int addUser(MyUser user);
	public int updateUser(MyUser user);
	public int deleteUser(Integer uid);
}

创建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>
<!--利用mybatis自带环境配置数据源,以后和Spring整合后,这部分数据源可以交由Spring 配置处理-->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/springtestdb?serverTimezone=UTC" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- SQL映射文件的位置-->
		<mapper resource="gzc/mapper/MyUserMapper.xml" />
	</mappers>
</configuration>

Mybatis 默认使用log4j输出日志信息,为了方便在控制台查看执行的Sql语句,可以在项目根目录下创建其日志文件log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
#将gzc包下所有类型的日志记录级别设置为DEBUG
log4j.logger.gzc=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

创建测试类 :

package gzc.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 gzc.dao.UserDao;
import gzc.entity.MyUser;
public class MybatisTest {
	public static void main(String[] args) {
		try {
			// 读取配置文件mybatis-config.xml
			InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
			// 根据配置文件构建SqlSessionFactory
			SqlSessionFactory ssl = new SqlSessionFactoryBuilder().build(config);
			// 通过SqlSessionFactory创建SQLSession对象
			SqlSession ss = ssl.openSession();

			/*
			 * 方法一 : SqlSession执行映射文件中定义的sql,并返回映射结果
			 * gzc.mapper.MyUserMapper.selectUserById为MyUserMapper.xml中的命名空间+SQL语句的id 例如:
			 * MyUser mu = ss.selectOne("gzc.mapper.MyUserMapper.selectUserById", 6);
			 */

			/*
			 * 方法二 : 通过SqlSession对象getMapper方法获得Mapper映射与Dao接口映射
			 * 该方法需要绑定dao的接口到Mapper的namespace中
			 */
			 
			// 将dao接口方法与映射文件关联,返回接口对象
			UserDao userDao = ss.getMapper(UserDao.class);
			// 查询一个用户
			MyUser user = userDao.selectUserById(1);
			System.out.println(user);
			// 添加一个用户
			MyUser newUser = new MyUser(8, "小花", "女");
			userDao.addUser(newUser);
			// 修改一个用户
			MyUser updatemu = new MyUser(7, "小明", "男");
			userDao.updateUser(updatemu);
			// 删除一个用户
			userDao.deleteUser(3);
			// 查找所有用户
			List<MyUser> myUsers = userDao.selectAllUser();
			for (MyUser myUser : myUsers) {
				System.out.println(myUser);
			}
			ss.commit();
			ss.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Mybatis工作原理及入门demo