学习笔记之mybatis

236 阅读1分钟

一、引入依赖

1、Maven Repository搜索mybatis

本文使用3.5.3版本。

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>

2、引入MySQL驱动包,本文使用8.0版本MySQL数据库

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

二、mybatis配置

1、核心配置文件

在resources下创建mybatis-config.xml文件,用于创建SqlSessionFactory对象,参考mybatis官方介绍

<?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>
    <!--通过default可以切换不同环境数据库-->
    <environments default="development">
        <!--8.0版本数据库链接配置如下-->
        <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/数据库名?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"/>
                <property name="username" value="root"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        
        <environment id="product">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="root"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--配置Mapper地址,例如:xxx/xxx/xxx/mapper.xml-->
        <mapper resource="${mapper}"
    </mappers>
</configuration>

三、使用

1、获取SqlSession

封装获取SqlSession的工具类

public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    //静态代码块,类加载的时候执行一次
    static {
        String resource = "mybatis-config.xml";
        InputStream is = null;
        try {
            is = Resources.getResourceAsStream(resource);
            sqlSessionFactory =new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    public  static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

    public  static void close(SqlSession sqlSession){
        if (sqlSession!=null) {
            sqlSession.close();
        }
    }
}

2、dao接口

public interface UserDAO {

    int save(User user);

    int update(User user);

    int delete(int id);

    List<User> queryAll();

}

3、mapper配置文件

<?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 namespace="UserDAO">
    <!--
    1、id与dao接口中方法保持一致
    2、parameterType入参类型
    3、keyProperty将id赋值给入参user的id
    4、useGeneratedKeys主键自增
    5、#{param}表示user对象param的值
    -->
    <insert id="save" parameterType="User" keyProperty="id" useGeneratedKeys="true">
        insert into t_user values (#{id},#{name},#{age})
   </insert>
   <!--通过id更新数据-->
   <update id="update" parameterType="User">
        update t_user
        <set>
        <!-- set标签可以动态去除赋值语句前后多余的逗号 -->
            <if test="name!=null and name!=''">
                name = #{name},
            </if>
            <if test="age !=0">
                age = #{age}
            </if>
        </set>
        where id = #{id}
    </update>

    <delete id="delete" parameterType="Integer">
        delete  from  t_user where id = #{id}
    </delete>
    
     <!-- 抽取公共sql语句 -->
    <sql id="queryUser">
        select id,name,age from t_user
    </sql>
    <!--resultType返回值类型,如果返回多条数据,mubatis会自动封装为List<User>-->
    <select id="queryAll" resultType="User">
        <!--引入sql语句-->
        <include refid="queryUser"/>
    </select>
</mapper>

4、在mybatis-config.xml文件注册mapper.xml

<mappers>
   <mapper resource="xxx/xxx/xxxx/UserMapper.xml"/>
   <!--注册其他mapper-->
   <mapper resource="xxx/xxx/xxxxx/xxxx.xml"/>
</mappers>

5、测试增删改查

SqlSession sqlSession = null;
    try {
        sqlSession = MybatisUtil.getSqlSession();
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
        //增
        User user =new User();
        user.setName("小明");
        user.setAge(10);
        int num = userDAO.save(user);
        //改
        User user =new User();
        user.setId(1);
        user.setName("小黑");
        user.setAge(15);
        int num = userDAO.update(user);
        //查
        List<User> list = userDAO.queryAll();
        //删
        userDAO.delete(1);
        
        //执行commit,才会写入数据库
        sqlSession.commit();
    } catch (Exception e) {
        sqlSession.rollback();
        e.printStackTrace();
    } finally {
        MybatisUtil.close(sqlSession);
    }

三、resultType和resultMap区别

resultType返回简单对象,即对象中不含有对象;resultMap返回复杂对象,例如A对象中含有B对象。

1、resultMap的使用

对象A

private int id;
private String name;
private int age;

private B b;

对象B

private int id;
private String cardNo;
private String address;

mapper.xml

<!--id唯一标识-->
<resultMap id="queryMap" type="A">
    <!--id为主键,其他使用result标签-->
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <!--
    1、property A中B对象的属性名
    2、返回是对象使用association
    3、返回是集合使用collection
    -->
    <association property="b" javaType="B">
        <id column="iid" property="id"/>
        <result  column="icardNo" property="cardNo"/>
        <result  column="address" property="address"/>
    </association>
</resultMap>

<select id="queryAll" resultMap="queryMap">
</select>