zoukankan      html  css  js  c++  java
  • 在 idea 下搭建的第一个MyBatis项目及增删改查用法

    Mybatis搭建第一个项目

    1. 简介

    1.1 什么是 MyBatis?

    • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    如何获取Mybatis?

    1.2 持久化

    数据持久化

    • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
    • 内存:断电即失--->数据库,io 文件持久化

    1.3 持久层

    Dao 层

    • 完成持久化工作的代码块
    • 层界限十分明显

    1.4 为什么需要Mybatis?

    • 传统的 JDBC 代码太复杂,简化操作,减少代码冗余。
    • 帮助开发人员将数据存入到数据库中
    • 灵活,易于使用
    • 解除 sql 与程序代码的耦合,sql 和代码的分离,提高了可维护性
    • 提供 xml 标签,支持编写动态 sql

    2. 搭建第一个Mybatis程序

    • 配置 mybatis-confgi.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="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <mappers>
          <mapper resource="com/youzi/dao/UserMapper.xml"/>
      </mappers>
    </configuration>
    
    • 编写工具类
    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();
            }
        }
    
        public static SqlSession getSqlSession() {
            return sqlSessionFactory.openSession();
        }
    }
    
    • 编写 pojo
    package com.youzi.pojo;
    
    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;
        }
    	...
    }
    
    
    • DAO 接口
    public interface UserMapper {
        List<User> getUserList();
    
        User getUserById(int uId);
    
        int addUser(User user);
    
        int updateUser(User user);
    
        int deleteUser(int id);
    }
    
    • 接口实现类由原来 JDBC 中的 UserDaoImpl 转变为配置文件
    <?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.youzi.dao.UserDao">
        <select id="getUserList" resultType="com.youzi.pojo.User">
            select * from mybatis_db.user;
        </select>
    </mapper>
    

    3. CRUD

    • select
    <select id="getUserList" resultType="com.youzi.pojo.User">
        select * from mybatis_db.user;
    </select>
    
    <select id="getUserById" parameterType="int" resultType="com.youzi.pojo.User">
        select * from user where id = #{uId};
    </select>
    
    @Test
    public void test_getUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    
    @Test
    public void test_getUserById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
    
        sqlSession.close();
    }
    

    修改,添加,删除因为有事务的存在所以必须 commit

    • insert
    <insert id="addUser" parameterType="com.youzi.pojo.User">
        insert into user (id, name, pwd) values (#{id},#{name},#{pwd});
    </insert>
    
     @Test
    public void test_addUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.addUser(new User(4, "王五", "2323223"));
        System.out.println(i);
    
        //重要
        sqlSession.commit();
        sqlSession.close();
    
    }
    
    • update
    <update id="updateUser" parameterType="com.youzi.pojo.User">
        update user set name = #{name},pwd = #{pwd} where id = #{id};
    </update>
    
    @Test
    public void test_updateUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        int i = mapper.updateUser(new User(2, "李四", "123123"));
        System.out.println(i);
    
        sqlSession.commit();
        sqlSession.close();
    }
    
    • delete
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id};
    </delete>
    
    @Test
    public void test_deleteUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.deleteUser(4);
        System.out.println(i);
    
        sqlSession.commit();
        sqlSession.close();
    }
    

    上面的 sqlSession 也可以使用 try() 语句创建 即 try-with-resources 自动关闭资源

    try(SqlSession sqlSession = MybatisUtils.getSqlSession()){
        ...
    }
    

    过程中出现的错误

    org.apache.ibatis.binding.BindingException: Type interface com.youzi.dao.UserDao is not known to the MapperRegistry. 没有绑定 mapper

    <mappers>
        <mapper resource="com/youzi/dao/UserMap.xml"/>
    </mappers>
    

    使用 map 传参

    例如此时 User 中存在 50 个字段,只需要修改其中的一个值,就可以采用 map 传参

    <!--使用map的方式传值不用考虑其他的字段,只用考虑要传值的地方就可以-->
    <update id="updateUser2" parameterType="map">
        update user set name = #{userName} where id = #{userID};
    </update>
    
    @Test
    public void test_updateUser2() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
        Map<String, Object> map = new HashMap<>();
        map.put("userName", "zhangsan");
        map.put("userID", 1);
        mapper.updateUser2(map);
    
        sqlSession.commit();
        sqlSession.close();
    }
    

    模糊查询怎么写?

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

      mapper.getUser("%wang%");
      
    2. 在 sql 语句拼接中使用通配符

      <select id="getUserByNameLike" resultType="com.youzi.pojo.User">
          select * from user where name like "%"#{name}"%";
      </select>
      
  • 相关阅读:
    docker-dockerfile构建与部署nginx
    淘宝镜像安装
    css3 中的变量 var 的使用
    CSS样式清除
    css 样式初始化(rem兼容)
    canvas截屏网页为图片下载到本地-html2canvas.js
    移除JSON对象中的某个属性
    js 常用方法集合(持续更新)
    小程序获取上个页面vm对象 解决百度小程序返回上一页不更新onShow更新(适用于uni-app)
    小程序 请求Promise简单封装
  • 原文地址:https://www.cnblogs.com/wangjr1994/p/12445737.html
Copyright © 2011-2022 走看看