Mybatis

本文详细介绍了MyBatis持久层框架,从原始JDBC操作的不足出发,阐述了MyBatis的核心功能和优势。内容涵盖MyBatis的快速入门,包括环境搭建、映射文件和增删改查操作,以及SqlSessionFactory和SqlSession的使用。同时,文章还讨论了Dao层的两种实现方式——传统开发和代理方式,并对MyBatis的配置文件进行了初步解析。
摘要由CSDN通过智能技术生成

目录

1. MyBatis的简介

1.1 原始jdbc操作

1.2 原始jdbc操作的分析

1.3 什么是Mybatis

2.MyBatis的快速入门

2.1 MyBatis开发步骤

2.2 环境搭建

2.3 编写测试代码

3.MyBatis的映射文件概述

4.MyBatis的增删改查操作

4.1 MyBatis的插入数据操作

4.2 MyBatis的修改数据操作

4.3 MyBatis的删除数据操作

5.MyBatis的核心配置文件概述

5.1 MyBatis核心配置文件层级关系

5.2 MyBatis常用配置解析

6.MyBatis的相应API

6.1 SqlSession工厂构建器SqlSessionFactoryBuilder

6.2 SqlSession工厂对象SqlSessionFactory

6.3 SqlSession会话对象

7.Mybatis的Dao层实现

7.1 传统开发方式

7.2 代理开发方式

7.3 知识小结

8.MyBatis映射文件深入

9.MyBatis核心配置文件深入

10.MyBatis的多表操作

11.MyBatis的注解开发


1. MyBatis的简介

1.1 原始jdbc操作

原始jdbc操作(插入数据)

原始jdbc操作(查询数据)

1.2 原始jdbc操作的分析

原始jdbc开发存在的问题如下:

  • 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
  • sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
  • 查询操作时,需要手动将结果集中的数据手动封装到实体中。插入操作时,需要手动将实体的数据设置到sql语句的占位符位置

应对上述问题给出的解决方案:

  • 使用数据库连接池初始化连接资源
  • 将sql语句抽取到xml配置文件中
  • 使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射

1.3 什么是Mybatis

  • mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
  • mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
  • 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。

2.MyBatis的快速入门

2.1 MyBatis开发步骤

MyBatis官网地址:http://www.mybatis.org/mybatis-3/

  • 添加MyBatis的坐标
  • 创建user数据表
  • 编写User实体类
  • 编写映射文件UserMapper.xml
  • 编写核心文件SqlMapConfig.xml
  • 编写测试类

2.2 环境搭建

1. 导入MyBatis的坐标和其他相关坐标

<!--单元测试坐标-->
<dependency>  
    <groupId>junit</groupId>    
    <artifactId>junit</artifactId>    
    <version>4.12</version>    
    <scope>test</scope>
</dependency>
<!--日志坐标-->
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.12</version>
</dependency>

2. 创建myUser数据表

3. 编写User实体

public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {

4. 编写UserMapper映射文件

<?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="userMapper">
    <select id="findAll"  resultType="com.itheima.domain.User">
        select * from MyUser
    </select>
</mapper>

5. 编写MyBatis核心文件

<?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>
<!--    配置数据源的环境-->
    <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/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;useLegacyDatetimeCode=false&amp;serverTimezone=GMT%2B8&amp;rewriteBatchedStatements=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

2.3 编写测试代码

public class MybatisTest {
    @Test
    public void test1() throws IOException {
//        获得核心配置文件
        InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
//        获得session工厂对象
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
//        获得session会话对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
//        执行操作 参数:namespace+id
       List<User> userList= sqlSession.selectList("userMapper.findAll");
//       打印数据
        System.out.println(userList);
//        释放资源
        sqlSession.close();
    }
}

3.MyBatis的映射文件概述

4.MyBatis的增删改查操作

4.1 MyBatis的插入数据操作

1. 编写UserMapper映射文件

<?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="userMapper">

<!--    插入操作-->
    <insert id="save" parameterType="com.itheima.domain.User">
        insert into myUser values(#{id},#{username},#{password})
    </insert>

</mapper>

2. 编写插入实体User的代码

 @Test
    public void test2() throws IOException {
//        模拟user对象
        User user=new User();
        user.setUsername("tom");
        user.setPassword("666");

//        获得核心配置文件
        InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
//        获得session工厂对象
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
//        获得session会话对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
//        执行操作 参数:namespace+id
      sqlSession.insert("userMapper.save",user);

//      mybatis执行更新操作 提交事务
        sqlSession.commit();

//        释放资源
        sqlSession.close();
    }

3. 插入操作注意问题

  • 插入语句使用insert标签  
  • 在映射文件中使用parameterType属性指定要插入的数据类型
  • Sql语句中使用#{实体属性名}方式引用实体中的属性值
  • 插入操作使用的API是sqlSession.insert(“命名空间.id”,实体对象);
  • 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit() 

4.2 MyBatis的修改数据操作

1. 编写UserMapper映射文件

<!--    修改操作-->
    <update id="update" parameterType="com.itheima.domain.User">
        update myUser set username=#{username},password=#{password} where id=#{id}
    </update>

2. 编写修改实体User的代码

//    修改操作
    @Test
    public void test3() throws IOException {
        //        模拟user对象
        User user=new User();
        user.setId(6);
        user.setUsername("lucy");
        user.setPassword("123");

//        获得核心配置文件
        InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
//        获得session工厂对象
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
//        获得session会话对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
//        执行操作 参数:namespace+id
        sqlSession.update("userMapper.update",user);

        //      mybatis执行更新操作 提交事务
        sqlSession.commit();

//        释放资源
        sqlSession.close();
    }

3. 修改操作注意问题

  •  修改语句使用update标签
  •  修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);

4.3 MyBatis的删除数据操作

1. 编写UserMapper映射文件

<!--    删除操作-->
    <delete id="delete" parameterType="java.lang.Integer">
        delete  from myUser where id=#{xx}
    </delete>

2. 编写删除数据的代码

  //    删除操作
    @Test
    public void test4() throws IOException {


//        获得核心配置文件
        InputStream resourceAsStream=Resources.getResourceAsStream("sqlMapConfig.xml");
//        获得session工厂对象
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
//        获得session会话对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
//        执行操作 参数:namespace+id
        sqlSession.delete("userMapper.delete",6);

        //      mybatis执行更新操作 提交事务
        sqlSession.commit();

//        释放资源
        sqlSession.close();
    }

3. 删除操作注意问题

  •  删除语句使用delete标签
  • Sql语句中使用#{任意字符串}方式引用传递的单个参数
  • 删除操作使用的API是sqlSession.delete(“命名空间.id”,Object);

5.MyBatis的核心配置文件概述

5.1 MyBatis核心配置文件层级关系

5.2 MyBatis常用配置解析

1. environments标签

数据库环境的配置,支持多环境配置

2. mapper标签

3. Properties标签

实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件

4. typeAliases标签

上面我们是自定义的别名,mybatis框架已经为我们设置好的一些常用的类型的别名

6.MyBatis的相应API

6.1 SqlSession工厂构建器SqlSessionFactoryBuilder

6.2 SqlSession工厂对象SqlSessionFactory

SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:

6.3 SqlSession会话对象

7.Mybatis的Dao层实现

7.1 传统开发方式

1. 编写UserDao接口

public interface UserMapper {
    public List<User> findAll() throws IOException;
}

2. 编写UserDaoImpl实现

public class UserMapperImpl implements UserMapper {
    @Override
    public List<User> findAll() throws IOException {
       InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
       SqlSession sqlSession= sqlSessionFactory.openSession();
      List<User> userList= sqlSession.selectList("userMapper.findAll");
        return userList;
    }
}

3. 测试传统方式

public class ServiceDemo {
    public static void main(String[] args) throws IOException {
        //创建dao层对象  当前dao层实现是手动编写的
        UserMapper userMapper=new UserMapperImpl();
       List<User> all= userMapper.findAll();
        System.out.println(all);
    }
}

7.2 代理开发方式

1. 代理开发方式介绍

2. 编写UserMapper接口

3. 测试代理方式

public class ServiceDemo {
    public static void main(String[] args) throws IOException {
      InputStream resourceAsStream= Resources.getResourceAsStream("sqlMapConfig.xml");
     SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession= sqlSessionFactory.openSession();
   UserMapper mapper= sqlSession.getMapper(UserMapper.class);
  List<User> users= mapper.findAll();
        System.out.println(users);
    }
}

7.3 知识小结

MyBatis的Dao层实现的两种方式:

  • 手动对Dao进行实现:传统开发方式
  • 代理方式对Dao进行实现:      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

8.MyBatis映射文件深入

 

9.MyBatis核心配置文件深入

 

10.MyBatis的多表操作

 

11.MyBatis的注解开发

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值