Live2D
复制代码

03-Mybatis中使用Map集合

1、用Map集合给SQL映射文件中的SQL语句传值

1.1 属性parameterType理解

--parameterType
	1、--该属性是专门给SQL语句传值的
	
	2、--该属性可以采用:
		JavaBean
		简单类型
		Map集合
		...
		
	3、--前面例子使用过JavaBean和简单类型给SQL语句传值,下面测试用Map集合给SQL语句传值
	
	4、--什么情况需要使用Map集合传值而不能用JavaBean传值?
	当JavaBean不够用的时候我们才用Map集合给sql语句传值
		一般情况下,一个表对应一个JavaBean,两张表就需要在实体类包中创建两个JavaBean。
		当sql查询语句中是多表联合查询,条件中要传的值有的是A表中的,有的是B表中的,这样跨表的情况下,就没有合
		适的JavaBean来传值。
		如果我们为了这条SQL语句新建一个存储所需要传值的JavaBean,然后创建对象传值,成本太高了。
		这时我们只需要创建一个Map集合,往集合添加数据时将其key命名为需要传值的表中字段一致即可。
            select
                e.*
            from
                emp e
            join
                dept d
            on
                e.deptno=d.deptno
            where
                d.dname="RESEARCH" and e.job="MANAGER";
        如上面的语句中条件中的两个参数是两个表中的,用Map集合进行传值
        
        5、--使用log4j组件将执行的SQL语句打印到控制台
        	log4j:
        		logger for java,一个第三方组件,为Java语言准备的日志工具
        	很多框架都集成了该组件,如spring、springMVC、mybatis、hibernate等,该组件专门用来记录日志
        --开发中不需要精通log4j,只需要把相关配置和相关jar导入即可
        第一步:
        	在类的根路径下新建一个log4j.properties的配置文件,具体里面写什么,直接百度,不同框架的执行的sql
        	语句输出到控制台的配置不一样。这里我们是mybatis使用log4j,所以搜索 "mybatis log4j sql",如果是
        	spring,就是"spring log4j sql"。
        	注意:高版本即log4j2不再使用properties文件,用的是xml文件配置,mybatis用的是log4j1.x.x
        	
            log4j.rootLogger=DEBUG, Console
            log4j.appender.Console=org.apache.log4j.ConsoleAppender 
            log4j.appender.Console.layout=org.apache.log4j.PatternLayout 
            log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n 
            log4j.logger.org.apache=INFO
            
        第二步:
        	引入log4j的jar包:log4j-1.2.17.jar
        然后直接运行程序即可。

1.2 创建项目进行测试

创建模块项目d-mybatis-parameterType-map,添加jdbc.properties、config.xml、SqlMapper.xml,测试时类MyBatisParameterMapTest01.java以及sql语句打印的日志配置文件log4j.properties,不用新建实体类JavaBean。具体代码如下
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysqlstudy
jdbc.username=root
jdbc.password=rong195302
config.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>

    <!--引入独立的配置文件-->
    <!--mybatis中的resource默认从项目的类路径查找-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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="SqlMapper.xml"/>
    </mappers>
</configuration>

SqlMapper.xml
<?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="test">

    <!--使用Map集合给sql语句传值,占位符中的字段名要和Map集合中的key属性名一致-->
    <!--所以我们给Map集合中添加数据时key属性名一般与表中的字段名一致,javabean传值也一样-->
    <!--
    下面四种种写法都可以
    <insert id="save" parameterType="java.util.Map">
    <insert id="save" parameterType="java.util.HashMap">
    <insert id="save" parameterType="map">
    -->
    <insert id="save" parameterType="Map">
        insert into t_user
            (loginName,loginPwd,realName)
        values
            (#{loginName},#{loginPwd},#{realName})
    </insert>


</mapper>
MyBatisParameterMapTest01.java
package com.mybatis;

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.util.HashMap;
import java.util.Map;

public class MyBatisParameterMapTest01 {

    public static void main(String[] args) {

        SqlSession sqlSession = null;
        try {

            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));

            sqlSession = sqlSessionFactory.openSession();

            //创建Map集合,往集合中添加数据
            Map<String,String> map = new HashMap<>();
            map.put("loginName","6666666@mail.com");
            map.put("loginPwd","8888888");
            map.put("realName","中国大使馆");

            //然后用该集合往sql语句中传值,执行SQL语句
            int count = sqlSession.insert("save",map);
            System.out.println("往数据库中添加了 "+count+" 条数据");
            sqlSession.commit();
        } catch (IOException e) {
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }finally {
            sqlSession.close();
        }

    }

}

log4j.properties
log4j.rootLogger=DEBUG, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender 
log4j.appender.Console.layout=org.apache.log4j.PatternLayout 
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n 
log4j.logger.org.apache=INFO

2、用Map集合存储查询结果集

2.1 属性resultType理解

--resultType
	1、--该属性是专门用来指定查询结果集的封装数据类型
	
	2、--该属性可以采用:
		JavaBean
		简单类型
		Map集合
		...
		
	3、--一定要注意:无论是什么类型,什么情况,resultType属性都不能省略,并且只有select语句才有该属性
		
	4、--前面例子使用过JavaBean封装查询结果集,下面测试用简单数据类型和Map集合封装查询结果集数据
	resultType="Map"的作用:
	就是告诉mybatis在执行完sql查询语句后,将查询结果集中的每一条记录,以该条记录中的列名为key,该条记录中的值
	为value,添加到一个Map集合中,就是说底层的方法执行完该查询sql语句后返回的是查询结果集记录条数个Map集合,
	然后下面java语句:
	List<Map> list = sqlSession.selectList("getNameAndDptByJob","MANAGER");
	就会把这些个Map集合存到List集合中
	resultType="JavaBean类型"的作用:
	告诉mybatis在执行完sql查询语句后,将查询结果集中的每一条记录,将该条记录与JavaBean中属性字段名一致的列名
	的值赋值给JavaBean对象中的对应字段,返回的是一个个JavaBean对象,存储到List集合中

2.2 创建项目进行测试

创建项目e-mybatis-resultType-map,各文件代码如下:
mybatis-config.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>

    <!--引入独立的配置文件-->
    <!--mybatis中的resource默认从项目的类路径查找-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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="SqlMapper.xml"/>
    </mappers>
</configuration>
SqlMapper.xml
<?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="test">
    <!--将查询的数据用简单类型封装保存-->
    <select id="getAllName" resultType="String">
        select
            ename
        from
            emp
    </select>
    
    <select id="getByEname" resultType="Map">
        <!--封装查询数据到Map集合中是以查询结果的列名为key,而列名是可以起别名的-->
        select
            e.ename,e.sal,d.dname
        from
            emp e
        join
           dept d
        on
            e.deptno = d.deptno
        where
            e.ename = #{ename}
    </select>
    
    <select id="getNameAndDptByJob" resultType="Map">
        select
            e.ename,d.dname
        from
            emp e
        join
           dept d
        on
            e.deptno = d.deptno
        where
            e.job = #{job}
    </select>
</mapper>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysqlstudy
jdbc.username=root
jdbc.password=rong195302
log4j.properties
log4j.rootLogger=DEBUG, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender 
log4j.appender.Console.layout=org.apache.log4j.PatternLayout 
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n 
log4j.logger.org.apache=INFO
MyBatisResultTypeTest01.java
package com.mybatis.test;

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.util.List;
import java.util.Map;

public class MyBatisResultTypeTest01 {

    public static void main(String[] args) {

        SqlSession sqlSession = null;

        try {

            //获取核心配置文件信息的SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));

            //开启事务
            sqlSession = sqlSessionFactory.openSession();

            //do work()
            //查询emp表中的所有员工姓名,用String类型封装数据
//            List<String> empList1 = sqlSession.selectList("getAllName");
//            for (String ename:
//                 empList1) {
//                System.out.println(ename);
//            }

            //查询员工"SMITH"的信息,显示名字、薪资和部门名称
            //这里使用Map集合封装查询结果集和String类型给sql语句传值
            //注意是selectOne()方法
            Map<String,String> smithMap = sqlSession.selectOne("getByEname","SMITH");
            System.out.println(smithMap);
            System.out.println("============================================");

            //查询出所有工作岗位为MANAGER的员工,要求显示员工姓名和部门名称
            //这里使用Map集合封装查询结果集和String类型给sql语句传值
            //因为没有合适的javabean封装查询结果集,所以泛型中填Map
                List<Map> list = sqlSession.selectList("getNameAndDptByJob","MANAGER");
            System.out.println(list.toString());

            //提交事务
            sqlSession.commit();
        } catch (IOException e) {
            //出错,回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }finally {
            //关闭资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }

    }

}
posted @ 2021-08-08 23:02  Milen-jie  阅读(838)  评论(0编辑  收藏  举报