Mybatis小白入门实现CRUD详解(增删改查)(一)

什么是Mybatis?

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

Mybatis:传统的JDBC代码太过复杂。简化。框架。自动化

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件
  • 易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql

简而言之,Mybatis用来简化JDBC的操作

如何获得Mybatis

在Maven项目中添加依赖即可

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>x.x.x</version>
</dependency>

创建一个模块:

编写Mybatis核心配置文件:

  • 在resource文件夹中创建mybatis-config.xml文件,这是Mybatis的核心配置文件(包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager))
  • XML 头部的声明,它用来验证 XML 文档的正确性。
  • environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息
<?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="com.mysql.cj.jdbc.Driver"/>
<!--                &amp为xml文件中&的转义-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="自己数据库的用户名"/>
                <property name="password" value="自己数据库的密码"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例

//这里的resource为上面编写的mybatis核心配置文件
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

从 SqlSessionFactory 中获取 SqlSession

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句

SqlSession sqlSession=sqlSessionFactory.openSession(true);

这里小编实现简单的CRUD作为演示

编写一个工具类MybatisUtils:

工具类主要实现构建SqlSessionFactory,然后用SqlSessionFactory对象来获得SqlSession的实例

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;

//sqlSessionFactory
public class MybatisUtils {


    //提升作用域,构建sqlsessionFactory
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        try {
            //获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";//此文件名必须与自己编写的Mybatis核心配置文件名一致
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /*
    从 SqlSessionFactory 中获取 SqlSession
    既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
     */
     //编写一个静态的获取sqlsession的方法,返回sqlsession
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
}

编写完工具类后,我们可以通过这个方法直接获取sqlSession实例,SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。我们可以通过 SqlSession 实例来直接执行已映射的 SQL 语句

编写实体类:

这里简单用User作为实体类案例:

public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

编写dao层实现CRUD的接口

主要实现用户的增删改查操作以及一些Mybatis使用细节

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import pojo.User;

import java.util.List;
import java.util.Map;

public interface UserMapper {
    //查询所有用户
    List<User> getUserList ();

    //分页
    List<User> getUserByLimit(Map<String,Integer> map);

    //模糊查询
    List<User> getUserLike(String userName);

    //根据ID查询用户
    User getUserById(int id);

    //根据ID查询用户Map版
    User getUserById2(Map<String,Object> map);

    //插入一个用户
    void addUser(User user);

    //修改用户信息
    void updateUser(User user);

    //删除用户信息
    void deleteUser(int id);

    //Map
    void addUser0(Map<String,Object> map );

    //使用map修改用户信息
    void updateUser2(Map<String,Object> map);

    //使用注解修改用户信息
    @Update("update mybatis.user set username = #{userName} where id =#{userID}")
    void updateUser3(@Param("userID") int id,@Param("userName") String userName);
}

编写xml映射器

Mybatis的增删改查实现都在xml中进行,MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

<?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">
<!--namespace=绑定一个Dao/Mapper接口   这里的dao.UserMapper为刚才编写的dao层的接口,实现将xml映射器和接口的绑定-->
<mapper namespace="dao.UserMapper">
<!--    查询语句   id=接口名称  -->
    <select id="getUserList" resultType="User" >
        select * from mybatis.user;
    </select>

    <select id="getUserByLimit" parameterType="map" resultType="pojo.User">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>

<!--模糊查询,根据传入的字符串查询数据库中所有类似的数据-->
    <select id="getUserLike" resultType="pojo.User">
        select *from mybatis.user where username like #{userName}
    </select>

    <select id="getUserById" resultType="pojo.User" parameterType="int">
        select *from mybatis.user where id = #{id}
    </select>

<!--    根据用户id查询map版-->
    <select id="getUserById2" resultType="pojo.User" parameterType="map">
        select *from mybatis.user where id = #{userID}
    </select>

    <insert id="addUser" parameterType="pojo.User" >
        insert into mybatis.user (id, username, password) values (#{id},#{username},#{password})
    </insert>
<!--    使用map插入用户数据
           传递map的key
-->
    <insert id="addUser0" parameterType="map" >
        insert into mybatis.user (id, username, password) values (#{userID},#{userName},#{userPassword})
    </insert>

    <update id="updateUser" parameterType="pojo.User">
        update mybatis.user set username = #{username},password = #{password} where id=#{id}
    </update>

<!--    使用map来修改用户数据-->
    <update id="updateUser2" parameterType="map">
        update mybatis.user set username = #{userName} where id =#{userID}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id}
    </delete>
</mapper>

编写测试类

这里直接使用junit的测试类进行测试

import dao.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.MybatisUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserDaoTest {
    @Test
    public void test(){
        //第一步获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //执行sql,相当于创建了接口的实例化对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = mapper.getUserList();
        //用对象调用方法得到集合
        for (User user : userList) {
            System.out.println(user);
        }

        sqlSession.close();
        //关闭,避免占用资源

    }

    @Test
    public void getUserByLimit(){
        SqlSession sqlSession  = MybatisUtils.getSqlSession();
        Map<String,Integer> map = new HashMap<>();
        map.put("startIndex",0);
        map.put("pageSize",3);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.getUserByLimit(map);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    @Test
    public void getUserById(){
        //获取session对象
        SqlSession sqlSession  = MybatisUtils.getSqlSession();
        //执行sql
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.close();
    }

    //添加用户信息
    //注意,增删改都需要提交事务
    @Test
    public void insertUser(){
        //获取SqlSession对象
        SqlSession sqlSession  = MybatisUtils.getSqlSession();
        //创建一个User对象
        User user = new User();
        user.setId(10);
        user.setUsername("小西");
        user.setPassword("321");
        //执行sql
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.addUser(user);
        sqlSession.commit();
        sqlSession.close();
    }

    //更改用户信息
    @Test
    public void updateUser(){
        //获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //获取实例化对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setId(4);
        user.setUsername("xiaoqiang");
        user.setPassword("147");
        userMapper.updateUser(user);
        sqlSession.commit();
        sqlSession.close();

    }

    @Test
    //删除用户信息
    public void  deleteUser(){
        //获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.deleteUser(5);
        sqlSession.commit();
        sqlSession.close();
    }


    @Test
    //使用Map添加用户信息
    public void addUser(){
        //获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userID",5);
        map.put("userName","Hello");
        map.put("userPassword","5456");


        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.addUser0(map);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    //使用map来查询用户数据
    public void getUserById2(){
        //获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userID",5);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User userById2 = userMapper.getUserById2(map);
        System.out.println(userById2);
        sqlSession.close();
    }

    @Test
    //使用map来修改用户数据
    public void updateUser2(){
        //获取sqlSession
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userName","HuGe");
        map.put("userID",7);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.updateUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }

    @Test
    //模糊查询
    public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.getUserLike("%xiao%");
        for (User user : userList) {
            System.out.println(user);

        }
        sqlSession.close();
    }

    @Test
    //使用注解实现修改数据库内容
    public void updateUser3(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        userMapper.updateUser3(8,"我的饭卡");
        sqlSession.close();
    }


}

需要注意的细节:

  • parameterType:传入的数据类型,这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)

  • resultType:返回的数据类型,类型必须填写完整,例如:我的返回对象类型是pojo包下的User类,则resultType=“pojo.User” 。也可以在Mybatis的核心配置文件中给 Java 类型设置一个缩写名字, 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

<typeAliases>
        <typeAlias type="pojo.User" alias="User"/>
</typeAliases>

这样就可以直接将返回值类型写为resultType="User"

  • 假设我们的实体类或者数据库中的表,字段或者参数过多,外面应当考虑使用map
<insert id="addUser0" parameterType="map" >
    insert into mybatis.user (id, username, password) values (#{userID},#{userName},#{userPassword})
</insert>
//使用Map添加用户信息
public void addUser(){
    //获取sqlSession
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("userID",5);
    map.put("userName","Hello");
    map.put("userPassword","5456");


    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    userMapper.addUser0(map);
    sqlSession.commit();
    sqlSession.close();
}

其他一些重要的细节请参考Mybatis小白入门实现CRUD详解(增删改查)(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值