初识MyBatis

发布时间:2024年01月15日

1.什么是MyBatis

MyBatis 是一款优秀的持久层框架(Dao层),它支持自定义 SQL、存储过程以及高级映射。内部封装了JDBC,也有人把MyBatis称之为半自动化的ORM映射框架

半自动化:MyBatis天生支持对象结果集映射,MyBatis认为用户自己写的SQL效率最高,所以没有支持.

2.什么是ORM

对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,在面向对象中方便进行对象转化.

用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--"虚拟对象数据库"。

对象转化:

? ? ? ? 操作数据库时,我们通过sql语句来获取查询到的结果集,但是用户在使用时需要将结果集自己封装为对象,这个过程可以使用ORM进行自动化的映射.

ORM思想:

? ? ?----结果集可以自动封装为对象

? ? ?----根据对象可以自动生成sql

? 全自动ORM

? ? hibernate? ? 纯面向对象,用户不用写sql,但是多表操作时,代码不够灵活,sql冗余,执行效率比MyBatis低.

MyBatis入门案例

没有蓝鸟红鸟图标就添加一个插件 MyBatisX

1.导入jar包

运行期无效? ? ? <scope>provided</scope>
?

  <dependencies>

    <!--导入MySQL的驱动包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.16</version>
    </dependency>

    <!--导入MyBatis的jar包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>


    <!-- 日志 , 会自动传递slf4j门面-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>

    <!--导入lombokjar包-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

2.编写pojo实体类

应该与数据库中的表字段一一对应

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;

}
3.编写mapper接口和映射文件

在配置文件里编写UserMapper.xml映射文件,与接口绑定

public interface UserMapper {

    List<User> getAllUser();

}
实现Mapper具体操作的

mapper namespace  
resultType

id要和接口绑定

<!--配置文件应该与接口绑定-->
<mapper namespace="com.atguigu.mybatis.mapper.UserMapper">

    <!--要求sql标签的id 必须与方法的名称一致 -->
    <select id="getAllUser" resultType="com.atguigu.mybatis.pojo.User">
        select id,name,age,sex from user
    </select>

   <!-- <insert id=""></insert>
    <update id=""></update>
    <delete id=""></delete>-->

</mapper>

4.mybatis-config.xml? ?核心配置文件

管理数据源?

?管理事务,?

加载映射文件

POOLED 池化
<configuration>
    <!--设置连接数据库的环境
        default: 默认链接的数据库
        id:  指定数据库连接的编号
    -->
    <environments default="development">
        <environment id="development">
            <!--事务管理器 控制事务 JDBC -->
            <transactionManager type="JDBC"/>
            <!--指定数据源  POOLED 池化-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/top_news?serverTimezone=UTC&amp;rewriteBatchedStatements=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

    </environments>

    <!--引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>
5.测试类

MyBatis操作数据库

1.加载核心配置文件mybatis-config.xml

2.?获取MyBatis核心对象? ? SqlSessionFuctory?

3.基于工厂模式,获取SqlSession

4.获取Mapper接口

5.基于接口调用业务方法

SqlSessionFactroyBuilder? ?工厂的创建? ?

SqlSessionFuctory? ? ?工厂? ?获取MyBatis核心对象

SqlSession = conn + 自动映射? ? ?获取对象

? ? ? ? SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
? ? ? ? SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);

我要创建个工厂? 而且我要拿到你的核心配置文件里面的resource对应的接口,然后我才能干活

? //获取Mapper接口
? ? ? ? UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

这个接口的实现类对象是谁?

是一个代理对象? ?而且是JDK的代理

    /**
     * mybatis操作数据库:
     *      1.加载mybatis的核心配置文件mybatis-config.xml
     *      2.获取Mybatis核心对象
     *  SqlSession = conn + 自动映射
     * @throws IOException
     */
    @Test
    public void testGetAllUser() throws IOException {
        //读取mybatis-config.xml核心配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //创建mybatis中操作数据库的会话对象SqlSession
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //面向接口编程 controller-service-dao  接口调用
        //获取Mapper接口
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //调用接口方法
        List<User> userList = userMapper.getAllUser();
        //如果方法体中只有一行代码 并且是输出语句则简化
        userList.forEach(System.out::println);
    }

常见错误

BindingException异常说明

报错说明1:

org.apache.ibatis.binding.BindingException: Type interface com.jt.mapper.UserMapper is not known to the MapperRegistry.

解决方案1:
检查namespace命名是否与接口一致

报错说明2:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jt.mapper.UserMapper.findAll

解决方案2:
检查xml映射文件中的ID是否与接口方法一致.

报错说明3:

The error may exist in mybatis/mappers/UserMapper2.xml

解决方案3:
检查mybatis核心文件加载mapper映射文件的路径是否正确.
?

简化

@Before? ?在执行@Test测试方法前? 执行

    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws IOException {
        InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);

    }
    @Test
    public void TestSelectById(){
//得到sqlSession   开始干活
        SqlSession sqlSession = sqlSessionFactory.openSession();
//获取接口
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById();
        System.out.println(user);
    }
    <select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
        select id,name,age,sex from user
    </select>

文章来源:https://blog.csdn.net/2302_77790337/article/details/135570149
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。