Mybatis快速入门并实现CRUD操作

MyBatis快速入门

思路流程搭建环境—>导入Mybatis–>编写代码—>测试

1、代码演示

1.1、搭建数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `address` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`username`,`address`) 
values (1,'詹姆斯','克里夫'),
(2,'科比','洛杉矶'),
(3,'保罗','洛杉矶'),
(4,'苏炳添','中国');


1.2、导入MyBatis相关依赖


        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.5version>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.21version>
        dependency>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.13version>
            <scope>testscope>
        dependency>

1.3、编写Mybatis核心配置文件


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="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>
    environments>
    
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    mappers>
configuration>

1.4、编写实体类

package com.lili.entity;

/**
 * 对应数据库下的t_user表
 *
 * @author: QiJingJing
 * @create: 2021/8/6
 */
public class User {
    /**
     * 用户编号
     */
    private int id;
    /**
     * 姓名
     */
    private String username;
    /**
     * 住址
     */
    private String address;

    public void setId(int id) {
        this.id = id;
    }

    public User() {
    }

    public User(String username, String address) {
        this.username = username;
        this.address = address;
    }

    public int getId() {
        return this.id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return this.username;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAddress() {
        return this.address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

1.5、编写Mybatis工具类(获取SqlSession对象)

package com.lili.utils;

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 java.io.IOException;
import java.io.InputStream;

/**
 * 获取sqlSession对象
 *
 * @author: QiJingJing
 * @create: 2021/8/6
 */
public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // 获取sqlSessionFactory
            InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取sqlSession对象
     */
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

1.6、编写Mapper接口类

public interface UserMapper {
    /**
     * 查询所有操作
     */
    List<User> findAll();
}

1.7、编写Mapper.xml配置文件


DOCTYPE mapper
        PUBLIC "-//mapper.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lili.dao.UserMapper">
    
    <select id="findAll" resultType="com.lili.entity.User">
        select *
        from user
    select>
mapper>

1.8、编写测试类

public class MybatisTest {
    @Test
    public void userDaoTest() {
        // 放到 try 里面sqlSession会自动关闭
        try (SqlSession sqlSession = MybatisUtil.getSqlSession()) {
            // 执行sql
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = mapper.findAll();
            userList.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.9、运行测试,结果如下

User{id=1, username='詹姆斯', address='克里夫'}
User{id=2, username='科比', address='洛杉矶'}
User{id=3, username='保罗', address='洛杉矶'}
User{id=4, username='苏炳添', address='中国'}

2、CRUD

2.1、select

  • select语句的属性

    • id

      • 命名空间中唯一标识符
      • 接口中的方法必须与映射文件中的SQL语句ID一一对应
    • parameterType

      • 传入SQL的参数类型。【如果参数过多可以使用Map】
    • resultType:

      • SQL语句返回值类型。【完整的类名或别名】

需求1:根据id查询用户

1.在UserMapper中添加对应方法

public interface UserMapper {
    /**
     * 查询所有操作
     */
    List<User> findAll();
    /**
     * 根据id查询用户
     */
    User findById(@Param("id") int id);
}

2.在UserMapper.xml中添加对应select语句


<select id="findById" parameterType="integer" resultType="com.lili.entity.User">
    select *
    from user
    where id = #{id}
select>

3.测试类中进行测试

   @Test
    public void test2() {
        // 获取SqlSession
        try (SqlSession sqlSession = MybatisUtil.getSqlSession()) {
            // 得到UserMapper对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 执行查询
            User user = mapper.findById(1);
            // 打印
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.输出如下

User{id=1, username='詹姆斯', address='克里夫'}

需求2:根据用户名和住址查询用户

方法一:直接在方法中传递参数

  1. 在接口方法的参数前加 @Param属性

  2. Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

User findByUA(@Param("username") String username,@Param("address") String address);
 <select id="findByUA" resultType="com.lili.entity.User">
        select *
        from user
        where username = #{username}
          and address = #{address}
    </select>

方法二:使用Map传参

1.在接口方法上,直接使用map参数

User findByMap(Map<String,Object> map);

2.UserMapper.xml

<select id="findByMap" parameterType="map" resultType="com.lili.entity.User">
    select *
    from user
    where username = #{username}
      and address = #{address}
select>

3.在使用方法的时候,Map的key为sql中取得值即可,没有顺序要求

Map<String,Object> map = new HashMap<>();
map.put("username","苏炳添");
map.put("address","中国");
// 执行查询
User user = mapper.findByMap(map);

2.2、insert

需求:给数据库增加一个用户

1.在UserMapper中添加对应方法

int addUser(User user);

2.UserMapper.xml

 <insert id="addUser" parameterType="com.lili.entity.User">
        insert into user (`id`, `username`, `address`)
        values (#{id}, #{username}, #{address})
    insert>

3.测试代码

User user = new User();
user.setId(5);
user.setUsername("齐菁菁");
user.setAddress("河南");
// 执行添加
int i = mapper.addUser(user);
System.out.println(i);
// 注意:增删改操作必须提交
sqlSession.commit();

2.3、update

需求 :把id为5的地址改为中国

1.在UserMapper中添加对应方法

 int update(@Param("address") String address,@Param("id") int id);

2.UserMapper.xml

 <update id="update" >
        update user
        set address = #{address}
        where id = #{id}
    update>

3.测试代码

 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            int i = mapper.update("中国", 5);
            System.out.println(i);
            // 注意:增删改操作必须提交
            sqlSession.commit();

2.4、delete

需求 :根据id删除一个用户

1.在UserMapper中添加对应方法

int deleteById(@Param("id") int id);

2.UserMapper.xml

<delete id="deleteById" >
        delete from user where id = #{id}
    delete>

3.测试代码

 int i = mapper.deleteById(1);
            System.out.println(i);
            // 注意:增删改操作必须提交
            sqlSession.commit();

小结:

  • 所有的增删改操作都需要提交事务!

  • 接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!

  • 有时候根据业务的需求,可以考虑使用map传递参数!

  • 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

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