首页 > 其他 > 详细

2.MyBatis入门学习

时间:2020-07-16 23:05:29      阅读:50      评论:0      收藏:0      [点我收藏+]

2.1Mybatis入门步骤方法一

搭建环境----->导入依赖-------->编写代码----------->测试

2.1.1创建数据库

第一步:由于是持久层做数据交互的所以需要用到数据库

  • 创建数据库

 CREATE TABLE `user` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) DEFAULT ‘‘,
  `email` VARCHAR(50) NOT NULL,
  `phone` VARCHAR(20) DEFAULT ‘‘,
  `gender` INT(2) ,
  `password` VARCHAR(100) NOT NULL DEFAULT ‘‘,
  `age` TINYINT DEFAULT NULL,
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
 ) ENGINE=INNODB DEFAULT CHARSET=utf8

 

2.1.2搭建项目 导入依赖

第二步:搭建项目 导入依赖

  • 为了学习方便我们一般直接创建一个父工程

  • 导入依赖(当然导入的都是最新的,版本不适合再改)

 <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.5.5</version>
 </dependency>
  <!--mysql数据库驱动-->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.20</version>
 </dependency>
 <!--junit测试-->
 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.13</version>
     <scope>test</scope>
 </dependency>
  • 创建一个子模块(这时候的依赖已经帮我们导入好了)

 

 

 

 

在编写核心配置文件之前应该先了解从 XML 中构建 SqlSessionFactory

  • 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

  • SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。

  • 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

  • 从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

 String resource = "org/mybatis/example/mybatis-config.xml";
 InputStream inputStream = Resources.getResourceAsStream(resource);
 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 

 

2.1.3编写mybatis核心配置文件

第三步:编写mybatis核心配置文件

  • XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)

  • 后面会再探讨 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>
   <!--environment 元素体中包含了事务管理和连接池的配置。-->
   <environments default="development">
     <environment id="development">
       <transactionManager type="JDBC"/>
       <dataSource type="POOLED">
         <property name="driver" value="${driver}"/>
         <property name="url" value="${url}"/>
         <property name="username" value="${username}"/>
         <property name="password" value="${password}"/>
       </dataSource>
     </environment>
   </environments>
   <!-- mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。-->
   <mappers>
     <mapper resource="com/xuan/mapper/UserMapper.xml"/>
   </mappers>
 </configuration>
 <?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>
     <!--environment 元素体中包含了事务管理和连接池的配置。-->
     <!--开发环境可以是多套的-->
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                 <!--useSSL是协议 后面两个是设置字符集UTF-8 最后是设置时区(mysql8以上都需要)-->
                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                 <property name="username" value="root"/>
                 <property name="password" value="root"/>
             </dataSource>
         </environment>
     </environments>
     <!-- mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。-->
     <mappers>
         <mapper resource="com/xuan/mapper/UserMapper.xml"/>
     </mappers>
 </configuration>

 

2.1.4编写工具类获取SqlSession对象

第四步:编写工具类获取SqlSession对象(结合前面的SqlSessionFactory的构建)

 package com.xuan.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 MyBatisUtil {
 ?
     //提升作用域
     private static SqlSessionFactory sessionFactory;
     private static  InputStream inputStream;
 ?
     //通过静态代码块加载SQLSessionFactory对象
     static {
 ?
         try {
             String resource="mybatis-config.xml";
             inputStream = Resources.getResourceAsStream(resource);
             sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
             e.printStackTrace();
        }
    }
 ?
     //通过SqlSessionFactory的openSession方法创建SqlSession对象
     public static SqlSession getSqlSession(){
         return sessionFactory.openSession();
    }
 }

这里探究一下为什么要获取SqlSession对象

  • 因为SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。

也就是说你selectOne固然能返回所需数据但是需要强转而getMapper方法就只需要传入字节码文件不用担心可能出错的字符串字面值以及强制类型转换。

 //诚然,这种方式能够正常工作,对使用旧版本 MyBatis 的用户来说也比较熟悉。但现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
 ?
 package org.apache.ibatis.session;
 ?
 import java.io.Closeable;
 import java.sql.Connection;
 import java.util.List;
 import java.util.Map;
 import org.apache.ibatis.cursor.Cursor;
 import org.apache.ibatis.executor.BatchResult;
 ?
 public interface SqlSession extends Closeable {
 ?
   <T> T selectOne(String statement);
 ?
   <T> T selectOne(String statement, Object parameter);
 ?
   <E> List<E> selectList(String statement);
 ?
   <E> List<E> selectList(String statement, Object parameter);
 ?
   <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
 ?
   <K, V> Map<K, V> selectMap(String statement, String mapKey);
 ?
   <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
 ?
   <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
 ?
   <T> Cursor<T> selectCursor(String statement);
 ?
   <T> Cursor<T> selectCursor(String statement, Object parameter);
 ?
   <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
 ?
   void select(String statement, Object parameter, ResultHandler handler);
 ?
   void select(String statement, ResultHandler handler);
 ?
   void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
 ?
   int insert(String statement);
 ?
   int insert(String statement, Object parameter);
 ?
   int update(String statement);
 ?
   int update(String statement, Object parameter);
 ?
   int delete(String statement);
 ?
   int delete(String statement, Object parameter);
 ?
   void commit();
 ?
   void commit(boolean force);
 ?
   void rollback();
 ?
   void rollback(boolean force);
 ?
   List<BatchResult> flushStatements();
 ?
   @Override
   void close();
 ?
   void clearCache();
 ?
   Configuration getConfiguration();
 ?
   <T> T getMapper(Class<T> type);
 ?
   Connection getConnection();
 }

 

 

2.1.5编写代码(实体类,dao接口)

第五步:编写代码

  • 编写实体类

  •  package com.xuan.pojo;
     ?
     import java.io.Serializable;
     import java.util.Date;
     ?
     /**
      * xuan
      * 2020/7/12
      * 1870136088@qq.com
      **/
     public class User implements Serializable {
     ?
         private Integer id;
         private String name;
         private String email;
         private String phone;
         private Integer gender;
         private String password;
         private Integer age;
         private Date createTime;
         private Date updateTime;
     ?
     ?
         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 String getPhone() {
             return phone;
        }
     ?
         public void setPhone(String phone) {
             this.phone = phone;
        }
     ?
         public Integer getGender() {
             return gender;
        }
     ?
         public void setGender(Integer gender) {
             this.gender = gender;
        }
     ?
         public String getPassword() {
             return password;
        }
     ?
         public void setPassword(String password) {
             this.password = password;
        }
     ?
         public Integer getAge() {
             return age;
        }
     ?
         public void setAge(Integer age) {
             this.age = age;
        }
     ?
         public Date getCreateTime() {
             return createTime;
        }
     ?
         public void setCreateTime(Date createTime) {
             this.createTime = createTime;
        }
     ?
         public Date getUpdateTime() {
             return updateTime;
        }
     ?
         public void setUpdateTime(Date updateTime) {
             this.updateTime = updateTime;
        }
     ?
         @Override
         public String toString() {
             return "User{" +
                     "id=" + id +
                     ", name=‘" + name + ‘\‘‘ +
                     ", email=‘" + email + ‘\‘‘ +
                     ", phone=‘" + phone + ‘\‘‘ +
                     ", gender=" + gender +
                     ", password=‘" + password + ‘\‘‘ +
                     ", age=" + age +
                     ", createTime=" + createTime +
                     ", updateTime=" + updateTime +
                     ‘}‘;
        }
     }

     

  • 编写dao接口

 package com.xuan.mapper;
 ?
 import com.xuan.pojo.User;
 import java.util.List;
 ?
 public interface UserMapper {
 ?
     List<User> fingAll() throws Exception;
 ?
 ?
     User findById(Integer id) throws Exception;
 }

 

 

2.1.6编写mapper.xml 配置文件

  • 编写mapper.xml 这东西放在resources目录下 最好与编写的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">
 <!--namespace命名空间-->
 <mapper namespace="com.xuan.mapper.UserMapper">
     
     <select id="findAll" resultType="com.xuan.pojo.User">
    select * from User
   </select>
 </mapper>
  • 命名空间namespace两个作用:

    • 一个是利用更长的全限定名来将不同的语句隔离开来,同时也实现了你上面见到的接口绑定。就算你觉得暂时用不到接口绑定,你也应该遵循这里的规定,以防哪天你改变了主意。

    • 长远来看,只要将命名空间置于合适的 Java 包命名空间之中,你的代码会变得更加整洁,也有利于你更方便地使用 MyBatis。

 

 

2.1.7编写测试

第七步:编写测试

 package com.xuan.mapper;
 ?
 import com.xuan.pojo.User;
 import com.xuan.utils.MyBatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ?
 import java.util.List;
 ?
 /**
  * xuan
  * 2020/7/12
  * 1870136088@qq.com
  **/
 ?
 public class UserMapperTest {
     private SqlSession session;
 ?
     @Test
     public void testFindAll() throws Exception {
         //获取SqlSession对象
         SqlSession session = MyBatisUtil.getSqlSession();
         
         //调用SqlSession的getMapper方法 传入接口字节码文件返回我们的UserMapper对象
         UserMapper mapper = session.getMapper(UserMapper.class);
         
         //遍历集合
         List<User> users = mapper.fingAll();
         for (User user : users) {
             System.out.println(user);
        }
 ?
         //释放资源
         session.close();
    }
 }

 

2.2Mybati入门步骤方法二

这个主要区别就是不需要去写工具类直接在配置文件搞定 其本质都是一样都是为了获取SqlSession对象

  • 1.创建数据库(同上)

  • 2.搭建项目,导入依赖(同上)

  • 3.编写mybatis核心配置文件(同上)

  • 4.编写代码(实体类、dao接口)(同上)

  • 5.编写mapper.xml文件(同上)

  • 6.编写测试

 package com.xuan.mapper;
 ?
 import com.xuan.pojo.User;
 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.Test;
 ?
 import java.io.InputStream;
 import java.util.List;
 ?
 /**
  * xuan
  * 2020/7/12
  * 1870136088@qq.com
  **/
 public class UserMapperTest2 {
 ?
     @Test
     public  void testFindAll() throws Exception {
 ?
         //1.加载配置文件
         InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
 ?
         //2.获取SqlSessionFactory工厂对象
         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 ?
         //3.获取SqlSession对象用来创建执行sql语句的对象
         SqlSession session = sqlSessionFactory.openSession();
 ?
         //4.通过SqlSession创建执行sql语句的对象
         UserMapper mapper = session.getMapper(UserMapper.class);
 ?
         //5.执行mapper接口中方法
         List<User> users = mapper.findAll();
 ?
         //6.遍历users
         for (User user : users) {
             System.out.println(user);
        }
         //7.释放资源
         session.close();
         inputStream.close();
 ?
    }
 ?
 }

 

 

 

2.MyBatis入门学习

原文:https://www.cnblogs.com/xuan-study/p/13325168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!