【编程不良人】MyBatis从入门到精通学习笔记01---IDEA使用Maven项目搭建MyBatis操作环境

配套视频:【编程不良人】Mybatis 从入门到精通_哔哩哔哩_bilibili

参考链接:从前慢-Mybatis_unique_perfect的博客-CSDN博客

1.引言

       Mybatis是一个基于java语言的持久层的框架,主要用来简化数据库的访问操作,内部封装了原来的jdbc代码,替换了原有项目开发中的jdbc技术,它可以自动完成对象与关系的映射(ORM),极大地简化了我们的开发,提高了开发效率。

MyBatis官方网址:mybatis – MyBatis 3 | Introduction

MyBatis中文网: MyBatis中文网

2.JDBC存在的问题

1) 大量的代码冗余 (处理结果集的时候存在大量的代码冗余)

2) 不能完成数据库和实体的自动转换 (需要手动封装实体,不能自动封装实体类)

实体与数据库之间的转换需要通过setXxx或者构造方法完成

3.Mybatis框架的开发思路

需要2个配置文件:

  • mybatis-config.xml:存储数据库连接相关参数,获取连接对象

  • mapper映射文件:因为映射文件中的id代表方法名,是识别方法的唯一标识,所以注意DAO中的方法名不能相同,不能重载。

4.使用IDEA中的Maven进行MyBatis环境搭建

配套视频:【编程不良人】Mybatis 从入门到精通_哔哩哔哩_bilibili

(视频中为利用Eclipse进行Mybatis环境搭建,此处参考下面链接使用IDEA进行Mybatis环境搭建)

参考链接:

项目整体结构如下:

1.新建Maven-archetype-webapp项目,命名为mybatis01

2.src---main路径下新建java、resources文件夹

3.pom.xml导入相关依赖,刷新Maven

  <?xml version="1.0" encoding="UTF-8"?>
  ​
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
  ​
    <groupId>org.example</groupId>
    <artifactId>mybatis01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
  ​
    <name>mybatis01 Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>
  ​
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.7</maven.compiler.source>
      <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
  ​
    <dependencies>
      <!--mybatis核心包-->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
      </dependency>
      
      <!--mysql驱动包-->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
      </dependency>
      
      <!--junit测试包-->
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  ​
    <build>
      <finalName>mybatis01</finalName>
      <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
        <plugins>
          <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.1.0</version>
          </plugin>
          <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
          <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
          </plugin>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
          </plugin>
          <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
          </plugin>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
          </plugin>
          <plugin>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
          </plugin>
          <plugin>
            <artifactId>maven-deploy-plugin</artifactId>
            <version>2.8.2</version>
          </plugin>
        </plugins>
      </pluginManagement>
    </build>
  </project>
  ​

4.利用SQLyog创建数据库(mybatis)、表(user)、新增数据

5.在IDEA java路径下新建entity包、service包

(1)entity包下新建与表user对应的实体类User,并添加get、set、toString方法

  
  package entity;
  ​
  /**
   * @ClassName User
   * @Description 用户实体类,对应mybatis数据库中的user表
   * @Author Jiangnan Cui
   * @Date 2022/4/5 10:42
   * @Version 1.0
   */
  public class User {
      private int uid;
      private String uname;
      private int uage;
  ​
      public int getUid() {
          return uid;
      }
  ​
      public void setUid(int uid) {
          this.uid = uid;
      }
  ​
      public String getUname() {
          return uname;
      }
  ​
      public void setUname(String uname) {
          this.uname = uname;
      }
  ​
      public int getUage() {
          return uage;
      }
  ​
      public void setUage(int uage) {
          this.uage = uage;
      }
  ​
      @Override
      public String toString() {
          return "User{" +
                  "uid=" + uid +
                  ", uname='" + uname + '\'' +
                  ", uage=" + uage +
                  '}';
      }
  }
  ​

(2)在service包下新建接口UserService,编写findById方法,不用编写对应的实现类

  
  package service;
  ​
  import entity.User;
  ​
  /**
   * @ClassName UserService
   * @Description TODO
   * @Author Jiangnan Cui
   * @Date 2022/4/5 11:56
   * @Version 1.0
   */
  public interface UserService {
      User findById(int id);
  }
  ​

6.在resources路径下新建mapper文件夹,添加mapper映射文件UserMapper.xml

  <?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为映射的根节点,用来管理DAO接口
      namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)
      mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象
   -->
  <mapper namespace="entity.User">
      <!--
          id = "接口中的方法名"
          parameterType = "接口中传入方法的参数类型"
          resultType = "返回实体类对象:包.类名"  处理结果集 自动封装
          注意:sql语句后不要出现";"号
              查询:select标签
              增加:insert标签
              修改:update标签
              删除:delete标签
      -->
      <select id="findById" parameterType="int" resultType="entity.User">
          select * from user where uid = #{id}
      </select>
  </mapper>

7.在resources路径下新建mybatis配置文件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" >
  <!--配置mybatis环境-->
  <configuration>
      <!--配置连接使用的相关参数
          default为默认使用的环境:development 测试环境
                                product     生产环境
      -->
      <environments default="development">
          <!--测试环境-->
          <environment id="development">
              <!--事务管理类型:指定事务管理的方式 JDBC-->
              <transactionManager type="JDBC"/>
              <!--数据库连接相关配置,动态获取config.properties文件里的内容-->
              <!--数据源类型:POOLED 表示支持JDBC数据源连接池
                            UNPOOLED 表示不支持数据源连接池
                            JNDI 表示支持外部数据源连接池
              -->
              <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                  <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC&amp;useSSL=false"/>
                  <property name="username" value="root"/>
                  <property name="password" value="123456"/>
              </dataSource>
          </environment>
      </environments>
  ​
      <!--注册mapper配置文件(mapper文件路径配置)
          注意:映射配置文件位置要和映射器位置一样,如:映射器在com.mycode.dao里,
                那么配置文件就应该在resources的com/mycode/dao目录下,否则会报
                Could not find resource com.mycode.dao.UserMapper.xml类似错误
      -->
      <mappers>
          <mapper resource="mapper/UserMapper.xml"/>
      </mappers>
      
  </configuration>

8.测试Mybatis环境是否搭建成功,在java路径下新建test包,包中编写单元测试类TestMyBatis

  
  package test;
  ​
  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;
  import java.io.Reader;
  import java.sql.SQLException;
  ​
  /**
   * @ClassName TestMyBatis
   * @Description 测试MyBatis环境是否搭建成功
   * @Author Jiangnan Cui
   * @Date 2022/4/5 17:45
   * @Version 1.0
   */
  public class TestMyBatis {
      public static void main(String[] args) {
          //MyBatis读取配置文件的方式
          //InputStream is = TestMyBatis.class.getResourceAsStream("mybatis-config.xml");
          Reader reader = null;
          try {
              reader = Resources.getResourceAsReader("mybatis-config.xml");
          } catch (IOException e) {
              e.printStackTrace();
          }
          //创建SQLSessionFactory对象实例
          SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
          //获取Session, session中包含connection
          SqlSession session = sessionFactory.openSession();
          System.out.println(session);
          try {
              //一般不从session中获取connection
              session.getConnection().commit();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
  }
  ​

输出结果不报错,表示环境搭建成功:

  
  org.apache.ibatis.session.defaults.DefaultSqlSession@6e3c1e69
  Tue Apr 05 18:04:27 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
  ​

9.test中编写单元测试类UserTest

  package test;
  ​
  import entity.User;
  import org.apache.ibatis.io.Resources;
  import org.apache.ibatis.session.*;
  import org.junit.Test;
  ​
  import java.io.IOException;
  import java.io.Reader;
  import java.sql.Connection;
  ​
  /**
   * @ClassName UserTest
   * @Description 单元测试
   * @Author Jiangnan Cui
   * @Date 2022/4/5 11:58
   * @Version 1.0
   */
  public class UserTest {
      @Test
      public void userFindByIdTest() {
          //配置文件名称
          String resources = "mybatis-config.xml";
          //创建流
          Reader reader = null;
          try {
              //使用MyBatis提供的Resources类加载mybatis的配置文件到reader对象中
              reader= Resources.getResourceAsReader(resources);
          } catch (IOException e) {
              e.printStackTrace();
          }
          //初始化mybatis,创建sqlSessionFactory类的实例
          SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
          //创建session实例
          SqlSession session= sessionFactory.openSession();
          //传入参数查询,返回结果
          User user = session.selectOne("findById",1);
          System.out.println(user);
          //关闭session
          session.close();
      }
  }
  ​

测试结果如下:

  
  Tue Apr 05 13:35:42 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
  User{uid=1, uname='zhangsan', uage=20}

5. 代码结构调整

5.1 建表

 -- 新建表
 DROP TABLE IF EXISTS `t_user`;
 CREATE TABLE `t_user` (
   `id` int(11) NOT NULL auto_increment COMMENT '用户ID',
   `name` varchar(32) NOT NULL COMMENT '用户名',
   `birthday` datetime default NULL COMMENT '生日',
   `sex` char(1) default NULL COMMENT '性别',
   `address` varchar(256) default NULL COMMENT '地址',
   PRIMARY KEY(`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 ​
 ​
 -- 插入数据
 insert  into `t_user`(`id`,`name`,`birthday`,`sex`,`address`) values
  (1,'老王','2018-02-27 17:47:08','男','北京'),
  (2,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),
  (3,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),
  (4,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'),
  (5,'老王','2018-03-07 17:37:26','男','北京'),
  (6,'小马宝莉','2018-03-08 11:44:00','女','北京修正');

5.2 新建maven项目并在pom.xml中引入依赖

  • pom.xml

 <!--mybatis-->
 <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.4.1</version>
 </dependency>
 ​
 <!--mysql驱动-->
 <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.38</version>
 </dependency>
 ​
 <!--junit测试包-->
 <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
   <scope>test</scope>
 </dependency>
 ​
 <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>compile</scope>
 </dependency>

刷新Maven!

5.3 开发实体类(entity)

  • User.java

 package com.study.entity;
 ​
 import java.io.Serializable;
 import java.util.Date;
 ​
 /**
  * @ClassName User
  * @Description 用户实体类,对应mybatis数据库中表t_user
  * @Author Jiangnan Cui
  * @Date 2022/8/13 17:39
  * @Version 1.0
  */
 public class User implements Serializable {
     private Integer id;
     private String name;
     private Date birthday;
     private Character sex;
     private String address;
 ​
     public User() {
     }
 ​
     public User(Integer id, String name, Date birthday, Character sex, String address) {
         this.id = id;
         this.name = name;
         this.birthday = birthday;
         this.sex = sex;
         this.address = address;
     }
 ​
     public Integer getId() {
         return id;
     }
 ​
     public void setId(Integer id) {
         this.id = id;
     }
 ​
     public String getName() {
         return name;
     }
 ​
     public void setUsername(String name) {
         this.name = name;
     }
 ​
     public Date getBirthday() {
         return birthday;
     }
 ​
     public void setBirthday(Date birthday) {
         this.birthday = birthday;
     }
 ​
     public Character getSex() {
         return sex;
     }
 ​
     public void setSex(Character sex) {
         this.sex = sex;
     }
 ​
     public String getAddress() {
         return address;
     }
 ​
     public void setAddress(String address) {
         this.address = address;
     }
 ​
     @Override
     public String toString() {
         return "User{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
                 ", birthday=" + birthday +
                 ", sex=" + sex +
                 ", address='" + address + '\'' +
                 '}';
     }
 }

5.4 开发持久层(Dao)

  • IUserDao.java

 package com.study.dao;
 ​
 import com.study.entity.User;
 ​
 import java.util.List;
 ​
 /**
  * @ClassName IUserDao
  * @Description 用户持久层接口UserDao
  * @Author Jiangnan Cui
  * @Date 2022/8/13 17:43
  * @Version 1.0
  */
 public interface IUserDao {
     /**
      * @MethodName findAll
      * @Description 查询所有用户
      * @return: java.util.List<com.study.entity.User>
      * @Author Jiangnan Cui
      * @Date 17:44 2022/8/13
      */
     List<User> findAll();
 }
 ​

5.5 开发mapper映射文件

  • IUserDaoMapper.xml

 <?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.study.dao.IUserDao">
   <!--findAll-->
   <select id="findAll" resultType="com.study.entity.User">
     select
         id,name,birthday,sex,address
     from t_user
   </select>
 </mapper>

5.6 开发mybatis主配置文件

  • 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" >
 ​
 <!--mybatis的主配置文件-->
 <configuration>
     <!--配置环境
             development 测试环境(默认)
             product     生产环境
     -->
     <environments default="development">
         <!--测试环境-->
         <environment id="development">
             <!--事务管理类型:指定事务管理的方式 JDBC-->
             <transactionManager type="JDBC"/>
             <!--数据库连接相关配置,动态获取config.properties文件里的内容-->
             <!--数据源类型:POOLED 表示支持JDBC数据源连接池
                           UNPOOLED 表示不支持数据源连接池
                           JNDI 表示支持外部数据源连接池
             -->
             <dataSource type="POOLED">
                 <!-- 配置连接数据库的基本信息:
                      此处使用的是MySQL数据库,使用Oracle数据库时需要修改,仔细检查各项参数是否正确,里面配置了时区、编码方式、SSL,用以防止中文查询乱码,导致查询结果为null及SSL警告等问题-->
                 <property name="driver" value="com.mysql.jdbc.Driver"/>
                 <property name="url"
                           value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC&amp;useSSL=false"/>
                 <property name="username" value="root"/>
                 <property name="password" value="root"/>
             </dataSource>
         </environment>
     </environments>
 ​
     <!--指定映射文件的位置:即注册mapper配置文件(mapper文件路径配置)
         注意:映射配置文件位置要和映射器位置一样,如:映射器在com.mycode.dao里,
              那么配置文件就应该在resources的com/mycode/dao目录下,否则会报
              Could not find resource com.mycode.dao.UserMapper.xml类似错误
     -->
     <mappers>
         <!--下面编写mapper映射文件↓↓↓↓↓ 参考格式:<mapper resource="dao/UserMapper.xml"/> -->
         <mapper resource="com/study/mapper/IUserDaoMapper.xml"/>
     </mappers>
 </configuration> 
 ​

5.7 开发测试类

  • IUserDaoTest.java

 package com.study.test;
 ​
 import com.study.dao.IUserDao;
 import com.study.entity.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.IOException;
 import java.io.InputStream;
 import java.util.List;
 ​
 /**
  * @ClassName IUserDaoTest
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2022/8/13 17:58
  * @Version 1.0
  */
 public class IUserDaoTest {
     /**
      * @MethodName findAllTest
      * @Description 测试查询所有
      * @Author Jiangnan Cui
      * @Date 18:05 2022/8/13
      */
     @Test
     public void findAllTest() throws IOException {
         //1.读取mybatis主配置文件
         InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
         //2.创建SqlSessionFactory工厂
         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
         SqlSessionFactory factory = builder.build(is);
         //3.使用工厂生产SqlSession对象
         SqlSession sqlSession = factory.openSession();
         //4.使用SqlSession创建Dao接口的代理对象
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         //5.使用代理对象执行方法
         List<User> userList = userDao.findAll();
         for (User user : userList) {
             System.out.println("user = " + user);
         }
         //释放资源
         sqlSession.close();
         is.close();
     }
 }
 ​

测试结果:

 user = User{id=1, name='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex=男, address='北京'}
 user = User{id=2, name='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex=女, address='北京金燕龙'}
 user = User{id=43, name='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex=女, address='北京金燕龙'}
 user = User{id=45, name='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex=男, address='北京金燕龙'}
 user = User{id=46, name='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex=男, address='北京'}
 user = User{id=48, name='小马宝莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex=女, address='北京修正'}

5.8 最终项目结构

5.9 测试增删改基本操作

具体增删改细节参见:【编程不良人】MyBatis从入门到精通学习笔记02-Mybatis中增删改查使用_Coder_Cui的博客-CSDN博客

  • IUserDao.java

 package com.study.dao;
 ​
 import com.study.entity.User;
 import org.apache.ibatis.annotations.Param;
 ​
 import java.util.List;
 ​
 /**
  * @ClassName IUserDao
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2022/8/13 20:16
  * @Version 1.0
  */
 public interface IUserDao {
     /**
      * @MethodName findAll
      * @Description 查询所有
      * @return: java.util.List<com.study.entity.User>
      * @Author Jiangnan Cui
      * @Date 20:31 2022/8/13
      */
     List<User> findAll();
 ​
     /**
      * @MethodName findById
      * @Description 根据Id查询
      * @param: id
      * @return: com.study.entity.User
      * @Author Jiangnan Cui
      * @Date 20:32 2022/8/13
      */
     User findById(Integer id);
 ​
     /**
      * @MethodName findByIdAndName
      * @Description 多参数查询
      * @param: id
      * @param: name
      * @return: com.study.entity.User
      * @Author Jiangnan Cui
      * @Date 20:37 2022/8/13
      */
     User findByIdAndName(@Param("id") Integer id,@Param("name")String name);
 ​
     /**
      * @MethodName add
      * @Description 新增用户
      * @param: user
      * @return: java.lang.Integer
      * @Author Jiangnan Cui
      * @Date 20:45 2022/8/13
      */
     Integer add(User user);
 ​
     /**
      * @MethodName deleteById
      * @Description 根据id删除用户
      * @param: id
      * @return: java.lang.Integer
      * @Author Jiangnan Cui
      * @Date 21:05 2022/8/13
      */
     Integer deleteById(Integer id);
 ​
     /**
      * @MethodName updateById
      * @Description 根据id修改用户
      * @param: id
      * @return: java.lang.Integer
      * @Author Jiangnan Cui
      * @Date 21:09 2022/8/13
      */
     Integer update(User user);
 }
  • IUserDaoMapper.xml

 <?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.study.dao.IUserDao">
     <!--findAll-->
   <select id="findAll" resultType="com.study.entity.User">
     select
         id,name,birthday,sex,address
     from t_user
   </select>
 ​
     <!--findById-->
     <select id="findById" parameterType="Integer" resultType="com.study.entity.User">
         select
             id,name,birthday,sex,address
         from t_user
         where id=#{id}
     </select>
 ​
     <!--findByIdAndName-->
     <select id="findByIdAndName" resultType="com.study.entity.User">
         select
             id,name,birthday,sex,address
         from t_user
         where id=#{id} and name=#{name}
     </select>
 ​
     <!--add-->
     <insert id="add" parameterType="com.study.entity.User" >
         insert into t_user values(#{id},#{name},#{birthday},#{sex},#{address})
     </insert>
 ​
     <!--deleteById-->
     <delete id="deleteById" parameterType="Integer" >
         delete from t_user where id=#{id}
     </delete>
 ​
     <!--update-->
     <update id="update" parameterType="com.study.entity.User">
         update t_user set name=#{name},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
     </update>
 </mapper>
  • IUserDaoTest.java

 package com.study.test;
 ​
 import com.study.dao.IUserDao;
 import com.study.entity.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.IOException;
 import java.io.InputStream;
 import java.util.Date;
 import java.util.List;
 ​
 /**
  * @ClassName IUserDaoTest
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2022/8/13 20:18
  * @Version 1.0
  */
 public class IUserDaoTest {
     /**
      * @MethodName findAllTest
      * @Description 测试查询所有
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findAllTest() throws IOException {
         InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
         SqlSessionFactory factory = builder.build(is);
         SqlSession sqlSession = factory.openSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         List<User> userList = userDao.findAll();
         for (User user : userList) {
             System.out.println("user = " + user);
         }
         //释放资源
         sqlSession.close();
         is.close();
     }
 ​
     /**
      * @MethodName findByIdTest
      * @Description 根据id查询
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findByIdTest() throws IOException {
         InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
         SqlSessionFactory factory = builder.build(is);
         SqlSession sqlSession = factory.openSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         User user = userDao.findById(1);
         System.out.println("user = " + user);
     }
 ​
     /**
      * @MethodName findByIdAndNameTest
      * @Description 根据id和name查询
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findByIdAndNameTest() throws IOException {
         InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
         SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
         SqlSessionFactory factory = builder.build(is);
         SqlSession sqlSession = factory.openSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         User user = userDao.findByIdAndName(2, "小二王");
         System.out.println("user = " + user);
     }
 ​
     /**
      * @MethodName addTest
      * @Description 新增用户
      * @Author Jiangnan Cui
      * @Date 21:00 2022/8/13
      */
     @Test
     public void addTest() throws IOException {
         SqlSession sqlSession = null;
         try {
             InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
             SqlSessionFactory factory = builder.build(is);
             sqlSession = factory.openSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.add(new User(9, "皮卡丘", new Date(), '女', "黑龙江"));
             System.out.println("受影响的行数 = " + n);
             mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (IOException e) {
             e.printStackTrace();
             sqlSession.rollback();;
         }
     }
 ​
     /**
      * @MethodName deleteByIdTest
      * @Description 根据id删除
      * @Author Jiangnan Cui
      * @Date 21:11 2022/8/13
      */
     @Test
     public void deleteByIdTest() {
         SqlSession sqlSession = null;
         try {
             InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
             SqlSessionFactory factory = builder.build(is);
             sqlSession = factory.openSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.deleteById(7);
             System.out.println("受影响的行数 = " + n);
             //mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (IOException e) {
             e.printStackTrace();
             sqlSession.rollback();
         }
     }
 ​
     /**
      * @MethodName updateByIdTest
      * @Description 根据id修改
      * @Author Jiangnan Cui
      * @Date 21:11 2022/8/13
      */
     @Test
     public void updateTest() {
         SqlSession sqlSession = null;
         try {
             InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
             SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
             SqlSessionFactory factory = builder.build(is);
             sqlSession = factory.openSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.update(new User(3, "喜洋洋", new Date(), '男', "羊村"));
             System.out.println("受影响的行数 = " + n);
             //mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (IOException e) {
             e.printStackTrace();
             sqlSession.rollback();
         }
     }
 }

5.10 MybatisUtil封装

  • MyBatisUtil.java

 package com.study.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;
 ​
 /**
  * @ClassName MybatisUtil
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2022/8/13 21:22
  * @Version 1.0
  */
 public class MybatisUtil {
     //声明工厂
     private static SqlSessionFactory sqlSessionFactory;
 ​
     //使用ThreadLocal保证service与dao层session一致
     private static final ThreadLocal<SqlSession> t = new ThreadLocal<>();
 ​
     //静态块,保证只加载一次
     static {
         try {
             InputStream is = Resources.getResourceAsStream("com/study/config/mybatis-config.xml");
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 ​
     /**
      * @MethodName getSession
      * @Description 获得SqlSession对象
      * @return: org.apache.ibatis.session.SqlSession
      * @Author Jiangnan Cui
      * @Date 21:31 2022/8/13
      */
     public static SqlSession getSession(){
         SqlSession sqlSession = t.get();
         if(sqlSession==null){
             sqlSession = sqlSessionFactory.openSession();
             t.set(sqlSession);
         }
         return sqlSession;
     }
 ​
     /**
      * @MethodName close
      * @Description 关闭SqlSession对象
      * @Author Jiangnan Cui
      * @Date 21:34 2022/8/13
      */
     public static void close(){
         SqlSession sqlSession = t.get();
         if(sqlSession!=null){
             sqlSession.close();
             t.remove();
         }
     }
 ​
     /**
      * @MethodName commit
      * @Description 提交事务
      * @Author Jiangnan Cui
      * @Date 21:35 2022/8/13
      */
     public static void commit(){
         getSession().commit();
         close();
     }
 ​
     /**
      * @MethodName rollback
      * @Description 回滚事务
      * @Author Jiangnan Cui
      * @Date 21:36 2022/8/13
      */
     public static void rollback(){
         getSession().rollback();
         close();
     }
 }
  • IUserDaoTest2.java

 package com.study.test;
 ​
 import com.study.dao.IUserDao;
 import com.study.entity.User;
 import com.study.utils.MybatisUtil;
 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.IOException;
 import java.io.InputStream;
 import java.util.Date;
 import java.util.List;
 ​
 /**
  * @ClassName IUserDaoTest
  * @Description TODO
  * @Author Jiangnan Cui
  * @Date 2022/8/13 20:18
  * @Version 1.0
  */
 public class IUserDaoTest2 {
     /**
      * @MethodName findAllTest
      * @Description 测试查询所有
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findAllTest() throws IOException {
         SqlSession sqlSession = MybatisUtil.getSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         List<User> userList = userDao.findAll();
         for (User user : userList) {
             System.out.println("user = " + user);
         }
         sqlSession.close();//释放资源
     }
 ​
     /**
      * @MethodName findByIdTest
      * @Description 根据id查询
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findByIdTest() throws IOException {
         SqlSession sqlSession = MybatisUtil.getSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         User user = userDao.findById(1);
         System.out.println("user = " + user);
         sqlSession.close();//释放资源
     }
 ​
     /**
      * @MethodName findByIdAndNameTest
      * @Description 根据id和name查询
      * @Author Jiangnan Cui
      * @Date 20:59 2022/8/13
      */
     @Test
     public void findByIdAndNameTest() throws IOException {
         SqlSession sqlSession = MybatisUtil.getSession();
         IUserDao userDao = sqlSession.getMapper(IUserDao.class);
         User user = userDao.findByIdAndName(2, "小二王");
         System.out.println("user = " + user);
         sqlSession.close();//释放资源
     }
 ​
     /**
      * @MethodName addTest
      * @Description 新增用户
      * @Author Jiangnan Cui
      * @Date 21:00 2022/8/13
      */
     @Test
     public void addTest() throws IOException {
         SqlSession sqlSession = null;
         try {
             sqlSession = MybatisUtil.getSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.add(new User(10, "熊大", new Date(), '男', "哈尔滨"));
             System.out.println("受影响的行数 = " + n);
             mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (Exception e) {
             e.printStackTrace();
             sqlSession.rollback();;
         }
     }
 ​
     /**
      * @MethodName deleteByIdTest
      * @Description 根据id删除
      * @Author Jiangnan Cui
      * @Date 21:11 2022/8/13
      */
     @Test
     public void deleteByIdTest() {
         SqlSession sqlSession = null;
         try {
             sqlSession = MybatisUtil.getSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.deleteById(10);
             System.out.println("受影响的行数 = " + n);
             //mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (Exception e) {
             e.printStackTrace();
             sqlSession.rollback();
         }
     }
 ​
     /**
      * @MethodName updateByIdTest
      * @Description 根据id修改
      * @Author Jiangnan Cui
      * @Date 21:11 2022/8/13
      */
     @Test
     public void updateTest() {
         SqlSession sqlSession = null;
         try {
             sqlSession = MybatisUtil.getSession();
             IUserDao userDao = sqlSession.getMapper(IUserDao.class);
             Integer n = userDao.update(new User(10, "美羊羊", new Date(), '女', "羊村"));
             System.out.println("受影响的行数 = " + n);
             //mybatis执行增删改时默认事务提交方式是手动的(setAutoCommit(false)),此处需要进行提交
             sqlSession.commit();//新增需要提交事务
         } catch (Exception e) {
             e.printStackTrace();
             sqlSession.rollback();
         }
     }
 }

5.11 优化后项目结构

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值