Mybatis基于配置的CRUD操作

1、在IUserDao.java 接口中定义相关操作处理的方法。

package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 *
 * 用户的持久层接口
 */
public interface IUserDao {
//   查找所有用户
    List<User> findAll();
//    保存用户
    void saveUser(User user);
//    更新用户
    void updateUser(User user);
//    删除用户
    void deleteUser(Integer id);
//    根据ID查询用户
    User findById(Integer id);
//    根据用户名称模糊查询
    List<User> findByUsername(String username);
}

2、在IUserDao.xml 配置文件中,编写相关操作语句

注意该映射文件没有指定位置时默认创建在resource路径下的和dao包同级目录下,在resource下再创建一样的目录,如下图

在这里插入图片描述
为什么需要在resource目录下呢:在默认的情况下maven打包的时候,对于src/main/java目录只打包源代码,而不会打包其他文件。所以此时如果把对应的mapper文件放到src/main/java目录下时,不会打包到最终的jar文件夹中,也不会输出到target文件夹中,由于在进行单元测试的时候执行的是/target目录下/test-classes下的代码,所以在测试的时候也不会成功。
我们需要设置maven打包xml文件才可以,在pom.xml中设置

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

之后就可以把映射文件放在dao包下了。

<?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.itheima.dao.IUserDao">
    <!--配置查询所有-->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user
    </select>
    <!-- 保存用户 -->
        <!-- parameterType 代表参数类型 -->
    <insert id="saveUser" parameterType="com.itheima.domain.User">
        <!-- 保存数据后,获取该用户的ID -->
        <!-- resultType: 返回值类型
             keyProperty: 属性名
             keyColumn: 列名
             order: 设置执行select语句之后再执行该语句-->
        <selectKey resultType="int" keyProperty="id" keyColumn="id" order="AFTER">
            select last_insert_id();
        </selectKey>
         insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
    </insert>
    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{username},sex=#{sex},address=#{address},birthday=#{birthday} where id = #{id};
    </update>
    <!-- 删除用户 -->
        <!-- 由于就一个整型参数,所以占位符中的变量名可随便定义 -->
    <delete id="deleteUser" parameterType="Integer">
        delete from user where id = #{uid};
    </delete>
    <!-- 根据用户ID查询 -->
    <select id="findById" parameterType="Integer" resultType="com.itheima.domain.User">
        select *from user where id = #{uid};
    </select>
    <!-- 根据用户名称进行模糊查询 -->
        <!-- 除了使用占位符方式,也可以使用字符串拼接的形式(${value}) 里面的值必须是value -->
    <select id="findByUsername" resultType="com.itheima.domain.User" parameterType="String">
        <!-- select *from user where username like #{username}; -->
        select * from user where username like '${value}';
    </select>
</mapper>

3、在测试类中添加相关测试

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.net.UnknownServiceException;
import java.util.Date;
import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * mybatis的入门案例
 */
public class MybatisTest {
    private InputStream in;
    private  SqlSession session;
    private IUserDao userDao;

	// 测试执行之前执行该方法
    @Before
    public void init() throws IOException {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        userDao = session.getMapper(IUserDao.class);
    }

	// 测试执行之后执行该方法
    @After
    public void after() throws IOException {
        // 提交事务,不提交事务是不会成功保存,事务是可以回退的。
        session.commit();
        //6.释放资源
        session.close();
        in.close();
    }

    @Test
    public void testSearchById() throws IOException {

        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }

    }

    @Test
    public void testSave() throws IOException {
        User user = new User();
        user.setUsername("张三 last insertiD ");
        user.setAddress("安徽省宿州市");
        user.setBirthday(new Date());
        user.setSex("男");
        System.out.println("执行前"+ user);
        //5.使用代理对象执行方法
        userDao.saveUser(user);
        System.out.println("执行后"+ user);
    }

    @Test
    public void updateTest() {
        User user = new User();
        user.setId(52);
        user.setUsername("张三 last insertid");
        user.setAddress("安徽省蚌埠市");
        user.setBirthday(new Date());
        user.setSex("女");

        System.out.println("执行前"+ user);
        //5.使用代理对象执行方法
        userDao.updateUser(user);
        System.out.println("执行后"+ user);
    }

    @Test
    public void deleteTest() {
        //5.使用代理对象执行方法
        userDao.deleteUser(52);
    }

    @Test
    public void findByIdTest() {
//       5、使用代理对象执行方法
        User user = userDao.findById(53);
        System.out.println(user);
    }

    @Test
    public void findByUsernameTest() {
        List<User> users = userDao.findByUsername("%张%");
        for(User user : users){
            System.out.println(user);
        }
    }
}

部分操作的细节

(1)保存用户
由于我们在创建表的时候,用户id 属性是自增的,所以我们并不会获取到该属性的值,要想在添加之后同时获取该属性的值,就需要添加selectKey操作

 <!-- 保存数据后,获取该用户的ID -->
        <!-- resultType: 返回值类型
             keyProperty: 属性名
             keyColumn: 列名
             order: 设置执行select语句之后再执行该语句-->
        <selectKey resultType="int" keyProperty="id" keyColumn="id" order="AFTER">
            select last_insert_id();
        </selectKey>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值