Mybatis_入门

这篇博客介绍了Mybatis的基本概念,展示了如何编写第一个Mybatis程序,包括准备数据、配置文件、实体类和测试。深入分析了入门程序的原理,包括解析配置、获取SqlSession对象和执行SQL。还讲解了CURD操作、properties和typeAliases的使用,并强调了parameterType和resultType的重要性,同时提醒了"#{"和"${}"的区别和安全问题。
摘要由CSDN通过智能技术生成

Mybatis-入门

概述

​ Mybatis是一个Java语言编写的持久层框架。封装了JDBC操作的细节,使开发者关注于sql语句本身,无需关注注册驱动、创建链接等过程。使用了ORM思想实现了结果集的封装。

ORM

​ Object Relational Mapping 对象关系映射。简单说就是数据库表和实体类及实体类的属性对应起来,操作实体类就是操作数据库。

第一个Mybatis程序

准备数据

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `sex` varchar(32) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('41', '老王', '2020-02-27 17:47:22', '男', '北京');
INSERT INTO `user` VALUES ('42', '小二王', '2020-03-02 17:47:22', '女', '北京金燕龙');
INSERT INTO `user` VALUES ('43', '小二王', '2020-03-04 17:47:22', '女', '北京金燕龙');
INSERT INTO `user` VALUES ('45', '黑马', '2020-03-04 17:47:22', '男', '北京金燕龙');
INSERT INTO `user` VALUES ('46', '老王', '2020-03-07 17:47:22', '男', '北京');
INSERT INTO `user` VALUES ('48', '小马宝莉', '2020-03-08 17:47:22', '女', '北京朝阳');

实体类

public class User implements Serializable {
   
	private Integer id;
	private String username;
	private String sex;
	private String address;
	private Date birthday;
/* getter、setter and toString */
}

配置文件

SqlMapConfig.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>
    <!-- 配置环境 -->
    <environments default="mysql">
        <!-- 配置mysql环境 -->
        <environment id="mysql">
            <!-- 配置事务的类型 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 配置数据库信息 -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="123654" />
            </dataSource>
        </environment>
    </environments>
    <!-- 映射配置文件位置,每个dao独立的配置文件 -->
    <mappers>
        <mapper resource="com/xijianlv/dao/IUserDao.xml"/>
    </mappers>
</configuration>

IUserDao.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 namespace="com.xijianlv.dao.IUserDao">
    <!-- 配置查询所有 -->
    <select id="findAll" resultType="com.xijianlv.domain.User">
        select * from user;
    </select>
</mapper>

测试及结果

public static void main(String[] args) throws IOException {
   
    // 读取配置文件
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 创建SqlSessionFactory工厂
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    SqlSessionFactory factory = builder.build(in);
    // 生产sqlsession对象
    SqlSession session = factory.openSession();
    // 创建Dao接口的代理对象
    IUserDao userDao = session.getMapper(IUserDao.class);
    // 使用代理对象执行方法
    List<User> list = userDao.findAll();
    for (User user : list) {
   
        System.out.println(user.toString());
    }
    session.close();
}

结果:

在这里插入图片描述

入门程序的原理分析

解析配置文件

​ SqlSessionFactoryBuilder接收SqlMapConfig.xml文件流,构建出SqlSessionFactory对象。

Resources.java

/**
 * 使用类加载器读取配置文件的类
 * @author del
 */
public class Resources {
   
	/**
	 * 根据传入的参数获取一个字节输入流
	 * @param filePath
	 * @return
	 */
	public static InputStream getResourceAsStream(String filePath) {
   
		return Resources.class.getClassLoader().getResourceAsStream(filePath);
	}
}

Configuration.java 配置类

/**
 * mybatis的配置类
 * @author del
 */
public class Configuration {
   
	private String driver;
	private String url;
	private String username;
	private String password;
	private Map<String, Mapper> mappers = new HashMap<String, Mapper>();
	public void setMappers(Map<String, Mapper> mappers) {
   
        //这里的set方法未防止覆盖要用putAll来新增
		this.mappers.putAll(mappers);
	}
    /* getter、setter and toString */
}

Mapper.java

/**
 * 用于封装执行的sql和结果类型的全限定类名
 */
public class Mapper {
   
	private String queryString;// sql
	private String resultType;// 实体类的全限定类名
	public String getQueryString() {
   
		return queryString;
	}
	public void setQueryString(String queryString) {
   
		this.queryString = queryString;
	}
	public String getResultType() {
   
		return resultType;
	}
	public void setResultType(String resultType) {
   
		this.resultType = resultType;
	}
	@Override
	public String toString() {
   
		return "Mapper [queryString=" + queryString + ", resultType="
				+ resultType + "]";
	}
}

SqlSessionFactoryBuilder.java

/**
 * 用于创建一个SqlSessionFactory对象
 * @author del
 */
public class SqlSessionFactoryBuilder {
   

    /**
	 * 根据参数的字节输入流构建一个SqlSessionFactory工厂
	 * @param config
	 * @return
	 */
    public SqlSessionFactory build(InputStream config) {
   
        Configuration cfg = XMLConfigBuilder.loadConfiguration(config);
        return new DefaultSqlSessionFactory(cfg);
    }
}

XMLConfigBuilder.java 解析xml配置文件

/**
 * 解析配置文件
 * @author del
 */
public class XMLConfigBuilder {
   
    /**
	 * 解析主配置文件,把里面的内容填充到 DefaultSqlSession所需的地方 dom4j+xpath
	 * @param config
	 * @return
	 */
    public static Configuration loadConfiguration(InputStream config) {
   
        try {
   
            // 定义封装连接信息的配置对象(mybatis的配置对象)
            Configuration cfg = new Configuration();
            // 1.获取SAXReader对象
            SAXReader reader = new SAXReader();
            // 2.根据字节输入流获取Document对象
            Document document = reader.read(config);
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值