Mybatis学习(一)基础操作CRUD

前言:

什么是框架?使用框架有什么好处?
框架就是我们软件开发中的一种解决方案,不同的框架对应解决不同的问题。框架封装了很多细节,使开发者可以使用极简的方式去实现功能,大大的提升了开发效率。

现在学习的Mybatis是三层架构(表现层,业务层,持久层)中持久层相关的。
对于持久层来说,有以下几种解决方案:

  1. JDBC技术:Connection,Statement,ResultSet
  2. Spring的JDBCTemplate:Spring中对JDBC的简单封装
  3. Apache的DBUtils:和上述的很像,也是对JDBC的简单封装

以上都不是框架,JDBC是规范,而后两个是工具类。

Mybatis框架:

一、概述

是一个优秀的基于java的持久层框架,它内部封装了JDBC,使开发者只需要关注sql语句本身,而无需处理加载驱动、创建连接、创建Statement等繁琐的过程。它使用了ORM思想,实现了结果集的封装。可以使用xml和注解方式来配置各种Statement。

ORM:Object Relational Mapping 对象关系映射,就是把数据库表和实体类及实体类的属性对应起来,让我们可以通过操作实体类就可以实现操作数据库表。

二、入门

前面说到,我们可以使用xml和注解的方式来配置Statement,基于开发的角度去想,注解方式十分方便,但是我们是学习者,xml配置我们也是要了解学习的。

如何搭建?

  1. 创建maven工程并在pom.xml中导入坐标(配置xml)
  2. 在src/main/java中创建实体类和dao接口
  3. 在resources中穿件MyBatis的主配置文件SqlMapConfig.xml
  4. 如果是基于xml配置,我们需要按照包名在resources下创建IUserDao.xml

我们需要在pom中导入的坐标如下:

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
    </dependencies>

然后依照包名创建dao接口和实体类:

package com.hty.domain;

import java.io.Serializable;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:35
 */
public class User implements Serializable {

    private Integer id;
    private String username;
    private String sex;
    private String telephone;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

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

}

package com.hty.dao;

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

import java.util.List;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:55
 */
public interface IUserDao {
    /**
     * 通过id获取信息
     * @return
     */
    //@Select("select * from myuser where id = #{id}") 这行是基于注解的
    List<User> getUserById(int id);//通过id查人
}

在resources下创建SqlMapConfig.xml

<?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>
    <typeAliases>
        <typeAlias type="com.hty.domain.User" alias="User"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/project?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="passowrd"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    	<!--基于xml配置实现-->
        <mapper resource="com/hty/dao/User.xml"></mapper>
        <!--基于注解配置实现-->
        <!-- <mapper class="com.hty.dao.IUserDao"></mapper> -->
    </mappers>
</configuration>

然后我们需要在与IUserDao对应的路径下创建User.xml(如果我们是基于注解配置,就不用创建了)
在这里插入图片描述
依照这个目录来创建,具体内容为:
其中,id为接口中的方法名,parameterType为接受的参数类型,resultType为返回的结果类型。

扫描二维码关注公众号,回复: 11234190 查看本文章
<?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的属性值必须使全限定类名 -->
<mapper namespace="com.hty.dao.IUserDao">
    <select id="getUserById" parameterType="int" resultType="com.hty.domain.User">
        select * from myuser where id = #{id}
    </select>
</mapper>

至此,初步搭建环境就完成了,现在我们在test/java下创建一个测试类来测一测。

import com.hty.dao.IUserDao;
import com.hty.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.util.List;

/**
 * @program: day20
 * @author: Semineces
 * @create: 2020-01-20 14:52
 */
public class TestMybatis {

    private InputStream inputStream;
    private SqlSession sqlSession;
    private IUserDao iUserDao;

    @Before
    public void init() throws IOException {
    	//读取xml的时候使用了类加载器,它只能读取类路径的配置文件
        inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
        //创建工厂:mybatis使用了构建者模式,其中SqlSessionFactoryBuilder是构建者
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //使用工厂生产SqlSession对象,就是使用了工厂模式,好处是解耦(降低了类之间的依赖关系)
        sqlSession = sqlSessionFactory.openSession();
        //创建dao接口实现类使用了代理模式
        iUserDao = sqlSession.getMapper(IUserDao.class);
    }

    @Test
    public void testGetUser() {
    	//使用代理对象执行方法
        List<User> users = iUserDao.getUserById(1);
        for (User user : users) {
            System.out.println(user);
        }
    }

    @After
    public void destroy() throws IOException {
    	//释放资源
        sqlSession.close();
        inputStream.close();
    }
    
}

得到控制台输出我们所查到的内容:
在这里插入图片描述
至此,Mybatis的入门搭建,以及简单的小实例成功了。

三、注意事项

1.Mybatis中映射配置文件位置必须与dao接口的包结构相同
2.基于User.xml配置中mapper标签里的namespace属性的取值必须是dao接口的全限定类名
3.映射配置文件的操作配置(select),id属性的取值必须使dao接口的方法名
当我们遵从了这三点后,在开发中就无须写实现类了(因为已经没必要了)。

四、进行CRUD

大概步骤跟前面的差不多,基于xml配置就还是要在User.xml中写sql语句。

	<insert id="insertUser" parameterType="User">
        insert into myuser(username,sex,telephone) values (#{username},#{sex},#{telephone})
    </insert>

    <update id="updateUser" parameterType="User">
        update myuser set username=#{username},sex=#{sex},telephone=#{telephone} where id=#{id}
    </update>

    <select id="getUser" resultType="com.hty.domain.User">
        select * from myuser
    </select>

    <delete id="deleteUser" parameterType="int">
        delete from myuser where id=#{id}
    </delete>

然后我们在接口中添加上述方法:

    void insertUser(User user);

    void updateUser(User user);

    void deleteUser(int id);

    List<User> getUser();

最后在我们的测试类中写测试方法:

@Test
    public void testInsertUser() {
        User user = new User();
        user.setUsername("semineces");
        user.setSex("男");
        user.setTelephone("1111");
        iUserDao.insertUser(user);
        //除了查询操作外,都要使用commit来提交事务
        sqlSession.commit();
    }

    @Test
    public void testGetUser() {
        List<User> users = iUserDao.getUser();
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void testUpdateUser() {
        User user = iUserDao.getUserById(1);
        user.setSex("女");
        iUserDao.updateUser(user);
        sqlSession.commit();
    }

    @Test
    public void testDeleteUser() {
        iUserDao.deleteUser(2);
        sqlSession.commit();
    }

至此,我们就已经实现完mybatis的入门CRUD操作了,如果是基于注解开发,则用select注解将sql语句写在IUserDao接口的方法上方。

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/104058700