Mybatis简介、第一个Mybatis小程序、CRUD

1、简介

1.1、什么是 MyBat

 

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和

Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

如何获得Mybatis?

1.2、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程

  • 内存:断电即失
  • 数据库(jdbc),io文件持久化。

  • 生活:冷藏、罐头。

为什么需要持久化?

  • 有一些对象,不能让他丢掉。

  • 内存太贵了

 

1.3、持久层

Dao层,Service层,Controller层...

  • 完成持久化工作的代码块

  • 层界限十分明显

 

1.4、为什么需要Mybatis?

  • 帮助程序猿将数据存入到数据库中

  • 方便

  • 传统的JDBC代码太复杂了。简化,框架,自动化。

  • 不用Mybatis也可以,更容易上手。技术没有高低之分

最重要的一点:使用的人多!

 

2、第一个Mybatis程序

2.1、搭建环境

思路:搭建环境-->导入Mybatis-->编写代码-->测试!

搭建数据库

CREATE DATABASE `mybatis`;
USE `mybatis`

CREATE TABLE `user`(
`id` INT(20) NOT NULL AUTO_INCREMENT COMMENT '号码',
`name` VARCHAR(20) DEFAULT NULL COMMENT '名字',
`pwd` VARCHAR(20) DEFAULT NULL COMMENT '密码',
 PRIMARY KEY  (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `user`(`id`,`name`,`pwd`)VALUES(1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456')
UPDATE  `user` SET `pwd`=123789 WHERE id=2

新建项目

  1. 新建一个普通的maven项目

  2. 删除src目录

  3. 导入maven依赖

    <!--    导入依赖-->
       <dependencies>
    <!--       mysql驱动-->
           <dependency>
               <groupId>mysql</groupId>
               <artifactId>mysql-connector-java</artifactId>
               <version>5.1.29</version>
           </dependency>
    <!--       mybatis驱动-->
           <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
           <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis</artifactId>
               <version>3.5.7</version>
           </dependency>
    <!--       junit(测试类)-->
           <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>4.12</version>
               <scope>test</scope>
           </dependency>
       </dependencies>
2.2、创建一个模块
  • 编写mybatis的核心配置文件

    <?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核心配置文件-->
    <configuration>
       <environments default="development">
           <environment id="development">
               <transactionManager type="JDBC"/>
               <dataSource type="POOLED">
                   <property name="driver" value="com.mysql.jdbc.Driver"/>
                   <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                   <property name="username" value="root"/>
                   <property name="password" value="123456"/>
               </dataSource>
           </environment>
       </environments>
    </configuration>
  • 编写mybatis工具类

    //sqlSessionFactory --> sqlSession
    public class MybatisUtils {
       private static SqlSessionFactory sqlSessionFactory;
       static {
           try {
               //使用Mybatis第一步:获取sqlSessionFactory对象
               String resource = "mybatis-config.xml";
               InputStream inputStream = Resources.getResourceAsStream(resource);
               sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
          } catch (IOException e) {
               e.printStackTrace();
          }
      }

       //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 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 + '\'' +
                   '}';
      }
    }

     

  • Dom接口

    public interface UserDao {
       List<User> getUserList();
      }
  • 接口实现类:由原来的UserDaoImpl转变为一个Mapper配置文件。

    <?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接口-->
    <mapper namespace="com.kuang.dao.UserDao">

    <!--   select查询语句-->
       <select id="getUserList" resultType="com.kuang.pojo.User">
          select * from mybatis.user
       </select>
    </mapper>

 

2.4、测试

注意点:org.apache.ibatis.binding.BindingException: Type interface com.kuang.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?

核心配置文件中注册 mappers

  • junit测试

    public class UserDaoTest {
       @Test
       public void test(){
           //第一步:获得SqlSession对象
           SqlSession sqlSession = MybatisUtils.getSqlSession();
           //执行SQL
           UserDao userDao = sqlSession.getMapper(UserDao.class);
           List<User> userList = userDao.getUserList();
           for (User user : userList) {
               System.out.println(user);
          }
           //关闭sqlSession
           sqlSession.close();
      }
    }

     

 

3、CRUD

1、namespace

namespace中的包名要和Dao/mapper接口的包名一致!

2、select

选择,查询语句;

  • id:就是对应的namespace中的方法名;

  • resultType:Sql语句执行的返回值!

  • parameterType:参数类型!

 

  1. 编写接口

        //根据id查询用户
      User getUserById(int id);
  2. 编写对应的mapper中的sql语句

        <select id="getUserById" resultType="com.kuang.pojo.User" parameterType="int">
          select * from mybatis.user where id = #{id};
       </select>
  3. 测试

        @Test
       public void getUserById(){
           SqlSession sqlSession = MybatisUtils.getSqlSession();
           UserMapper mapper = sqlSession.getMapper(UserMapper.class);
           User userById = mapper.getUserById(1);
           System.out.println(userById);
           sqlSession.close();
      }
3、Insert
<!--    对象中的属性可以直接取出来-->
   <insert id="addUser" parameterType="com.kuang.pojo.User">
      insert into mybatis.user (id,name,pwd)values (#{id},#{name},#{pwd});
   </insert>
4、Update
    <update id="updateUser" parameterType="com.kuang.pojo.User">
      update user set name=#{name},pwd=#{pwd} where id=#{id};
   </update>
5、Delete
    <delete id="deleteUser" parameterType="int">
      delete from mybatis.user where id = #{id};
   </delete>

注意点:

  • 增删改需要提交事务

6、分析错误
  • 标签不要匹配错

  • resource 绑定mapper,需要使用路径(用/不是.)!

          <mappers>
               <mapper resource="com/kuang/dao/UserMapper.xml" />
           </mappers>
  • 程序配置文件必须符合规范

  • NullPointException,没有注册到资源!

  • 输出的xml文件中存在中文乱码问题!

  • maven资源没有导出问题!

7、万能Map

假设,我们的实体类,或者数据库中的表、字段或者参数过多,我们应当考虑使用Map!

    //万能的Map
  int addUser2(Map<String,Object> map);
    @Test
   public void addUser2(){
       SqlSession sqlSession = MybatisUtils.getSqlSession();
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);

       Map<String, Object> map = new HashMap<String, Object>();
       map.put("userid",4);
       map.put("username","Hello");
       map.put("password","122233");
       mapper.addUser2(map);
       //提交事务
       sqlSession.commit();
       sqlSession.close();
  }

Map传递参数,直接在sql中取出key即可! 【parameterType="map"】

对象传递参数,直接在sql中取对象的属性即可! 【parameterType="Object"】

只有一个基本类型参数的情况下,可以直接在sql中取到!

多个参数用Map,或者注解!

 

8、思考题,模糊查询怎么写?(两种)

模糊查询怎么写?(两种)

  1. Java代码执行的时候,传递通配符% %

     List<User> userLike = mapper.getUserLike("%李%");
  2. 在sql拼接中使用通配符!

    select * from mybatis.user where name like "%"#{value}"%"
posted @ 2021-10-24 17:03  敲代码的体育生  阅读(246)  评论(0)    收藏  举报