• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wjf冲冲冲

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Mybati学习随笔01

# Mybatis框架

Mybatis框架概述

​ mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

​ mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。

​ 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

JDBC操作数据库

在没有Mybatis框架前,我们通过JDBC与数据库打交道我们有以下步骤

  1. 下载相关数据库的驱动,把jar包添加入项目中

  2. 加载驱动

  3. 通过驱动管理类获取数据库链接

  4. 定义sql语句并加入preparedStatement

  5. 查询出结果集

  6. 释放资源

public static void main(String[] args){
     Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过驱动管理类获取数据库链接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","root", "root");
            //定义 sql 语句 ?表示占位符
            String sql = "select * from user where username = ?";
            //获取预处理 statement
            preparedStatement = connection.prepareStatement(sql);
            //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置参数值
            preparedStatement.setString(1, "王五");
            //向数据库发出 sql 执行查询,查询出结果集
            resultSet = preparedStatement.executeQuery();
            while(resultSet.next()){
                System.out.println(resultSet.getString("id")+"
                        "+resultSet.getString("username"));
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                //释放资源
                if (resultSet != null) {
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (preparedStatement != null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
} ahnvauzBU3+L

传统的JDBC直接操作数据库会有以下问题

​ 1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

​ 2.Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。

​ 3.使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护。

​ 4.对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记 录封装成 pojo 对象解析比较方便。

​ 使用Mybatis操作数据库就能轻松的完成查询数据库的目标

基于XML的Mybatis开发

  • 创建maven工程,并在pom.xml文件下导入坐标

        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.21</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.2</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
  • 编写学生类

    public class Student {
        private Integer id;
        private String name;
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
  • 编写持久层Dao

    public interface StudentDao {
        List<Student> findAll();
    }
    
  • 编写持久层接口的映射文件StudentDao.xml

    注意:

    这里创建的xml文件需要在resource下,并且文件目录结构要和java文件下dao的文件目录结构相同!!!

    <?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.wjf.dao.StudentDao">
    <!--    配置sql语句,和结果集-->
     <select id="findAll" resultType="com.wjf.domain.Student">
         select * from student;
     </select>
    </mapper>
    
    
  • 在resource下编写数据库映射配置文件

<?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="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <!--            填写数据库连接相关信息-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>          
                <property name="url" value="jdbc:mysql://localhost:3306/cnblog?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
        <mapper resource="com/wjf/dao/StudentDao.xml"/>
    </mappers>
</configuration>
  • 使用我们的dao接口查询

        @Test
        public void func() throws IOException {
            //1.读取配置文件
            InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //2.创建SqlSessionFactory工厂
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            //3.使用工厂生产SqlSession对象
            SqlSession sqlSession = factory.openSession();
            //4.使用SqlSession创建dao结果代理对象
            StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
            //5.执行方法
            List<Student> students = studentDao.findAll();
            for (Student student:students)
                System.out.println(student);
            sqlSession.close();
            in.close();
        }
    

    结果如下

    ​

    现在我们发现用Mybatis比直接使用JDBC更方便一些,但任然有些复杂。

    我们发现,在建立dao的映射xml文件的时候,需要严格依照原来dao的文件目录,并且在xml文件里边编写的东西有些繁杂。

    Mybatis支持更加便捷的注解开发,可以为你省去这些步骤

    基于注解的Mybatis开发

    • 我们只需要在原来的dao接口的方法上写上对应注解,并且写上sql语句即可

      public interface StudentDao {
          @Select("select * from student")
          List<Student> findAll();
      }
      
      
    • 同时在SqlMapConfig中稍作修改

      <?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="mysql">
              <environment id="mysql">
                  <transactionManager type="JDBC"/>
      <!--            填写数据库连接相关信息-->
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql://localhost:3306/cnblog?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                      <property name="username" value="root"/>
                      <property name="password" value="123"/>
                  </dataSource>
              </environment>
          </environments>
          <mappers>
              <!-- 修改部分-->
              <!-- 用注解来配置,此处应该使用class属性指定被注解的dao全限定类名 -->
              <mapper class="com.wjf.dao.StudentDao"/>
          </mappers>
      </configuration>
      
      

    这样既可完成mybatis的注解模式开发

posted on 2020-08-13 15:59  wjf冲冲冲  阅读(63)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3