Mybatis入门

Mybatis

环境

  • JDBC
  • java基础
  • JDK 1.8
  • Mysql5.7
  • maven 3.6.1
  • 开发工具 idea
  • Junit

SSM框架:配置文件的最好方式:看官网文档

1 简介

1.1 什么是Mybatis?

  • MyBatis是一款优秀的持久层框架
  • 支持定制SQL、存储过程以及高级映射
  • Mybatis避免了几乎所有的JDBC代码和手动设置参树,以及获取结果集
  • Mybatis可以使用简单的XML注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录
  • MyBatis本是apache的一个开源项目iBatis
  • 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis
  • 2013年11月迁移到Githu

1.2 如何获得Mybatis?

  <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
  </dependency>

1.2 持久化

数据持久化

  • 持久化就是将程序的数据保存在硬盘中
  • 内存特性:断电会失去信息
  • 数据库(jdbc),io文件持久化
  • 生活中的持久化:冷藏,写……

为什么需要持久化?

  • 我们需要将一些数据保存下来,方便以后使用
  • 内存价格过高(制造成本高)

1.3 持久层

复习学习过的层:Dao,Service,Controller

持久层的工作

  • 完成持久化工作的代码块
  • 层之间的接线非常明显

1.4 为什么需要Mybatis?

  • 帮助程序员将数据存入到数据库中
  • 传统的JDBC代码太复杂了
  • 简化、框架、自动化
  • 不用Mybatis也能实现,Mybatis可以使程序员在不知道底层原理的情况下,完成网站后台搭建
  • 优点:
    • 简单易学
    • 灵活
    • 解除sql与程序代码的耦合
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。

2 第一个MyBatis程序

 思路:搭建环境—>导入MyBatis—>编写代码—>测试

2.1 搭建环境

搭建数据库

复制代码
 -- 创建数据库
   create database `mybatis`;
   use mybatis;
   -- 创建表
   create table `user`(
      `id` int(20) not null,
      `name` varchar(30) default null,
      `pwd` varchar(30) default null,
      primary key(`id`) 
   )engine=InnoDB default charset=utf8mb4;
   -- 插入数据
   insert into `user`(`id`,`name`,`pwd`) values
  (1,'千树','123'),
  (2,'张三','123'),
  (3,'李飞','123');
复制代码

新建普通maven项目作为父项目,导入sql驱动,mybatis,junit组件

复制代码
  <!--导入依赖-->
  <dependencies>
      <!--mysql驱动-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.46</version>
      </dependency>
      <!--Mybatis-->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.2</version>
      </dependency>
      <!--junit-->
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.12</version>
      </dependency>
  </dependencies>
复制代码
  • 新建新组件作为子级项目,普通maven的module
  • 添加配置文件:

    在src->main->resources目录下新建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>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="mapper/userMapper.xml"/>
        </mappers>
    </configuration>
    复制代码

     

2.2 创建模块

编写mybatis工具类

复制代码
 //SqlSessionFactory --生产--> SqlSession
  public class MybatisUtils {
      private static SqlSessionFactory sqlSessionFactory; //提升作用域
      //获取工厂,固定代码
      static {
          try {
              String resource="mybatis-config.xml";
              InputStream inputStream = Resources.getResourceAsStream(resource);
              sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      //获取sqlSession
      //SqlSession完全包含了面向对象数据库执行SQL命令所需的方法
      public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession();}
  }
复制代码

2.3 编写代码

实体类

复制代码
  public class User {
      private int id;
      private String name;
      private String pwd;
      public User() { }
      public User(int id, String name, String pwd) {
          this.id = id;
          this.name = name;
          this.pwd = pwd;
      }
      public int getId() {
          return id;
      }
      public void setId(int id) {
          this.id = id;
      }
      public String getName() {
          return name;
      }
      public void setName(String name) {
          this.name = name;
      }
      public String getPwd() {
          return pwd;
      }
      public void setPwd(String pwd) {
          this.pwd = pwd;
      }
      @Override
      public String toString() {
          return "User{" +
                  "id=" + id +
                  ", name='" + name + '\'' +
                  ", pwd='" + pwd + '\'' +
                  '}';
      }
  }
复制代码

Dao接口

 public interface UserDao {
      List<User> getUserList();
  }

接口实现类改为以xxxMapper.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">
  <!--namespace:命名空间,绑定mapper/Dao接口-->
  <mapper namespace="com.qian.dao.UserDao">
  <!--id:接口的方法,resultType:接口的返回值类型-->
      <select id="getUserList" resultType="com.qian.pojo.User">
          select * from mybatis.user where id = #{id}
      </select>
  </mapper>
复制代码

2.4 测试

测试类

复制代码
public class UserDaoTest {
      @Test
      public void test(){
          //获取SqlSession对象
          SqlSession sqlSession = MybatisUtils.getSqlSession();
          //获取mapper
          UserDao mapper = sqlSession.getMapper(UserDao.class);
          List<User> list = mapper.getUserList();
          for (User u:list){
              System.out.println(u);
          }
          //不推荐使用
  /*
      这种方式能够正常工作,对使用旧版本 MyBatis 的用户来说也比较熟悉。但现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
  */
  //        List<User> list = sqlSession.selectList("com.qian.dao.UserDao.getUserList");
  //        for (User user : list) {
  //            System.out.println(user);
  //        }
          //关闭SqlSession
          sqlSession.close();
      }
  }
复制代码

异常1:org.apache.ibatis.binding.BindingException: Type interface com.qian.dao.UserDao is not known to the MapperRegistry.

解决方法:每一个Mapper.xml文件都需要在src->main->resources目录下新建mybatis-config.xml的核心配置文件中注册

<mappers>
  <mapper resource="com/qian/dao/UserMapper.xml">
</mappers>

3 增删改查实现

3.1 Mapper接口

复制代码
public interface UserMapper {
    //查询全部用户
    List<User> getUserList();
    //根据id查询用户
    User getUserById(int id);
    //增加新的用户
    boolean insertNewUser(User u);
    //删除用户
    boolean deleteUserById(int id);
    boolean deleteUserByName(String name);
    //修改用户
    boolean updateUserById(User u);
}
复制代码

3.2 xxxMapper.xml文件

复制代码
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:命名空间,绑定mapper/Dao接口-->
<!--id:接口的方法,resultType:接口的返回值类型-->
<mapper namespace="com.qian.dao.UserMapper">
    <select id="getUserList" resultType="com.qian.pojo.User">
        select * from mybatis.user
    </select>
    <select id="getUserById" parameterType="int" resultType="com.qian.pojo.User">
        select * from mybatis.user where id=#{id}
    </select>
    <!-- 对象中的属性,可以直接取出来用 -->
    <insert id="insertNewUser" parameterType="com.qian.pojo.User">
        insert into mybatis.user (id, name, pwd) VALUES (#{id},#{name},#{pwd})
    </insert>
    <delete id="deleteUserById" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
    <delete id="deleteUserByName" parameterType="String">
        delete from mybatis.user where name=#{name}
    </delete>
    <update id="updateUserById" parameterType="com.qian.pojo.User">
        update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
</mapper>
复制代码

3.3 Test类

注意:增删改要提交事务!!!

复制代码
public class UserDaoTest {
    @Test
    public void test(){
        //获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        try{
            //获取mapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//            查询全表
//            List<User> list = mapper.getUserList();
//            for (User u:list){
//                System.out.println(u);
//            }
            //根据id查询
//            User user = mapper.getUserById(1);
//            System.out.println(user);
            //插入新用户,注意:更新,插入,删除都需要提交事务
//            User user1 = new User(4,"李四","25615");
//            boolean isInserted = mapper.insertNewUser(user1);
//            sqlSession.commit();
            //代码优化
//            if (mapper.insertNewUser(new User(4,"李四","25615"))) sqlSession.commit();
            //删除用户
//            if (mapper.deleteUserById(4))sqlSession.commit();
             if (mapper.deleteUserByName("李四"))sqlSession.commit();
             //修改用户
            if (mapper.updateUserById(new User(4,"王五","6849816")))sqlSession.commit();
        }finally {
            //关闭SqlSession
            sqlSession.close();
        }
    }
}
复制代码

 

posted @   しゅおく  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示