Mybatis入门使用

本文深入探讨MyBatis框架,解析其如何简化Java程序数据库操作,避免繁琐的JDBC过程,提升开发效率。涵盖MyBatis的历史演变、配置、架构原理及实际应用,通过实例展示查询操作。

Mybatis是一个持久化框架,是对java程序调用数据库jdbc的一个封装。

1.Mybatis的引入背景

传统jdbc存在的问题:

  • 频繁创建和销毁数据库连接

  • SQL语句存在硬编码(如果更新需求就需要到指定的java代码层去改,系统不易维护。可将SQL语句存在xml中统一配置管理)

  • 开发者需要花费精力维护注册驱动/创建连接/创建statement/手动设置参数/结果集检索等繁琐的jdbc操作

  • jdbc实例代码:

      public class JDBCTest {
      public static void main(String[] args) {
      	Connection connection = null;
      	PreparedStatement preparedStatement = null;
      	ResultSet resultSet = null;
    
      	try {
      		// 加载数据库驱动
      		Class.forName("com.mysql.jdbc.Driver");
    
      		// 通过驱动管理类获取数据库链接connection = DriverManager
      		connection = DriverManager.getConnection(
                                "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8",
                               "root", 
                                "yalong"
                                );
    
      		// 定义sql语句 ?表示占位符
      		String sql = "select * from user where username = ?";
      		// 获取预处理 statement
      		preparedStatement = connection.prepareStatement(sql);
      		
      		// 设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的
      		preparedStatement.setString(1, "王五");
      		// 向数据库发出 sql 执行查询,查询出结果集
      		resultSet = preparedStatement.executeQuery();
      		// 遍历查询结果集
      		while (resultSet.next()) {
      			System.out.println(
                                    resultSet.getString("id") 
                                    + " " + 
                                    resultSet.getString("username")
                       );
      		}
      	} catch (Exception e) {
      		e.printStackTrace();
      	} finally {
      		// 释放资源
      		if (resultSet != null) {
      			try {
      				resultSet.close();
      			} catch (SQLException e) {
      				e.printStackTrace();
      			}
      		}
      		if (preparedStatement != null) {
      			try {
      				preparedStatement.close();
      			} catch (SQLException e) {
      				e.printStackTrace();
      			}
      		}
      		if (connection != null) {
      			try {
      				connection.close();
      			} catch (SQLException e) {
      				// TODO Auto-generated catch block e.printStackTrace();
      			}
      		}
      	}}}
    

2.Mybatis介绍

MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github。

Mybatis介绍对使用JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis通过XML或注解的方式,将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来。

通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

3.Mabatis架构原理

Mybatis框架如何加载配置文件再读取数据库的?

说明:

  1. mybatis配置文件
    • SqlMapConfig.xml 全局配置文件,运行环境配置,加载SQL映射文件配置等
    • Mapper.xml SQL映射文件
  2. SqlSessionFactory 会话工厂
  3. sqlSession 会话,对数据库进行增删改查操作
  4. Executor执行器 具体底层干活的查询对象
  5. MappedStatement mapper.xml文件中一个select\insert\update\delete标签对应一个Mapped Statement对象

4.MyBatis使用(只演示查询操作)

  1. 环境准备

    • 创建maven项目

    • 配置依赖

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.yalong.mybatis</groupId>
          <artifactId>MybatisTest</artifactId>
          <version>1.0</version>
          <packaging>jar</packaging>
          <name>MybatisTest</name>
          <url>http://maven.apache.org</url>
          <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
        	<maven.compiler.source>1.8</maven.compiler.source>
        	<maven.compiler.target>1.8</maven.compiler.target>
        	<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
          </properties>
          <dependencies>
        	  <dependency>
        		  <groupId>org.mybatis</groupId>
        		  <artifactId>mybatis</artifactId>
        		  <version>3.4.6</version>
        	  </dependency>
        	<dependency>
        	<groupId>mysql</groupId>
        	<artifactId>mysql-connector-java</artifactId>
        		<version>5.1.35</version>
        	</dependency>
        	<dependency>
        	  <groupId>junit</groupId>
        	  <artifactId>junit</artifactId>
        	  <version>4.12</version>
        	  <scope>test</scope>
        	</dependency>
        	  </dependencies>
        	</project>
      
    • 在自己配置的数据库中创建user用户表:
      CREATE TABLE user (
      id int(11) NOT NULL AUTO_INCREMENT,
      username varchar(32) NOT NULL COMMENT ‘用户名称’,
      birthday date DEFAULT NULL COMMENT ‘生日’,
      sex char(1) DEFAULT NULL COMMENT ‘性别’,
      address varchar(256) DEFAULT NULL COMMENT ‘地址’,
      PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
      2.添加全局配置文件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>
        	  <settings>
        	    <!-- 延迟加载总开关 -->
        	    <setting name="lazyLoadingEnabled" value="false"/>
        	  </settings>
        	  <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/mybatis?characterEncoding=utf-8"/>
        				<property name="username" value="root"/>
        				<property name="password" value="yalong"/>
        			  </dataSource>
        		</environment>
        	  </environments>
        	  <mappers>
        		 <mapper resource="UserProxyMapper.xml"/>
        	  </mappers> 
         </configuration>
      

3.添加实体bean类

public class User
{
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    
	public List<Orders> getOrders() {
		return orders;
	}
	public void setOrders(List<Orders> orders) {
		this.orders = orders;
	}

    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 Date getBirthday(){
    return birthday;
    }

    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }

    public String getSex() {
    return sex;
    }

    public void setSex(String sex) {
    this.sex = sex;
    }

    public String getAddress(){
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    @Override
    public String toString() {
    return "User{" +
   "id=" + id +
   ", username='" + username + '\'' +
   ", birthday=" + birthday +
   ", sex='" + sex + '\'' +
   ", address='" + address + '\'' +
   '}';
    }
 }
  1. 添加操作user表的mapper.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="test">
         <!-- 每一个select\insert\update\delete标签对应一个Mapped Statement对象  -->
         <!-- #{}:相当于JDBC中的?占位符 -->
         <select id="findUserById" parameterType="int" resultType="com.yalong.mybatis.User">
             SELECT * FROM USER WHERE id= #{id}
         </select>
     </mapper>
    
  2. 增加单元测试类

     public class MybatisTest {
    
     private SqlSessionFactory sqlSessionFactory;
    
     @Before
     public void init() throws IOException {
         String resource = "SqlMapConfig.xml";
         InputStream inputStream = Resources.getResourceAsStream(resource);
         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
     }
    
     @Test
     public void testFinUserById() {
         SqlSession session = sqlSessionFactory.openSession();
    
         User user = null;
         try {
             user = session.selectOne("test.findUserById", 1);
             System.out.println("selectUser ok");
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             session.close();
         }
         System.out.println(user);
       }
     }
    
  3. 测试结果

5.MyBatis开发流程小结

使用完之后,核心还是分析注重源码流程,底层实现才是重中之重。

### MyBatis 入门知识 MyBatis 是一个优秀的持久层框架,它对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 JDBC 繁杂的过程代码[^3]。 ### MyBatis 使用示例 #### 1. 导包 可以从中央仓库 https://mvnrepository.com/artifact/org.mybatis/mybatis 下载两个必须的包,一个是 mybatis,一个是数据库对应的驱动包(如使用 MySQL 则下载 MySQL 驱动包),且不推荐使用高版本[^4]。 #### 2. 核心配置文件 创建 `sqlMapConfig.xml` 文件,示例如下: ```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="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/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/dhh/mapper/userMapper.xml"/> </mappers> </configuration> ``` #### 3. 创建映射文件 创建 `userMapper.xml` 文件,示例如下: ```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.dhh.mapper.userMapper"> <!-- 插入操作 --> <insert id="save" parameterType="com.dhh.domain.User"> insert into user values(#{id},#{username},#{password}) </insert> </mapper> ``` #### 4. 创建实体类 创建 `User` 类,示例如下: ```java package com.dhh.domain; public class User { private int id; private String username; private String password; // 构造函数、getter 和 setter 方法 public User() {} 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; } } ``` #### 5. 执行插入操作的代码示例 ```java import com.dhh.domain.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 java.io.InputStream; public class Test { public static void main(String[] args) throws Exception { // 模拟 User 对象 User user = new User(); user.setUsername("tom"); user.setPassword("abc"); // 获得核心配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); // 获得 SQLSession 工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 获得 session 会话对象 核心对象 SqlSession sqlSession = sqlSessionFactory.openSession(); // 执行操作 参数:namespace+id sqlSession.insert("com.dhh.mapper.userMapper.save", user); // mybatis 执行更新操作 提交事务 sqlSession.commit(); // 释放资源 sqlSession.close(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值