My Batis基本CRUD ${}和#{}的区别 My Batis运行原理

本文详细介绍了MyBatis框架中如何通过XML、注解和Java对象传递参数,以及其核心组件如SqlSessionFactory和SqlSession的工作原理。重点讨论了不同参数传递方式和SQL注入防范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是 MyBatis?

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

官方推荐xml

​​​​​​​

mybatis传递多个参数
    1、序号传递多个参数

 Mapper
  /**
    * 传递单个参数
    * @param id
    * @return
    */
   User getUserById(Integer id);

xml
    <select id="getUserById" parameterType="java.lang.Integer" 
              resultType="com.by.pojo.User">
        select * from user where id=#{id}
    </select>

test
 @Test
    public void testGetUserById() throws IOException {
   //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
      InputStream  inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new                     
                SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
        SqlSession  sqlSession = sessionFactory.openSession();

        UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
        User user= userMapper.getUserById(43);
        System.out.println(user);

    }


    2、注解传递多个参数---【推荐】

 Mapper
   /**
    * 注解传递多个参数
    * @param id
    * @param username
    * @return
    */
   User getUser2(@Param("id") Integer id,@Param("username") String username);

xml
   @Test
    public void testGetUser2() throws IOException {
        UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
        User user= userMapper.getUser2(43,"俞莲舟");
        System.out.println(user);
    }

test
 @Test
    public void testGetUser2() throws IOException {
   //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
      InputStream  inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new                     
                SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
        SqlSession  sqlSession = sessionFactory.openSession();
   UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
        User user= userMapper.getUser2(43,"俞莲舟");
        System.out.println(user);


    3、pojo传递多个参数---【推荐】

   /**
    * 对象传递多个参数
    * @param user
    * @return
    */
   User getUser3(User user);

    <select id="getUser3" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
        select * from user where id=#{id} and username=#{username}
    </select>

    @Test
    public void testGetUser3() throws IOException {
        //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
      InputStream   inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
       SqlSession sqlSession = sessionFactory.openSession();
        UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
        User userParam=new User();
       userParam.setId(43);
       userParam.setUsername("俞莲舟");
        User user = userMapper.getUser3(userParam);
        System.out.println(user);

    }


    4、map传递多个参数

   /**
    * map传递多个参数
    * @param map
    * @return
    */
   User getUser4(Map<String,Object>map);

    <select id="getUser4" parameterType="java.util.Map" resultType="com.by.pojo.User">
        select * from user where id=#{id} and username=#{username}
    </select>


   @Test
    public void testGetUser4() throws IOException {
        //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
   InputStream      inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
      SqlSession   sqlSession = sessionFactory.openSession();

        UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
        Map<String, Object>map=new HashMap<>();
        map.put("id",43);
        map.put("username","俞莲舟");
        User user=userMapper.getUser4(map);
        System.out.println(user);
    }

5、delete

   void deleteUserById(Integer id);

    <delete id="deleteUserById" parameterType="java.lang.Integer">
        delete  form user where id=#{id}
    </delete>

    @Test
    public void testDeleteUserById() throws IOException {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    userMapper.deleteUserById(43);
        sqlSession.commit();
    }
6、update
   void updateUserById(User user);

    <update id="updateUserById" parameterType="com.by.pojo.User">
        UPDATE user
        SET username=#{username}, password=#{password}, birthday=#{birthday}, sex=#{sex}, address=#{address}
        WHERE id=#{id}
    </update>

    @Test
    public void testUpdateUserById(){
 //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
      InputStream  inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
       SqlSession  sqlSession = sessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("郭襄");
        user.setPassword("111");
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("峨眉山");
        user.setId(42);
        userMapper.updateUserById(user);
       sqlSession.commit();
    }

7、新增

   void addUser(User user);

    <insert id="addUser"parameterType="com.by.pojo.User">

        insert into  user(username,password,birthday,sex,address) VALUES(#{username},#{password},#{birthday},#{sex},#{address})
    </insert>

    @Test
    public void testAddUser(){
 //加载mybatis-config.xml
        String resource = "mybatis-config.xml";
    InputStream     inputStream = Resources.getResourceAsStream(resource);

        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //创建sqlSession
    SqlSession     sqlSession = sessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("周芷若");
        user.setPassword("111");
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("峨眉山");
        userMapper.addUser(user);
        System.out.println("返回自增id:"+user.getId());
        sqlSession.commit();
    }

${}和#{}的区别

             sql注入          底层             jdbc类型转换        单个简单类型的参数
    $         不防止          Statement            不转换                 value
    #          防止        preparedStatement        转换                  任意

    结论:除模糊匹配外,杜绝使用${}

自定义MyBatis
MyBatis运行原理图


MyBatis的核心对象
运行原理步骤图解及流程解析

MyBatis的核心对象

运行原理步骤图解及流程解析

Resources
加载配置文件,有一种是使用类加载进行加载,我们通过这个类的类加载器进行资源的加载。

List item

SqlSessionFactoryBuilder

构建SqlSessionFactory工厂对象需要的对象。采用了构建者模式,屏蔽了对象构建的细节。

SqlSessionFactory
创建SqlSession对象所用。使用工厂模式创建,目的就是解耦合。

SqlSession
创建代理对象,使用了代理模式。

Executor
操作数据库

MappedStatement
存储SQL语句、参数、输出结果类型
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值