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

MyBatis 系列 --- 001 新手入门

程序员文章站 2022-05-24 15:28:55
...

MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射

1.安装

方法1:下载并导入MyBatis的jar包(mybatis-3.5.2.jar)。
方法2:Maven项目可以直接在pom.xml 文件中添加以下dependency代码。

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

2.简单Maven项目体验Mybatis

第一步:项目准备工作

1.准备MySQL数据库,数据库project_mybatis,表t_user,两条数据。
MyBatis 系列 --- 001 新手入门
2.创建简单Maven项目
创建之前建议先进行Maven配置,点击会跳转。
MyBatis 系列 --- 001 新手入门
MyBatis 系列 --- 001 新手入门
3.配置pom.xml,在文件中添加以下代码。

	<!-- mybatis依赖 -->
  	<dependency>
  	  <groupId>org.mybatis</groupId>
  	  <artifactId>mybatis</artifactId>
  	  <version>3.5.2</version>
	</dependency>
	<!-- mysql连接依赖 -->
	<dependency>
      <groupId>com.mysql</groupId>
      <artifactId>connectorj</artifactId>
      <version>5.1.12</version>
	</dependency>

4.Maven项目文件配置
MyBatis 系列 --- 001 新手入门
5.创建User.java。

package fun.andre.pojo;

public class User {
	
	private String username;
	private String password;
	
	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;
	}
	
}

第二步:映射器文件配置

映射器文件配置有两种方式,一种是使用XML文件,另一种是使用注解,无论什么方式都要有映射器接口文件。
映射器接口文件UserMapper.java

package fun.andre.mapper;

import org.apache.ibatis.annotations.Select;

import fun.andre.pojo.User;

public interface UserMapper {
	
	// 使用XML文件配置映射器
	public User selectUserbyXML(String username);
	
	// 使用注解配置映射器
	@Select("select * from t_user where username = #{username}")
	public User selectUserbyAnnotation(String username);

}

第一种:使用XML文件
创建UserMapper.xml文件,然后配合UserMapper.java的selectUserbyXML方法使用。

<?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="fun.andre.mapper.UserMapper">
	<select id="selectUserbyXML" resultType="fun.andre.pojo.User">
		select * from t_user where username = #{username}
	</select>
</mapper>

第二种:使用注解

	// 使用注解配置映射器
	@Select("select * from t_user where username = #{username}")
	public User selectUserbyAnnotation(String username);

第三步:Mybatis配置

Mybatis配置包括数据池(DataSource),事务管理器(TransactionFactory),环境变量(Environment),映射器(Mapper),创建SqlSessionFactory,创建SqlSession等等。
1.首先我们需要配置数据池DataSource和事务管理器TransactionFactory,然后才能生成环境变量Environment,使用环境变量完成Mybatis配置Configuration。
2.其次才能通过配置去生成SqlSessionFactory和SqlSession,完成对数据库的基本操作。
3.Mybatis配置主要有两种方式,一种是使用XML配置文件,另一种是使用Java代码。
方法1:使用XML配置文件mybatis-config.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">

<!-- mybatis配置文件 -->
<configuration>
	<!-- 环境配置 -->
	<!-- 加载名为development的环境变量 -->
	<environments default="development">
		<!-- 环境变量 -->
		<environment id="development">
			<!-- 事务管理器 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 数据源 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/project_mybatis"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 映射器 -->
	<mappers>
		<mapper class="fun.andre.mapper.UserMapper"/>
	</mappers>
</configuration>

方法2:使用Java代码。

package fun.andre.conf;

import javax.sql.DataSource;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import fun.andre.mapper.UserMapper;

public class MybatisConfig {
	
	// 获取一个初始化的SqlSessionFactory
	public static SqlSessionFactory initSqlSessionFactory() {
		
		// 获取数据源
		DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", 
				"jdbc:mysql://localhost:3306/project_mybatis", "root", "root");
		
		// 获取JDBC事务管理器实例
		TransactionFactory transactionFactory = new JdbcTransactionFactory();
		
		// 获取环境变量
		Environment environment = new Environment("development", transactionFactory, dataSource);
		
		// 获取mybatis配置
		Configuration configuration = new Configuration(environment);
		
		// 添加映射器
		configuration.addMapper(UserMapper.class);
		
		// 获取SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
		
		return sqlSessionFactory;
		
	}
	
}

第四步:实现一个简单的查询功能

package fun.andre.learn_mybatis;

import java.io.IOException;
import java.io.InputStream;

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 fun.andre.conf.MybatisConfig;
import fun.andre.mapper.UserMapper;
import fun.andre.pojo.User;

public class App 
{
    public static void main( String[] args )
    {
    	selectByXML();
    	System.out.println();
    	selectByJava();
    }
    
    public static void selectByXML() {
    	System.out.println("使用XML配置");
    	String resource = "fun/andre/conf/mybatis-config.xml";
    	// 使用输入流(InputStream)实例来加载xml配置文件
    	InputStream inputStream = null;
    	try {
			inputStream = Resources.getResourceAsStream(resource);
		} catch (IOException e) {
			e.printStackTrace();
		}
    	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    	// 获取SqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        	// 加载UserMapper映射
        	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 查询
            User user = userMapper.selectUserbyXML("yzh1");
            System.out.println(user.getPassword());
            User user2 = userMapper.selectUserbyAnnotation("yzh2");
            System.out.println(user2.getPassword());
		} catch (Exception e) {
			e.printStackTrace();
		}        		
	}
    
    public static void selectByJava() {
    	System.out.println("使用Java代码配置");
    	// 获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = MybatisConfig.initSqlSessionFactory();
        // 获取SqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        	// 加载UserMapper映射
        	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 查询
            User user = userMapper.selectUserbyXML("yzh1");
            System.out.println(user.getPassword());
            User user2 = userMapper.selectUserbyAnnotation("yzh2");
            System.out.println(user2.getPassword());
		} catch (Exception e) {
			e.printStackTrace();
		}        
	}
    
}

运行结果如下:
MyBatis 系列 --- 001 新手入门

3.知识补充

作用域(Scope)和生命周期

SqlSessionFactoryBuilder:SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)一旦创建了 SqlSessionFactory,就不再需要它了
SqlSessionFactory:SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession