MyBatis专栏2 - 进阶(引入外部配置文件, 类型参数设置)

01.引入外部properties文件

1, 创建外部配置文件

在工程的resources目录下面创建关于数据库信息的jdbc.properties文件, 内容如下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

2, 在主配置文件中引入文件

这里引入的是上面刚刚创建的jdbc.properties文件

主配置文件: 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>
    <!--  引入外部配置文件  -->    
    <properties resource="jdbc.properties"></properties>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/nengli51/UserDao.xml"></mapper>
    </mappers>
</configuration>

3. 测试

略(使用上一节编写的代码能够正常操作数据库)

02.设置类型别名

第一种方式: 单个定义

主配置文件: SqlMapConfig.xml

<!-- 进阶02.设置类型别名   -->
    <typeAliases>
        <typeAlias type="com.nengli51.pojo.User" alias="user"></typeAlias>
    </typeAliases>

Mapper配置文件: resources/com/nengli51/UserDao.xml文件

<mapper namespace="com.nengli51.dao.UserDao">
    <!-- 进阶2: 在主配置文件设置的类型别名, 于是在当前文件可以简写作为替换   -->
    <select id="findUser" resultType="user" parameterType="int">
        select *
        from user
        where uid = #{id};
    </select>
    <select id="findAll" resultType="user">
        select *
        from user
    </select>

    <insert id="addUser" parameterType="user">
        insert into user
        values (null, #{username}, #{sex}, #{birthday}, #{address})
    </insert>

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

    <update id="updateUser" parameterType="user">
        update user
        set username=#{username},
            sex=#{sex},
            birthday=#{birthday},
            address=#{address}
        where uid = #{uid}
    </update>
</mapper>

第二种方式: 指定文件或者指定路径

原理: 设置package为别名, 则该package目录下的类型文件都可以被直接缩写使用

    <mappers>
        <!-- 方式一:引入映射文件路径       -->
<!--        <mapper resource="com/nengli51/dao/UserDao.xml"></mapper>-->
        <!-- 方式二:扫描接口 单个Mapper配置文件制定-->
<!--        <mapper class="com.nengli51.dao.UserDao"></mapper>-->
        <!-- 方式三:扫描接口 批量Mapper配置文件制定-->
        <package name="com.nengli51.dao"/>
    </mappers>

03.抽取SQLSessionFactory为单例

package com.nengli51.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;

/**
 * @Date 2021/2/5
 */
public class MyBatisUtils {
    
    

    private static SqlSessionFactory sqlSessionFactory = null;
    static{
    
    
        InputStream is = null;
        try {
    
    
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            is = Resources.getResourceAsStream("SqlMapConfig.xml");
            sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                is.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取SqlSessionFactory
     */
    public static SqlSessionFactory getSqlSessionFactory(){
    
    
        return sqlSessionFactory;
    }

    /**
     * 提交事务, 关闭SqlSession
     */

    public static void commitAndClose(SqlSession sqlSession){
    
    
        sqlSession.commit();
        sqlSession.close();
    }

    public static void rollbackAndClose(SqlSession sqlSession){
    
    
        sqlSession.rollback();
        sqlSession.close();
    }
}

测试使用

@Test
public void testSingleInstance(){
    
    
    SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
    UserDao userDao = sqlSession.getMapper(UserDao.class);
    List<User> all = userDao.findAll();
    for (User user : all) {
    
    
        System.out.println(user);
    }
    MyBatisUtils.commitAndClose(sqlSession);
}

04.parameterType深入

1, SQL语句需要一个参数: 使用简单数据类型参数

2, 多个参数: (1), 使用对象封装;(2), 使用map类型;(3), 如果参数复杂, 可以使用对象封装对象.

创建代表查询参数的Bean

package com.nengli51.pojo;

import lombok.Data;

/**
 * @Date 2021/2/5
 */
@Data
public class QueryBean {
    
    
    private int id;
}

创建Dao

package com.nengli51.dao;

import com.nengli51.pojo.QueryBean;
import com.nengli51.pojo.User;

public interface UserDao2 {
    
    
    User findUser(QueryBean queryBean);
}

创建配置文件

<?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.nengli51.dao.UserDao2">
    <!-- 测试Parameter类型:2, 对象作为参数类型 -->
    <select id="findUser" resultType="user" parameterType="com.nengli51.pojo.QueryBean">
        select *
        from user
        where uid = #{id};
    </select>
</mapper>

修改核心配置文件

<?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>
    <!-- 进阶01.引入外部配置文件  -->
    <properties resource="jdbc.properties"></properties>
    <!-- 进阶02.设置类型别名   -->
    <typeAliases>
        <!--  方式1: 单个类型定义
        <typeAlias type="com.nengli51.pojo.User" alias="user"></typeAlias>
        -->
        <!--  方式2: 批量定义类型别名   -->
        <package name="com.nengli51.pojo"></package>
    </typeAliases>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 方式一:引入映射文件路径       -->
<!--        <mapper resource="com/nengli51/dao/UserDao.xml"></mapper>-->
        <!-- 方式二:扫描接口 单个Mapper配置文件制定-->
<!--        <mapper class="com.nengli51.dao.UserDao"></mapper>-->
        <!-- 方式三:扫描接口 批量Mapper配置文件制定-->
        <package name="com.nengli51.dao"/>
    </mappers>
</configuration>

测试

package com.nengli51;

import com.nengli51.dao.UserDao2;
import com.nengli51.pojo.QueryBean;
import com.nengli51.pojo.User;
import com.nengli51.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

/**
 * @Date 2021/2/5
 */
public class TestMybatisDemo3 {
    
    
    @Test
    public void testMethod(){
    
    

        SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession();
        UserDao2 userDao = sqlSession.getMapper(UserDao2.class);
        QueryBean queryBean = new QueryBean();

        queryBean.setId(1);
        User user = userDao.findUser(queryBean);
        System.out.println(user);
    }
}

猜你喜欢

转载自blog.csdn.net/malipku/article/details/113705238