Mybatis-3-适合初学

目录

8.生命周期和作用域

9.解决属性名和字段名不一致的问题

10.resultMap

11.日志工厂

 12.分页


8.生命周期和作用域

生命周期,和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题

SqlSessionFactoryBuilder

  1. 一旦被创建,就不再需要他了
  2. 局部变量就够啦!

sqlSessionFactory:

  1. 可以说是数据库连接池
  2. sqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它活着重新创建另一个实例
  3. 如果多次重建,程序会崩溃,浪费内存资源
  4. SqlSessionFactory的最佳作用域是应用作用域
  5. 最简单的就是使用单例模式或者静态单例模式

sqlSession:

  1. 连接到连接池的一个请求
  2. sqSession的实例不是线程安全的,因此不可以被共享,所以他的最佳作用域是请求或者方法作用域
  3. 用完后赶紧关闭请求,否则资源被占用

每个mapper代表一个业务

 

9.解决属性名和字段名不一致的问题

数据库中的字段

然后测试中的实体类定义的是

public class User {
     private int id ;
     private String name;
     private String password;

 测试的结果:不会报错,只是pwd本来是123,变成现在的null,这就是属性名和数据库的字段不一致导致的 问题,那怎么解决???

select*from all where id=#{id};

类型处理器

select id name pwd from user where id=#{id};

解决方法:①:起别名,在sql语句中加入as password(尽量不要用这种)

select  id name pwd as password from mybatis.user where id=#{id};

②:用resultMap结果集去映射

id name pwd ----》id name password

<!--    coulumn相当于数据库中的字段,property相当于实体类的属性-->
    <resultMap id="UserMap" type="User">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    </resultMap>
   <select id="getUser" resultMap="UserMap">
       select  *from  mybatis.user where id=#{id};
   </select>

这样运行的结果和之前不一样的是password!=null,二十等于123456

10.resultMap (以后说)

  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
  • <resultMap id="userResultMap" type="User">
      <id property="id" column="user_id" />
      <result property="username" column="user_name"/>
      <result property="password" column="hashed_password"/>
    </resultMap>
    <select id="selectUsers" resultMap="userResultMap">
      select user_id, user_name, hashed_password
      from some_table
      where id = #{id}
    </select>

11.日志工厂

如果一个数据库操作,出现了异常,我们要排错,日志就是i最好的工具!

曾经:sout,debug

现在:日志工厂

SJF4  LOG4J  LOG4J2 JDK_LOGGING COMMONS_LOGGING STDOUT_LOGGING  NO_LOGGING

在Mybatis中具体使用哪一种日志,在设置中设定                             value的值

 这里要注意:!!!空格不要打多,没有空格不要加空格,会导致报错,识别不了

这是:STDOUT_LOGGING

<!--    设置日志文件,位置要知道在哪里-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

 以下是运行结果

 这是LOG4J(这个需要导入包)什么是log4j?通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件;也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

第一步:先导入log4j的包(在pom.xml)

    <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

第二步:在资源目录下创建log4j.properties

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

第三步:在mybatis中设置属性

<!--    </settings>-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

第四步简单测试:1.再要使用log4j中的类中导入正确的包

import org.apache.log4j.Logger;

                             2.日志对象加载参数为当前类的class名字

static Logger logger = Logger.getLogger(UserMapper.class);

                             3.测试结果:生成到配置文件中写的那个位置

log4j.appender.D.File = ./log/bin.log

4.日志级别:

      logger.info("info:进入log4j");
        logger.debug("debug:进入log4j");
        logger.error("error:进入log4j");

 12.分页

为什么要分页??数据量太大了,分页显示,展示数据,减少数据的处理量

使用Limit分页

第一步定义接口

 List<User>  getUserByLimit(Map<String,Integer>map);

第二步:在配置文件中完成接口

   <select id="getUserByLimit" parameterType="map" resultType="user">
        select *from mybatis.user limit #{startIndex},#{pageSize};
    </select>

第三步测试

    @Test
    public void getUserByLimit(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, Integer> map = new HashMap<String,Integer>();
        map.put("startIndex",0);
        map.put("pageSize",2);

        List<User> userList = mapper.getUserByLimit(map);
        for (User user : userList) {
            System.out.println(user);

        }
        sqlSession.close();

    }

特别强调的一个问题:关于resultType和resultMap的问题

使用方法:当你没有写结果集映射就不要使用resultMap了,如果想用就和下面代码一样操作

column是数据库的字段,result 可以加很多东西,如果你很多和数据库不匹配的话,property是实体类的成员

    <resultMap id="userMap" type="user">

        <result property="pwd" column="pwd"/>
    </resultMap>
    <select id="getUserByLimit" parameterType="map" resultMap="userMap">
        select *from mybatis.user limit #{startIndex},#{pageSize};
    </select>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值