mybatis简单应用

大-雄      2022-04-17     535

关键词:

Mybatis的核心组件:

  • SqlSeeeionFactoryBuilder (构建器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建的Builder模式;
  • SqlSessionFactory:依靠它来生成SqlSession,使用的是工厂模式。
  • SqlSession(会话)发送SQL执行并返回结果,也可以获取Mapper接口。
  • SQL Mapper(映射器): 由一个java接口和XML文件(或注解)构成,需要给出SQL的映射规则。它负责发送SQL去执行返回结果。

1.使用XML:mybatis-config.xml创建SqlSessionFactory的配置;

<?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>
  <typeAliases><!-- 别名 -->
      <typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
  </typeAliases>
  <!-- 数据库环境 -->
  <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/ssm"/>
        <property name="username" value="root"/>
        <property name="password" value="admin123"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 映射文件 -->
  <mappers>
    <mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
    <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> 
  </mappers>
</configuration>

1.1 使用代码或xml创建SqlSessionFactory

package com.learn.ssm.chapter3.utils;

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

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
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 com.learn.ssm.chapter3.mapper.RoleMapper;
import com.learn.ssm.chapter3.mapper.RoleMapper2;
import com.learn.ssm.chapter3.pojo.Role;

public class SqlSessionFactoryUtils {

    private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;

    private static SqlSessionFactory sqlSessionFactory = null;

    private SqlSessionFactoryUtils() {
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        synchronized (LOCK) {
            if (sqlSessionFactory != null) {
                return sqlSessionFactory;
            }
            String resource = "mybatis-config.xml";
            InputStream inputStream;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return sqlSessionFactory;
        }
    }
    
    
    //代码生成SqlSessionFactory
    public static SqlSessionFactory getSqlSessionFactory2() {
        synchronized (LOCK) {
            //数据库连接池信息
            PooledDataSource dataSource = new PooledDataSource();
            dataSource.setDriver("com.mysql.jdbc.Driver");
            dataSource.setUsername("root");
            dataSource.setPassword("admin123");
            dataSource.setUrl("jdbc:mysql://localhost:3306/ssm");
            dataSource.setDefaultAutoCommit(false);
            //采用MyBatis的JDBC事务方式
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            Environment environment = new Environment("development", transactionFactory, dataSource);
            //创建Configuration对象
            Configuration configuration = new Configuration(environment);
            //注册一个MyBatis上下文别名
            configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
            //加入一个映射器
            configuration.addMapper(RoleMapper.class);
            configuration.addMapper(RoleMapper2.class);
            //使用SqlSessionFactoryBuilder构建SqlSessionFactory
            sqlSessionFactory = 
                new SqlSessionFactoryBuilder().build(configuration);
            return sqlSessionFactory;     
        }
    }

    public static SqlSession openSqlSession() {
        if (sqlSessionFactory == null) {
            getSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

2. 映射器,由一个java接口和XML文件(或注解)构成

首先定义一个POJO

package com.learn.ssm.chapter3.pojo;

public class Role {

    private Long id;
    private String roleName;
    private String note;

    /** setter and getter **/
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

}

2.1, 接口和XML实现映射

映射器接口:

public interface RoleMapper {
    public int insertRole(Role role);
    public int deleteRole(Long id);
    public int updateRole(Role role);
    public Role getRole(Long id);
    public List<Role> findRoles(String roleName);
}

在XML创建SqlSession中有这样代码

<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
引入XML(RoleMapper.xml)创建映射器(insert/select/update/delete)代表增/查/改/删
id 代表RoleMapper中方法名字
parameterType代表传入参数类型
resultType代表返回值 "role"是别名,代表<typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
<?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.learn.ssm.chapter3.mapper.RoleMapper">

    <insert id="insertRole" parameterType="role">
        insert into t_role(role_name, note) values(#{roleName}, #{note})
    </insert>

    <delete id="deleteRole" parameterType="long">
        delete from t_role where id= #{id}
    </delete>

    <update id="updateRole" parameterType="role">
        update t_role set role_name = #{roleName}, note = #{note} where id= #{id}
    </update>

    <select id="getRole" parameterType="long" resultType="role">
        select id,
        role_name as roleName, note from t_role where id = #{id}
    </select>

    <select id="findRoles" parameterType="string" resultType="role">
        select id, role_name as roleName, note from t_role
        where role_name like concat(‘%‘, #{roleName}, ‘%‘)
    </select>
</mapper>

 

2.2注解实现映射器

XML中引入Mapper:

 <mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/> 
public interface RoleMapper2 {
    
    @Select("select id, role_name as roleName, note from t_role where id=#{id}")
    public Role getRole(Long id);
    
    @Insert("insert into t_role(role_name,note) values(#{roleName},#{note})")
    public void insertRole(Role role);
}

 注解不易于维护

3. 测试:

public class Chapter3Main {

	public static void main(String[] args) {
		testRoleMapper();
		testRoleMapper2();
	}
	
	//xml 测试
	private static void testRoleMapper() {
		Logger log = Logger.getLogger(Chapter3Main.class);
		SqlSession sqlSession = null;
		try {
			sqlSession = SqlSessionFactoryUtils.openSqlSession();
			RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
			Role role = roleMapper.getRole(1L);
			Role r1 = new Role();
			r1.setRoleName("testRole name");
			r1.setNote("note...");
			roleMapper.insertRole(r1);
			sqlSession.commit();
			log.info(role.getRoleName());
		}
		catch(Exception ex)
		{
			sqlSession.rollback();
		}
		finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
	
	//注解SQL测试
	private static void testRoleMapper2() {
		Logger log = Logger.getLogger(Chapter3Main.class);
		SqlSession sqlSession = null;
		try {
			sqlSession = SqlSessionFactoryUtils.openSqlSession();
			RoleMapper2 roleMapper2 = sqlSession.getMapper(RoleMapper2.class);
			Role role = roleMapper2.getRole(1L);
			Role r1 = new Role();
			r1.setRoleName("testRole name map2");
			r1.setNote("note...");
			roleMapper2.insertRole(r1);
			sqlSession.commit();
			log.info(role.getRoleName());
		} 
		catch(Exception ex)
		{
			sqlSession.rollback();
		}
		finally {
			if (sqlSession != null) {
				sqlSession.close();
			}
		}
	}
}

  


mybatis的优缺点及应用场合

mybatis框架的优点与jdbc相比,减少了50%以上的代码量mybatis是最简单的持久化框架,小巧简单且易学mybatis想到灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在xml里,从程序代码中彻底分离,降低耦合度,便于统一管理和... 查看详情

mybatis的原理及应用

MyBatis是一个基于Java的持久层ORM关系映射框架,是一种支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。它避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或... 查看详情

springboot工程中mybatis框架的应用

MyBatis概述1)优秀的持久层框架?(持久层:负责将内存中的对象存储到数据库的那一层对象(DAO).2)最大的优势?(能够低成本的快速实现数据库中的数据操作)2.1)开源(免费-成本低)2.2)简单(操作步骤,参数映射,结果映射)2.4)灵活(动态SQL-可... 查看详情

mybatis入门要素

...代码,可以比较完全的掌握它的设计思路和实现。灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。解除sql与程序代码的耦合:... 查看详情

mybatis源码分析五mybatis的缓存

五、MyBatis缓存文章目录五、MyBatis缓存缓存的概念与应用缓存的概念开发一个简单的缓存MyBatis中的缓存设计自定义一个Cache实现类MyBatis中的Cache实现类PerpetualCache装饰器CacheCache如何在MyBatis运行过程应用MyBatis缓存的二层体系一级... 查看详情

mybatis源码分析五mybatis的缓存

五、MyBatis缓存文章目录五、MyBatis缓存缓存的概念与应用缓存的概念开发一个简单的缓存MyBatis中的缓存设计自定义一个Cache实现类MyBatis中的Cache实现类PerpetualCache装饰器CacheCache如何在MyBatis运行过程应用MyBatis缓存的二层体系一级... 查看详情

eclipse创建一个简单的mybatis项目

...中创建com.demo.po,com.demo.mapper,com.demo.dao三个包,并创建MyBatis框架配置文件mybatis-config.xml文件,在mapper目录下创建数据实体映射文件CommodityStorageMapper.xml,在po目录下创建名为CommodityStorage的实体类。如下图所示: 转载文章链... 查看详情

使用springboot简单整合springsecurity和mybatis-plus(代码片段)

1、概述SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。SpringSecurity是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Sprin... 查看详情

mybatis简单的mybatis增删改查模板

简单的mybatis增删改查模板:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.suneee.sc 查看详情

mybatis中#和$的区别及应用场景

参考技术A动态sql是mybatis的主要特性之一,在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析。mybatis为我们提供了两种支持动态sql的语法:#以及$。如:#:根据参数的类型进行处理,比如传入String类型,... 查看详情

mybatis简介

MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlainOldJavaObjects,普通的Java... 查看详情

mybatis简单入门

 1、Mybatis概述    MyBatis是支持普通SQL查询(相比较于Hibernate的封装,Mybatis是半自动化的JDBC封装,一个特点就是Mybatis执行的SQL查询语句需要自己在配置文件中写),存储过程和高级映射的优秀持久层框架。MyBatis消除了... 查看详情

mybatis简单入门

 1、Mybatis概述    MyBatis是支持普通SQL查询(相比较于Hibernate的封装,Mybatis是半自动化的JDBC封装,一个特点就是Mybatis执行的SQL查询语句需要自己在配置文件中写),存储过程和高级映射的优秀持久层框架。MyBatis消除了... 查看详情

mybatis简单了解

MyBatis是什么? MyBatis是一个简化和实现了Java数据持久化层(persistencelayer)的开源框架,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建。MyBatis3是iBATIS的... 查看详情

mybatis入门学习

一、MyBatis入门简要介绍(百科)  MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接... 查看详情

mybatis-03-简单配置mybatis

四、配置MyBatis4.1核心配置文件——mybatis-config.xmlMyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。配置文档的顶层结构如下:configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类... 查看详情

mybatis学习笔记一:mybatis最简单的环境搭建

 MyBatis的最简单环境的搭建,使用xml配置,用来理解后面的复杂配置做基础1.环境目录树(导入mybatis-3.4.1.jar包即可,这里是为后面的环境最准备使用了web项目,如果只是做mybatis的环境,普通java项目即可 ) 2.Person.java(纯POJO对象... 查看详情

什么是mybatis框架

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(PlainOrdinaryJav... 查看详情