MyBatis总结一

简介

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

 

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

 

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJOPlain Old/Ordinary Java Objects,普通的Java对象)映射成数据库中的记录.

 

使用mybatis的原因

MyBatis是一个半自动化的持久化层框架。

JDBC

SQL夹在Java代码块里,耦合度高导致硬编码内伤

维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

HibernateJPA

长难复杂SQL,对于Hibernate而言处理也不容易

内部自动生产的SQL,不容易做特殊优化。

基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。

对开发人员而言,核心sql还是需要自己优化

sqljava编码分开,功能边界清晰,一个专注业务、一个专注数据。

可以使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJO映射成数据库中的记录。成为业务代码+底层数据库的媒介

MyBatis和数据库的交互有两种方式:

1.使用传统的MyBatis提供的API;

2. 使用Mapper接口

一:使用传统的MyBatis提供的API链接数据库

一:基础环境搭建

1.依赖jar包:

 mysql 驱动不要使用6以上,会报:

java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required

Stack Overflow

2.创建表:

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 DEFAULT CHARSET=utf8

3.创建实体User:

    private Integer id;
    private String username;
    private String birthday;
    private String sex;
    private String address;
    // ...getter、setter

 

二.创建MyBatis全局配置文件以及映射文件

  1.全局配置文件traditionSqlMapConfig.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>
   
    <!-- 配置mybatis的环境信息。和spring整合后 environments配置将废除 environment可能有多个,default是要使用的那个 -->
    <environments default="development">
        <environment id="development">
            <!--TransactionManager:使用什么类型的事务管理机制 Type: POOLED  :MyBatis会创建PooledDataSource实例
                UNPOOLED :MyBatis会创建UnpooledDataSource实例 JNDI     :MyBatis会从JNDI服务上查找DataSource实例,然后返回使用 -->
            <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="mysql" />
                                
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 加载配置文件 -->
        <mapper resource="com/review/bean/UserTest.xml" />
    </mappers>
</configuration>

2..创建SQL映射文件user.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">
<!-- namespace:配置名称空间,对配置的statement进行分类管理
		此时名称可以任意
		当使用Mapper代理时,namespace具有特殊的含义与功能
 -->
<mapper namespace="test">
	<!-- id:可以通过id找到执行的statement,statement唯一标识 简称statementID,通常 第一个参数加上namespace  -->
		
	
	
	<select id="getUserById" parameterType="int" resultType="com.review.bean.User">
		select * from user where id=#{id}
	</select>

	
</mapper>

3.编码测试

public void testGetUserById() throws IOException {
       // 创建SqlSessionFactoryBuilder对象
       SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
       // 查找配置文件创建输入流
       InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config/SqlMapConfig.xml");
       // 加载配置文件,创建SqlSessionFactory对象
       SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
       // 创建SqlSession对象
       SqlSession sqlSession = sqlSessionFactory.openSession();
       // 执行查询,参数一:要查询的statementId ,参数二:sql语句入参
       User user = sqlSession.selectOne("test.getUserById", 1);

       // 输出查询结果
       System.out.println(user);
       // 释放资源
       sqlSession.close();
    }

结果:

 二:使用mapper映射文件链接数据库

 

规则:

  1. namespace必需是接口的全路径名
  2. 接口的方法名必需与映射文件的sql id一致
  3. 接口的输入参数必需与映射文件的parameterType类型一致
  4. 接口的返回类型必须与映射文件的resultType类型一致

 

 

 根据MyBatis 的配置规范配置好后,通过SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,我们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定Statement Id,底层还是通过SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等来实现对数据库的操作。

MyBatis 引用Mapper 接口这种调用方式,纯粹是为了满足面向接口编程的需要。(其实还有一个原因是在于,面向接口的编程,使得用户在接口上可以使用注解来配置SQL语句,这样就可以脱离XML配置文件,实现“0配置”)。
 

基础环境搭建:

1.创建mapperSqlMapConfig,xml

2.创建OrderMapper.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">
<!--  1.	namespace必需是接口的全路径名
      2.	接口的方法名必需与映射文件的sql id一致
      3.	接口的输入参数必需与映射文件的parameterType类型一致
      4.	接口的返回类型必须与映射文件的resultType类型一致
 -->
<mapper namespace="com.review.mapper.OrderMapper">

   
    <select id="getOrderById" parameterType="int" resultType="com.review.bean.Order">
        select * from `Order` where id=#{id};
    </select>


</mapper>

 

3.创建OrderMapper接口:

package com.review.mapper;

import com.review.bean.Order;

public interface OrderMapper {

    public Order getOrderById(int id);

}

 

4.建表语句

CREATE TABLE `order` (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) default NULL COMMENT '备注',
  PRIMARY KEY  (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_order_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8

5.编码测试

 public void testGetOrderById() throws IOException {
        // 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();

        // 查找配置文件创建输入流
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("mapperSqlMapConfig.xml");
        
        // 加载配置文件,创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);

        // 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
       
        OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
        Order order = mapper.getOrderById(7);
        System.out.println(order);
        // 释放资源
        sqlSession.close();
    }

注意事项:

git地址

项目经历过重构,包名+类名可能出错

1.项目整体结构图:

2.找不到资源文件

idea:打开Project Setting -->Modules:资源文件夹设置为Sources Folder

具体参考:

getResourceAsStream加载资源文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值