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开发流程小结

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值