使用MyBatis实现CRUD操作

MyBatis

  • 1.使用MyBatis实现CRUD操作
    • 1.1 根据id查询信息
    • 1.2 实现存入用户信息
    • 1.3 更新用户信息
    • 1.4 删除用户信息
    • 1.5 模糊查询
    • 1.6 #{}和${}的区别
    • 1.7 parameterType和resultType
      • 1.7.1 parameterType传参
      • 1.7.2 resultType配置结果类型
      • 1.7.3 resultMap结果类型
  • 2. MyBatis较JDBC的优势

1.使用MyBatis实现CRUD操作

    CRUD:CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。

    CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。


1.1 根据id查询信息

在UserDao.xml中添加:

    
  • resultType 属性: ⽤于指定结果集的类型。
  • parameterType 属性: ⽤于指定传入参数的类型。
  • sql 语句中使⽤#{}字符: 它代表占位符,相当于原来 JDBC 部分所学的 ‘?’,都是⽤于执⾏语句
    时替换实际的数据。具体的数据是由#{}⾥⾯的内容决定的。
  • #{}中内容的写法: 由于数据类型是基本类型,所以此处可以随意写。

在UserDao中添加:

	public interface UserDao {
	    User findById(Integer userId);
	}

在测试类中添加:

	@Test
	public void testFindOne() {
		User user = userDao.findById(41);
		System.out.println(user);
	}

输出结果:
在这里插入图片描述

1.2 实现存入用户信息

在UserDao.xml中添加:

    
        
            select last_insert_id();
        
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    
  • ognl 表达式: 它是 apache 提供的⼀种表达式语⾔,全称是: Object Graphic Navigation Language 对象图导航语⾔。它是按照⼀定的语法格式来获取数据的。
        语法格式就是使⽤ #{对象.对象} 的⽅式#{user.username} 它会先去找 user 对象,然后在 user 对象中找到username 属性,并调⽤ getUsername()⽅法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.⽽直接写 username。

在UserDao中添加:

	public interface UserDao {
		 int saveUser(User user);
	}

在测试类中添加:

    @Test
    public void testSaveUser() {
        User user = new User();
        user.setUsername("new User");
        user.setAddress("杭州");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存操作之前:" + user);
        userDao.saveUser(user);
        System.out.println("保存操作之后:" + user);
    }

输出结果:
在这里插入图片描述在这里插入图片描述

1.3 更新用户信息

在UserDao.xml中添加:

    
        update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}where id=#{id}
    

在UserDao中添加:

	public interface UserDao {
		 int updateUser(User user);
	}

在测试类中添加:

   @Test
    public void testUpdateUser() throws Exception {
        User user = userDao.findById(41);
        user.setAddress("杭州");
        int res = userDao.updateUser(user);
        System.out.println(user);
    }

输出结果:
在这里插入图片描述

1.4 删除用户信息

在UserDao.xml中添加:

    
        delete from user where id = #{uid}
    

在UserDao中添加:

	public interface UserDao {
         int deleteUser(Integer userId);
	}

在测试类中添加:

    @Test
    public void testDeleteUser() throws Exception {
        int res = userDao.deleteUser(41);
        System.out.println(res);
    }

1.5 模糊查询

三种模糊查询的方式

    

1.6 #{}和${}的区别

  • #{}表示⼀个占位符号
    通过#{}可以实现 preparedStatement 向占位符中设置值,⾃动进⾏ java 类型和 jdbc 类型转换, #{}可以有效防⽌ sql 注⼊。 #{}可以接收简单类型值或 pojo 属性值。 如果parameterType 传输单个简单类型值, #{}括号中可以是 value 或其它名称。
  • ${}表示拼接 sql 串
    通过${}可以将 parameterType 传⼊的内容拼接在 sql 中且不进⾏ jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。

1.7 parameterType和resultType

1.7.1 parameterType传参

    SQL语句传参,使⽤标签的parameterType 属性来设定。

    该属性的取值可以是基本类型引⽤类型(例如: String 类型),还可以是实体类类型(POJO 类)。同时也可以使⽤实体类的包装类


1.7.2 resultType配置结果类型

   resultType 属性可以指定结果集的类型,它⽀持基本类型实体类类型。


1.7.3 resultMap结果类型

   resultMap 标签可以建立查询的列名和实体类的属性名称不⼀致时建立对应关系。从而实现封装。

   在 select 标签中使⽤ resultMap 属性指定引⽤即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,⽐如在查询结果映射对象中包括 pojo 和 list 实现⼀对⼀查询和⼀对多查询。

   	
        
        
        
        
        
    
  • type 属性: 指定实体类的全限定类名

  • id 属性: 给定⼀个唯⼀标识,是给查询 select 标签引⽤⽤的。

  • id 标签:⽤于指定主键字段

  • result 标签:⽤于指定⾮主键字段

  • column 属性:⽤于指定数据库列名

  • property 属性:⽤于指定实体类属性名称

2. MyBatis较JDBC的优势

  1. 数据库链接创建、释放频繁造成系统资源浪费从⽽影响系统性能,如果使⽤数据库链接池可解决此问题。
    解决:在 SqlMapConfig.xml 中配置数据链接池,使⽤连接池管理数据库链接。
  2. Sql 语句写在代码中造成代码不易维护,实际应⽤ sql 变化的可能较⼤, sql 变动需要改变java 代码。
    解决:将 Sql 语句配置在 XXXXmapper.xml ⽂件中与 java 代码分离。
  3. 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不⼀定,可能多也可能少,占位符需要和参数对应。
    解决:Mybatis ⾃动将 java 对象映射⾄ sql 语句,通过 statement 中的 parameterType 定义输⼊参数的类型。
  4. 对结果集解析麻烦, sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析⽐较⽅便。
    解决:Mybatis ⾃动将 sql 执⾏结果映射⾄ java 对象,通过 statement 中的 resultType 定义输出结果的类型。

你可能感兴趣的:(mybatis,java)