MyBatis 专栏 - 进阶 (引入外部配置文件, 类型参数设置)
发布于: 2021 年 02 月 05 日

01.引入外部 properties 文件
1, 创建外部配置文件
在工程的 resources 目录下面创建关于数据库信息的 jdbc.properties 文件, 内容如下
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8jdbc.username=rootjdbc.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();    }}复制代码
 测试使用
@Testpublic 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 */@Datapublic 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);    }}复制代码
 划线
评论
复制
发布于: 2021 年 02 月 05 日阅读数: 28
版权声明: 本文为 InfoQ 作者【小马哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/a41033550c6b005ab7f8e2416】。文章转载请联系作者。


小马哥
关注
自强不息,厚德载物 2018.12.22 加入
像一棵竹子那样, 不断的扎根积累, 活出节节高的人生!











 
    
评论