Mybatis笔记

1.搭建Mybatis

导入关键jar包

  • log4j-api-2.11.2.jar
  • log4j-core-2.11.2.jar
  • log4j-slf4j-impl-2.11.2.jar
  • slf4j-api-1.7.30.jar

配置db.properties

jdbc.url=jdbc:mysql://localhost:3306/book
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.userName=root
jdbc.passWord=123456

导入xml文件

<properties resource="db.properties"></properties>

导入log4j2.xml文件(详细)

<?xml version="1.0" encoding="UTF-8"?>
<!--设置log4j2的自身log级别为warn-->
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
    当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="warn" monitorInterval="30">
    <!--全局参数-->
    <Properties>
        <!--<Property name="logPath">/export/Logs/bt-middle-data-main</Property>-->
        <Property name="logPath">/Users/lihongxu6/log/bt-middle-data-main</Property>
    </Properties>
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <!--<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}-%t] [%p] - %l - %m%n"/>
        </console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <!--<File name="log" fileName="log/test.log" append="false">-->
        <!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
        <!--</File>-->
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,
        则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${logPath}/info.log"
                     filePattern="${logPath}/info_%d{yyyy-MM-dd}.log">
            <!--<Filters>-->
                <!--&lt;!&ndash;控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)&ndash;&gt;-->
                <!--<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->
                <!--&lt;!&ndash;<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>&ndash;&gt;-->
            <!--</Filters>-->
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}-%t] [%p] - %l - %m%n"/>
            <Policies>
                <!--按照filePattern 时间单位 interval 间隔生成文件-->
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                <!--定了当日志文件达到了指定的size时,触发rollover操作。size参数可以用KB、MB、GB等做后缀来指定具体的字节数-->
                <!--<SizeBasedTriggeringPolicy size="1G"/>-->
            </Policies>
        </RollingFile>

    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和hibernate的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.elasticsearch" level="INFO">
        </logger>
        <logger name="com.jd.jsf.gd" level="warn">
        </logger>
        <logger name="org.mybatis" level="INFO">
        </logger>
        <!-- 将业务dao接口填写进去,并用控制台输出即可 -->
        <logger name="com.jd.bt.middle.data.repository" level="debug" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
        </logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
        </root>
    </loggers>

</configuration>

配置下划线,如果value="false",Mapper.xm文件的select语句中若不是返回ResultMap而是ResultType则返回字段不会进行驼峰命名,javabean中的属性必须与其对应。

<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

起别名

 <!--    起别名-->
    <typeAliases>
        <!--        <typeAlias type="com.lanou.mybatis.pojo.Employee" alias="emp"></typeAlias>-->
        <!--        默认小写-->
        <typeAlias type="com.lanou.mybatis.pojo.Employee"></typeAlias>
        <!--<package name="com.lanou.mybatis.pojo.Employee"/>-->
    </typeAliases>

一般会设置两个environment一个用户开发环境,使用id为development,一个用于正式环境使用id为final,那么通过配置,environments的default属性就能选择使用对应的environment了
JDBC – 声明使用jdbc方式来提交和回滚事务,依赖于从数据源得到的连接来管理事务范围。
POOLED – 声明使用数据库连接池,从而避免频繁的创建和销毁链接造成资源的浪费

<environments default="development">
        <environment id="development">
            <!--            事务管理器-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--                <property name="driver" value="com.mysql.jdbc.Driver"/>-->
                <!--                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
                <!--                <property name="url" value="jdbc:mysql://localhost:3306/book?useSSL=false"/>-->
                <!--                <property name="username" value="root"/>-->
                <!--                <property name="password" value="123456"/>-->
                <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>

mapper配置的几种方式:resource、url、class、package

resource形式:路径为xml映射文件的路径包名+文件名。

url形式:路径对应的是网络上了某个文件,注意file:// 前缀 +路径+文件名

class形式:class实际上是接口,写的是接口的全名。

package形式:扫描包的形式

 <mappers>
        <mapper resource="EmployeeMapper2.xml"/>
<!--        <mapper resource="com/lanou/mybatis/dao/EmployeeMapper2.xml"/>-->
<!--        <mapper class="com.lanou.mybatis.dao.EmployeeMapper"/>-->
        <mapper resource="com/lanou/mybatis/dao/EmployeeMapper.xml"/>
        <mapper resource="com/lanou/mybatis/dao/EmployeeMapperPlus.xml"/>
<!--        批量注册-->
<!--        <package name="com.lanou.mybatis.pojo"/>-->
    </mappers>

测试类(controller层)

 private SqlSession getSqlSession() throws IOException {
        //根据全局配置文件 利用SqlSessionFactoryBuilder创建SqlSessionFactory
     //mybatis的配置文件
        String resource = "mybatis-config.xml";
     // 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)TestHotel.class.getClassLoader()
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //获取sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取sqlSession
        //建立会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
public void addMybatis() {
        SqlSession openSession = null;
        try {
            openSession = getSqlSession();
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee employee = new Employee("测试","121","女");
//            Employee employee = new Employee();
//            employee.setLastName("测试");
//            employee.setEmail("121");
//            employee.setGender("女");
            mapper.addEmp(employee,1);//执行方法 传入did
            System.out.println(employee);
            openSession.commit();//提交事务
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            openSession.close();//关闭会话
        }
    }

接口(dao层接口)

@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。

Integer addEmp(@Param("emp") Employee employee,@Param("did")Integer id);

Mapper

useGeneratedKeys=true表示使用数据库自动增长的主键,keyColumn用于指定数据库table中的主键,keyProperty用于指定传入对象的成员变量(要明确指定id,尤其多表!)

<insert id="addEmp" parameterType="com.lanou.mybatis.pojo.Employee" useGeneratedKeys="true" keyColumn="id" >
        insert into t_employee(last_name,email,gender,d_id) value (#{emp.lastName},#{emp.email},#{emp.gender},#{did})
    </insert>

xml多表查询映射设置

<resultMap id="MySimpleEmp" type="com.lanou.mybatis.pojo.Employee">
<!--        columb指定哪一列
            property对应javaBean属性
            -->
        <id column="id" property="id"/>
<!--        定义普通列封装规则-->
        <result column="last_name" property="lastName"/>
<!--        其他不指定会自动 -->
        <result column="email" property="email"/>
        <result column="gender" property="gender"/>
        <result column="d_id" property="dept.id"/>
        <result column="dept_name" property="dept.name"/>
<!--       映射,autoMapping="true"开启自动映射-->
<!--        <association property="t_dept" javaType="com.lanou.mybatis.pojo.Department" autoMapping="true">-->
<!--            <id column="d_id" property="dept.id"/>-->
<!--            <result column="dept_name" property="dept.name"/>-->
<!--        </association>-->
    </resultMap>
<!--    resultMapd自定义结果集映射规则-->
    <select id="getEmpById" resultMap="MySimpleEmp">
        select id,last_name,email,gender from t_employee where id=#{id}
    </select>

resultType:

1、基本类型 :resultType=基本类型

2、List类型: resultType=List中元素的类型

3、Map类型

  • 单条记录:resultType =map

    返回单条记录的map,key为属性,值为属性值。resultType为map

  • 多条记录:resultType =Map中value的类型

    返回多条记录的map,key为任意一属性,值为对象类型。如Map<String,Employee>,resultType为Employee

    返回多条记录的map时,key为任意一属性,值为对象类型,不过key需要通过@MapKey("lastName")指定对象中一个属性名为key

    //多条记录封装一个map Map<String,Employee>键是这条记录的主键,值是记录封装后javaBean
        //@MapKey 告诉mybatis封装这个的时候使用哪个属性作为map的key
        @MapKey("lastName")
        Map<String,Employee> getEmpBylastNameReturnMap(String lastName);
    
    
<select id="getEmpBylastNameReturnMap" resultType="com.lanou.mybatis.pojo.Employee">
        select id,last_name,email,gender from t_employee where last_name like #{lastName}
    </select>
posted @ 2020-09-12 10:31  寐  阅读(64)  评论(0)    收藏  举报