MyBatis基础学习(1)—配置文件及测试

MyBatis基础学习



提示:以下是本篇文章正文内容,下面案例可供参考

Mybatis

戳这!!!
中文版官方文档

1、基本概念

  1. mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架),可以把数据库表中的一行数据 映射为 一个java对象。一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
  2. mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,使用mybatis让开发人员集中写sql就可以了,不必关心Connection,Statement,ResultSet的创建,销毁,sql的执行。
  3. 开发人员提供sql语句–>mybatis处理sql—>开发人员得到List集合或java对象(表中的数据)

2、主要类介绍

  1. Resources: mybatis中的一个类, 负责读取主配置文件

    import org.apache.ibatis.io.Resources;
    
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    
  2. SqlSessionFactoryBuilder : 创建SqlSessionFactory对象

    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.apache.ibatis.session.SqlSessionFactory;
    
    SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
    //创建SqlSessionFactory对象
    SqlSessionFactory factory = builder.build(in);
    
  3. SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。在整个项目中,有一个就够用了。

    SqlSessionFactory:接口,接口实现类: DefaultSqlSessionFactorySqlSessionManager
    SqlSessionFactory作用: 获取SqlSession对象
    	SqlSession sqlSession = factory.openSession();
    
    openSession()方法说明:
    	 openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
    	 openSession(boolean): openSession(true)  获取自动提交事务的SqlSession. 
    	 openSession(false)  非自动提交事务的SqlSession对象
    
  4. SqlSession

    SqlSession接口 :定义了操作数据的方法,例如:
    	 selectOne(),selectList(),selectMap(),insert(),update(), delete(), commit(), rollback()
    SqlSession接口的实现类: DefaultSqlSession,SqlSessionManager
    

3、mybatis使用步骤

mybatis使用步骤:
(1)定义dao接口 ,StudentDao
(2)定义mapper文件 StudentDao.xml
(3)定义mybatis的主配置文件 mybatis-config.xml
(4)创建dao的代理对象,使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口),获取dao接口对于的实现类对象, StudentDao dao = SqlSession.getMapper(StudentDao.class);
(5) 调用方法:List students = dao.selectStudents();

要使用dao对象,需要使用getMapper()方法,
怎么能使用getMapper()方法,需要哪些条件
(1)获取SqlSession对象, 需要使用SqlSessionFactory的openSession()方法。
(2)创建SqlSessionFactory对象。 通过读取mybatis的主配置文件,能创建SqlSessionFactory对象

4、测试

结构:
在这里插入图片描述

导入相关依赖

 <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
 </properties>

 <dependencies>
      <dependency>
      <!--单元测试-->
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
      </dependency>
      <!--mybatis依赖-->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.7</version>
      </dependency>
      <!--mysql依赖-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.17</version>
      </dependency>
  </dependencies>

<build>
     <!-- 将配置文件在部署编译时,自动放到类路径下,即classes路径下   -->
     <resources>
         <resource>
             <directory>src/main/java</directory><!--所在的目录-->
             <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                 <include>**/*.properties</include>
                 <include>**/*.xml</include>
             </includes>
             <filtering>false</filtering>
         </resource>

         <resource>
             <directory>src/main/resources</directory><!--所在的目录-->
             <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                 <include>**/*.properties</include>
                 <include>**/*.xml</include>
             </includes>
             <filtering>false</filtering>
         </resource>

     </resources>
 </build>
  1. 创建student表,表结构如下,id 设为主键,不自动增长
    在这里插入图片描述
  2. 创建与表 student 对应的实体类 Student
    public class Student {
    
        private Integer id;
        private String name;
        private String email;
        private Integer age;
    
        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;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  3. 定义dao接口 ,StudentDao
    import java.util.List;
    
    public interface StudentDao {
    
    	// 查询所有学生信息
        List<Student> selectStudents();
    
    	// 插入一条学生信息
        int insertStudent(Student student);
    }	
    
  4. 定义mapper文件 StudentDao.xml,如果使用IDEA必须放在 resources 目录下
    <?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:必须有值,自定义的唯一字符串
     推荐使用:dao 接口的全限定名称
    -->
    <mapper namespace="com.example.dao.StudentDao">
        <!--
         <select>: 查询数据, 标签中必须是 select 语句
         id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称,
         使用名称表示要执行的 sql 语句
         resultType: 查询语句的返回结果数据类型,使用全限定类名
         
    	 1. id="selectStudents" 中 id 的赋值,是上面接口对应的方法名称 
    	 2. id,name,email,age 名字和实体类 Student 定义的属性保持一致
     -->
     	<!-- resultType 这里填写你的返回值类型,一般是一个java对象 -->
        <!--    com.example.domain.Student-->
        <select id="selectStudents" resultType="com.example.domain.Student">
            <!--要执行的 sql 语句-->
            select id,name,email,age from student order by id
        </select>
    
        <!-- 插入数据 -->
        <insert id="insertStudent" >
            insert into student values(#{id},#{name},#{email},#{age})
        </insert>
    
    	<!--  更新数据 -->
        <update id="updateStudent">
            update student set age = 18 where id=#{id}
        </update>
    	
    	<!--  删除数据 -->
        <delete id="deleteStudent">
            delete from student where id=#{id}
        </delete>
    </mapper>
    
  5. 定义mybatis的主配置文件 mybatis-config.xml
    在此之前可以把连接mysql 数据库的四个属性及属性值封装到一个文件中,命名为:db.properties
    # 数据库连接的4个基本要素
    jdbc.user=root
    jdbc.password=123456
    # mysql 5
    #driverClass=com.mysql.jdbc.Driver
    # mysql 8
    # 可以设置字符集
    jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=utf8
    jdbc.driverClass=com.mysql.cj.jdbc.Driver
    
    主配置文件 mybatis-config.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>
     	<!-- 指定连接 mysql 数据库的信息	-->
         <properties resource="db.properties"/>
     
         <!--	配置日志功能
             mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数
             必须在 标签 environments前
         -->
         <settings>
             <setting name="logImpl" value="STDOUT_LOGGING"/>
         </settings>
     
         <!-- 定义别名   -->
         <typeAliases>
             <!--		这个包下的所有类,类名就是别名,不区分大小写
                     可以有多个package,此方式比较多
                     -->
             		<package name="com.example.domain"/>
             		<package name="com.example.vo"/>
     
             <!--		第一种方式-->
     <!--        <typeAlias type="com.example.domain.Student" alias="Student"/>-->
         </typeAliases>
     
         <environments default="development">
             <!--	environments default="development" 取别名,自定义-->
             <environment id="development">
                 <!--
                   transactionManager:mybatis提交事务,回顾事务的方式
                      type: 事务的处理的类型
                          1)JDBC : 表示mybatis底层是调用JDBC中的Connection对象的,commit, rollback
                          2)MANAGED : 把mybatis的事务处理委托给其它的容器(一个服务器软件,一个框架(spring))
                 -->
                 <transactionManager type="JDBC"/>
                 <!--
                    dataSource:表示数据源,java体系中,规定实现了javax.sql.DataSource接口的都是数据源。
                               数据源表示Connection对象的。
                               在项目中一般使用阿里提供的 druid 作为 dataSource
     
                    type:指定数据源的类型
                       1)POOLED: 使用连接池, mybatis会创建PooledDataSource类
                       2)UPOOLED: 不使用连接池, 在每次执行sql语句,先创建连接,执行sql,在关闭连接
                                   mybatis会创建一个UnPooledDataSource,管理Connection对象的使用
                       3)JNDI:java命名和目录服务(windows注册表)
                 -->
                 <!--	type="POOLED" 表示使用连接池		-->
                 <dataSource type="POOLED">
                     <property name="driver" value="${jdbc.driverClass}"/>
                     <property name="url" value="${jdbc.url}"/>
                     <property name="username" value="${jdbc.user}"/>
                     <property name="password" value="${jdbc.password}"/>
                 </dataSource>
             </environment>
         </environments>
         
     	<!-- sql mapper(sql映射文件)的位置-->
         <mappers>
             <!--第一种方式:指定多个mapper文件-->
             <!--<mapper resource="com/example/dao/StudentDao.xml"/>
             <mapper resource="com/example/dao/OrderDao.xml" />-->
     
             <!--第二种方式: 使用包名
                 name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
                 使用package的要求:
                  1. mapper文件名称需要和接口名称一样, 区分大小写的一样
                  2. mapper文件和dao接口需要在同一目录
             -->
             <package name="com.example.dao"/>
            <!-- <package name="com.example.dao2"/>
             <package name="com.example.dao3"/>-->
         </mappers>
     	</configuration>
    
  6. 创建工具类,获取 SqlSession 对象
    package com.example.utils;
    
    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 java.io.IOException;
    import java.io.InputStream;
    
    public class MyBatisUtils {
    
        private  static  SqlSessionFactory factory = null;
        static {
        	// 从类路径开始读
            String config="mybatis-config.xml"; // 需要和你的项目中的文件名一样
            try {
            	// 读取主配置文件
                InputStream in = Resources.getResourceAsStream(config);
                //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
                factory = new SqlSessionFactoryBuilder().build(in);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //获取SqlSession的方法
        public static SqlSession getSqlSession() {
            SqlSession sqlSession  = null;
            if( factory != null){
            	// 获取SqlSession 
                sqlSession = factory.openSession();// 非自动提交事务
                //            factory.openSession(true); // 自动提交事务,默认为 false
            }
            return sqlSession;
        }
    }
    
    
  7. 测试类
    package com.example;
    
    import com.example.dao.StudentDao;
    import com.example.domain.Student;
    import com.example.utils.MyBatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    public class TestMyBatis {
    
        @Test
        public void testSelectStudents(){
            /**
             * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)
             * getMapper能获取dao接口对于的实现类对象。
             */
            // 获取SqlSession 
            SqlSession sqlSession = MyBatisUtils.getSqlSession();
            StudentDao dao  =  sqlSession.getMapper(StudentDao.class);
    
            //dao=com.sun.proxy.$Proxy5 jdk的动态代理
            System.out.println("dao="+dao.getClass().getName());
            //调用dao的方法, 执行数据库的操作
            List<Student> students = dao.selectStudents();
            for(Student stu: students){
                System.out.println("学生="+stu);
            }
        }
    
        @Test
        public void testInsertStudent(){
            SqlSession sqlSession  = MyBatisUtils.getSqlSession();
            StudentDao dao  =  sqlSession.getMapper(StudentDao.class);
            Student student = new Student();
            student.setId(1006);
            student.setName("赵四");
            student.setEmail("zhaosi@qq.com");
            student.setAge(28);
            int nums = dao.insertStudent(student);
            sqlSession.commit(); // 如果不手动提交,则不会修改数据库的内容
            System.out.println("添加对象的数量:"+nums);
        }
    
    }
    
    
    结果:
    查询在这里插入图片描述
    插入,但不提交事务,把测试代码 sqlSession.commit(); 注释掉
    在这里插入图片描述
    插入,并且提交事务
    在这里插入图片描述

最后,可能会有小部分同学,明明导包了,并且配置文件也放到指定目录了,但报错还是找不到,解决方法:

  1. 重新加载pom.xml文件
    在这里插入图片描述
  2. 重新编译构建项目
    在右边导航边找到 Maven ,点到自己的项目,先clean,此时左边项目中的 target 会删除,在点击compile,重新编译,会再出现target目录
    在这里插入图片描述
    在这里插入图片描述

总结

谢谢大家的阅读,欢迎指出错误~~
如果觉得博主写的过的去,不如点个赞,嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值