Mybatis入门

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对象并返回。

Mybatis框架 

框架介绍

1、 mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

利用IDEA创建Mybatis的入门案例

8个步骤

1.创建maven工程,什么都不选就ok,并导入坐标

  <dependencies>
    <!--mysql驱动依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.27</version>
    </dependency>
    <!--mybatis的依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.1</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>

2.编写User实体类和Dao类

package com.aaa.zob.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @program: 
 * @description:
 * @author: 
 * @create: 2021-12-02 21:26
 **/
@Data//Getter and setter
@AllArgsConstructor// 有参构造
@NoArgsConstructor// 无参构造
public class User {
    private int bid;
    private String name;
    
}

package com.aaa.zob.Dao;

import com.aaa.zob.entity.Food;

import java.util.List;

public interface UserDao {
    //查询
    List<User> selectAll();
    //通过ID查询
    Food getUser(int id);
    //修改
    int updateUser(User user);
    //添加
    int addUser(User user);
    //删除
    int delete(int id);
}

3.在resources文件夹中,创建Mybatis的主配置文件SqlMapConfig.xml。它是mybatis核

心配置文件,配置文件内容为数据源、事务管理。

配置环境:

  • 配置mysql的环境:
  1. 配置事务的类型;
  2. 配置连接池:配置连接数据库的4个基本信息;
  • 指定映射配置文件的位置:

 代码如下:

Copy
<?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>
<!--maysql链接-->
<properties resource="db.properties"/>
<!--配置环境-->
    <environments default="development">
 	    <!--配置mysql的环境-->
        <environment id="development">
  		   <!--配置事务的类型-->
            <transactionManager type="JDBC"/>
		   <!--配置连接池-->
            <dataSource type="POOLED">
				<!--配置连接数据库的4个基本信息-->
                <property name="driver" value="${jdbc.driverName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="mapper/UserDao.xml"/>
    </mappers>
</configuration>

4.在resources文件夹中导入log4j.properties文件

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

 5.编写映射文件 UserDao.xml ,位置在目录resource->mapper->UserDao.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.aaa.qy145.Seventh.Dao.FoodDao">
    <resultMap id="zob" type="com.aaa.qy145.Seventh.entity.Food">
        <id property="id" column="id"/>
        <result property="na" column="name"/>
        <result property="se" column="sex"/>
        <result property="add" column="address"/>
    </resultMap>
//用ID查询
    <select id="getUser" resultMap="zob">
        select * from role where id=#{id}
    </select>
//添加
    <insert id="addUser">
          insert into role(name,sex,address) values(#{na},#{se},#{add})
    </insert>
//修改
    <update id="updateUser">
         update role set name=#{na},sex=#{se},address=#{add} where id=#{id}
    </update>
//查询全部
    <select id="selectAll" resultMap="zob">
         select * from role
    </select>
//删除
    <delete id="delete">
        delete from role where id=#{id}
    </delete>
</mapper>

6.加载映射文件,将User.xml添加在UserDao.xml下

<!--指定映射配置文件的位置-->

<mappers>
    <mapper resource="mapper/UserDao.xml"/>
</mappers>

7.编写测试类:在test->java目录下创建测试类com.aaa.zob.MybatisTest。实现业务需求.

1. 加载核心配置文件SqlMapConfig.xml
2. 创建SqlSessionFactoryBuilder对象
3. 创建SqlSessionFactory对象(2,3可以写一起)
4. 创建SqlSession对象
5. 执行SqlSession对象执行查询,获取结果User
6. 打印结果
7. 释放资源

代码如下:

package com.aaa.qy145.Seventh;

import com.aaa.qy145.Seventh.Dao.FoodDao;
import com.aaa.qy145.Seventh.entity.Food;
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 org.junit.Before;
import org.junit.Test;

import java.io.Reader;
import java.util.List;

/**
 * @program: 
 * @description:
 * @author: 
 * @create: 2021-12-01 20:21
 **/
public class FoodTest {
    SqlSession session;
    @Before
    public void sss() throws  Exception{
          //1.读取配置文件
        Reader reader = Resources.getResourceAsReader("maybatis.xml");
         //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new 
SqlSessionFactoryBuilder().build(reader);
         //3.使用工厂生产SqlSession对象
        session=sqlSessionFactory.openSession();
    }
//查询全部
    @Test
    public void s1(){
        FoodDao  mapper= session.getMapper(UserDao.class);
     //4.执行Sql语句
        List<Food> list = mapper.selectAll();
  //5. 打印结果
        System.out.println(list);
    }
//用ID查询
    @Test
    public void s2(){
        FoodDao mapper = session.getMapper(UserDao.class);
        Food food = mapper.getUser(2);
        System.out.println(food);
//6.释放资源
        session.commit();
    }
//修改
    @Test
    public void s3(){
        FoodDao mapper = session.getMapper(UserDao.class);
        Food f = new Food();
        f.setNa("索隆");
        f.setSe("男");
        f.setAdd("霜月存");
        f.setId(2);
        mapper.updateUser(f);
        session.commit();
    }
//添加
    @Test
    public void s4(){
        FoodDao mapper = session.getMapper(UserDao.class);
        Food food = new Food();
        food.setNa("娜美");
        food.setSe("女");
        food.setAdd("小岛");
        mapper.addUser(food);
        session.commit();
    }
//删除
    @Test
    public void s5(){
        FoodDao mapper = session.getMapper(UserDao.class);
        int delete = mapper.delete(10);
        System.out.println(delete);
        session.commit();
    }
}

8. 配置映射配置文件UserDao.xml

//用ID查询
    <select id="getUser" resultMap="zob">
        select * from role where id=#{id}
    <lect>
//添加
    <insert id="addUser">
          insert into role(name,sex,address) values(#{na},#{se},#{add})
    </insert>
//修改
    <update id="updateUser">
         update role set name=#{na},sex=#{se},address=#{add} where id=#{id}
    </update>
//查询全部
    <select id="selectAll" resultMap="zob">
         select * from role
    <lect>
//删除
    <delete id="delete">
        delete from role where id=#{id}
    </delete>

注意事项

详解参数

namespace:用来区别不同的类的名字
id:标识映射文件中的sql,称为statement的id将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入参数的类型.
resultType:指定输出结果类型。mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中

#{}:一个占位符。preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}:表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

 解释select语句

这一部分参考mybatis官网。详情点击mybatis – MyBatis 3 | XML 映射器

<select id="getUser" resultMap="zob">
    select * from role where id=#{id}
</select>

 使用 JDBC 意味着需要更多的代码来提取结果并将它们映射到对象实例中,而这就是 MyBatis 节省你时间的地方.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值