`
carlosfu
  • 浏览: 584759 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ba8b5055-9c58-3ab0-8a1c-e710f0495d2c
BigMemory实战与理...
浏览量:31592
53b2087e-c637-34d2-b61d-257846f73ade
RedisCluster开...
浏览量:151375
C9f66038-7478-3388-8086-d20c1f535495
缓存的使用与设计
浏览量:125786
社区版块
存档分类
最新评论

MyBatis系列目录--4. MyBatis别名、字段冲突、动态sql、日志、xml其他组件等若干优化

阅读更多

转载请注明出处哈:http://carlosfu.iteye.com/blog/2238662


  一、mybatis执行日志

   加入log4j/logback能看到mybatis更详细的执行情况,以logback为例子

<logback.version>1.0.13</logback.version>
 
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>${logback.version}</version>
</dependency>

 

   配置(logback.xml):默认debug,也可以分开logger去实现(org.apache.ibatis, java.sql)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

 

 

二、实体别名

在xml配置中的resultType和parameterType都需要写全路径类名,这样不太方便,mybatis提供了别名机制解决这个问题。

 

1. 在mybatis-base.xml中添加如下(注意要添加到配置的最前头)

<typeAliases>
    <typeAlias type="com.sohu.tv.bean.Player" alias="Player"/>
</typeAliases>

 

playerMapper.xml在使用resultType和parameterType直接写别名就可以了

<mapper namespace="com.sohu.tv.mapper.playerMapper">
    <select id="getPlayer" parameterType="int" resultType="Player">
        select id,name,age from players where id=#{id}
    </select>
</mapper>

 

 

2. 如果想使得一个package下所有实体类都用简单类名作为别名,可以使用如下配置:

<typeAliases>
    <!-- 
    <typeAlias type="com.sohu.tv.bean.Player" alias="Player"/>
    -->
    <package name="com.sohu.tv.bean"/>
</typeAliases>

三、字段冲突:

1. 产生冲突

(1).  建表

 

CREATE TABLE club(
id INT PRIMARY KEY AUTO_INCREMENT,
name varchar(20) not null comment '俱乐部名称', 
info varchar(255) not null comment '俱乐部简介',
create_date date comment '创建日期',
rank smallint comment '排名'
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='俱乐部表';
INSERT INTO club(name, info, create_date, rank) VALUES('AC', 'AC米兰', '1899-12-26', 5);
INSERT INTO club(name, info, create_date, rank) VALUES('Real Madrid', '皇家马德里', '1902-03-06', 1);
INSERT INTO club(name, info, create_date, rank) VALUES('Inter', '国际米兰', '1908-03-09', 7);

 

(2). 实体类
package com.sohu.tv.bean;
import java.util.Date;
/**
 * 俱乐部
 * 
 * @author leifu
 * @Date 2015年7月28日
 * @Time 下午1:43:53
 */
public class Club {
    /**
     * 俱乐部id
     */
    private int id;
    /**
     * 俱乐部名
     */
    private String clubName;
    /**
     * 俱乐部描述
     */
    private String clubInfo;
    /**
     * 创建日期
     */
    private Date createDate;
     
    /**
     * 排名
     */
    private int rank;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getClubName() {
        return clubName;
    }
    public void setClubName(String clubName) {
        this.clubName = clubName;
    }
    public String getClubInfo() {
        return clubInfo;
    }
    public void setClubInfo(String clubInfo) {
        this.clubInfo = clubInfo;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public int getRank() {
        return rank;
    }
    public void setRank(int rank) {
        this.rank = rank;
    }
    @Override
    public String toString() {
        return "Club [id=" + id + ", clubName=" + clubName + ", clubInfo=" + clubInfo + ", createDate=" + createDate
                + ", rank=" + rank + "]";
    }
 
}

 

(3) Dao

package com.sohu.tv.mapper;
import java.util.List;
 
import com.sohu.tv.bean.Club;
/**
 * 俱乐部Dao
 * @author leifu
 * @Date 2015年8月3日
 * @Time 下午2:30:58
 */
public interface ClubDao {
    /**
     * 获取所有俱乐部信息
     * @return
     */
    public List<Club> getAllClubs();
}

 

(4). 添加clubMapper.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="com.sohu.tv.mapper.ClubDao">
    <select id="getAllClubs" resultType="Club">
        select id,name,info,create_date,rank from club
    </select>
</mapper>
(5). 添加clubMapper.xml到总配置文件中
<mappers>
    <mapper resource="mapper/clubMapper.xml" />
</mappers>

 

(6). 单元测试:
package com.sohu.tv.test.mapper;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.sohu.tv.bean.Club;
import com.sohu.tv.mapper.ClubDao;
/**
 * 俱乐部dao测试
 * 
 * @author leifu
 * @Date 2015年8月3日
 * @Time 下午2:33:04
 */
public class ClubMapperXmlTest extends BaseTest {
    private SqlSession sqlSession;
    @Before
    public void before() {
        sqlSession = sessionFactory.openSession(true);
    }
    @After
    public void after() {
        sqlSession.close();
    }
    @Test
    public void testGetAllClubs() {
        ClubDao clubDao = sqlSession.getMapper(ClubDao.class);
        List<Club> clubList = clubDao.getAllClubs();
        if (clubList != null && !clubList.isEmpty()) {
            System.out.println("clubList size: " + clubList.size());
            for (Club club : clubList) {
                System.out.println(club);
            }
        }
    }
}

 

产生错误:

clubList size: 3
Club [id=1, clubName=null, clubInfo=null, createDate=null, rank=5]
Club [id=2, clubName=null, clubInfo=null, createDate=null, rank=1]
Club [id=3, clubName=null, clubInfo=null, createDate=null, rank=7]

 


 

2. 冲突解决的三种方法:

1.  mysql语句使用别名
<mapper namespace="com.sohu.tv.mapper.clubMapper">
    <select id="selectAllClubs" resultType="com.sohu.tv.bean.Club">
        select id,name as clubName,info as clubInfo,create_date as createDate,rank from club
    </select>
</mapper>

  

2. 使用resultMap做转换
<select id="getAllClubs" resultType="Club" resultMap="clubResultMap">
    select id,name,info,create_date,rank from club
</select>
 
<resultMap type="Club" id="clubResultMap">
    <id property="id" column="id"/>
    <result property="clubName" column="name"/>
    <result property="clubInfo" column="info"/>
    <result property="createDate" column="create_date"/>
    <result property="rank" column="rank"/>
</resultMap>

 

3. 基于约定

以上两种在生产环境都不建议使用,应该按照一个约定实现(例如数据库字段用_隔开,实体类使用驼峰式)

<!--数据库的字段名到pojo类的属性名的自动映射-->
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

例如: create_date 对应 createDate

四、动态sql

1. sql标签:

 

    作用:省去每个sql语句都写一大串字段

 

<sql id="clubColumns">
        id,name,info,create_date,rank
    </sql>
    <select id="getAllClubs" resultType="Club">
        select <include refid="clubColumns"/> from club
    </select>

 

 

2. where标签

作用: sql中的where语句

(1) ClubDao添加如下方法:

 

 

/**
 * 根据名称查询
 * @param name
 * @return
 */
public Club getByName(String name);

 

(2) clubMapper.xml

 

 

<select id="getByName" parameterType="string" resultType="Club">
    select <include refid="clubColumns"/> from club
    <where>
        name = #{name}
    </where>
</select>

 

(3) 单元测试:

 

@Test
public void testGetByName() {
    ClubDao clubDao = sqlSession.getMapper(ClubDao.class);
    Club club = clubDao.getByName("AC");
    System.out.println(club);
}

 

3. set(更新字段), choose(判断), where标签综合使用:

   (1)ClubDao添加如下接口

 

 

import org.apache.ibatis.annotations.Param;
/**
 * 更新俱乐部排名
 * @param id
 * @param rank
 */
public void updateRank(@Param("id") int id, @Param("rank") int rank);
(2) clubMapper.xml添加对应的sql语句

 

<update id="updateRank" parameterType="Club">
    update club
    <set>
        <choose>
            <when test="rank > 0">rank=#{rank}</when>
            <otherwise>rank=0</otherwise>
        </choose>
    </set>
    <where>
        id = #{id}
    </where>
</update>
(3) 单元测试:

 

@Test
public void testUpdateRank() {
    ClubDao clubDao = sqlSession.getMapper(ClubDao.class);
    clubDao.updateRank(1, 1000);
}

4. foreach语句

示例:

(1) ClubDao添加如下接口

 

/**
 * 根据id列表获取俱乐部信息
 * @param ids
 * @return
 */
public List<Club> getByIds(@Param("ids") List<Integer> ids);
(2) clubMapper.xml添加对应的sql语句

 

<select id="getByIds" parameterType="list" resultType="Club">
    select <include refid="clubColumns"/> from club
    <where>
        <foreach collection="ids" item="id" open="AND (" close=")" separator="or">
            id=#{id}
        </foreach>
    </where>
</select>

 

(3)单元测试
@Test
public void testGetByIds() {
    ClubDao clubDao = sqlSession.getMapper(ClubDao.class);
    List<Integer> ids = new ArrayList<Integer>();
    ids.add(1);
    ids.add(2);
     
    printClubList(clubDao.getByIds(ids));
}
 
 private void printClubList(List<Club> clubList) {
    if (clubList != null && !clubList.isEmpty()) {
        System.out.println("clubList size: " + clubList.size());
        for (Club club : clubList) {
            System.out.println(club);
        }
    }        
}

五、properties:

数据库配置可以单独写到一个配置文件中,例如db.properties

football.driver=com.mysql.jdbc.Driver
football.url=jdbc:mysql://localhost:3306/football
football.username=root
football.password=xxxx

 

mybatis全局配置文件中:

<?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="db.properties" />
     
    <settings>
        <setting name="useColumnLabel" value="true" />
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
    <typeAliases>
        <package name="com.sohu.tv.bean" />
    </typeAliases>
     
    <environments default="development">
        <environment id="development">
            <!-- 事务使用的是jdbc的方式 -->
            <transactionManager type="JDBC" />
            <!-- 连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="${football.driver}" />
                <property name="url" value="${football.url}" />
                <property name="username" value="${football.username}" />
                <property name="password" value="${football.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/playerMapper.xml" />
        <mapper class="com.sohu.tv.mapper.PlayerAnnotationDao" />
        <mapper resource="mapper/clubMapper.xml" />
    </mappers>
</configuration>

 

 

3
1
分享到:
评论

相关推荐

    mybatis-3-config.dtd mybatis-3-mapper.dtd

    MyBatis是一个流行的Java持久层框架,它允许程序员将SQL查询与Java代码相结合,从而实现更灵活、高效的数据库操作。在MyBatis中,有两个重要的DTD(文档类型定义)文件,即`mybatis-3-config.dtd`和`mybatis-3-...

    mybatis-3-mapper.dtd,mybatis-3-config.dtd

    - 尽可能利用MyBatis的动态SQL功能,如`if`、`choose`、`when`、`otherwise`等,使SQL更加灵活。 - 对于复杂的结果映射,可以使用`association`和`collection`来处理嵌套的结果集和一对多、多对多的关系。 - 利用...

    mybatis-3-config+mybatis-3-mapper.dtd

    首先,`mybatis-3-config.xml` 是 MyBatis 的主配置文件,它定义了整个 MyBatis 环境的全局设置,包括数据库连接信息、事务管理、日志配置等。在该文件中,你可以配置以下主要元素: 1. **properties**:用于配置...

    mybatis两个重要的dtd文件 batis-3-config.dtd mybatis-3-mapper.dtd

    `mybatis-config.xml`是MyBatis的核心配置文件,它包含了MyBatis运行时的整体配置,如数据源、事务管理器、环境配置、插件、类型别名、对象工厂等。在`batis-3-config.dtd`中,定义了如`configuration`、`properties...

    mybatis-generator-core 附详细使用说明

    MyBatis Generator (MBG) 是一款强大的工具,它能够自动生成MyBatis框架所需的实体类(Entity)、Mapper接口及XML映射文件,极大地提高了开发效率,减轻了开发者手动编写这些模板代码的工作负担。在本篇文章中,我们...

    MyBatis-CRUD-Annotation.zip

    如果某些复杂的SQL或动态SQL更适合写在XML中,可以同时存在一个Mapper接口和对应的XML文件。 7. **事务管理**:在MyBatis中,事务管理通常是通过SqlSession对象进行的。可以通过SqlSession的beginTransaction、...

    spring-boot-mybatis-mysql-demo

    MyBatis的配置通常在`mybatis-config.xml`文件中,这里定义了MyBatis的全局配置,比如类型别名、映射文件位置等。而在`pom.xml`或`build.gradle`文件中,可以看到MyBatis、Spring Boot和MySQL驱动的相关依赖。 ...

    mybatis-generator-core-1.3.2

    在使用 MBG 时,我们需要创建一个 XML 配置文件,其中定义了数据库连接信息、生成的代码样式以及目标目录等关键参数。 在 "mybatis-generator-core-1.3.2" 中,配置文件是整个流程的核心。配置文件通常命名为 `...

    MyBatis-3-User-Guide

    MyBatis支持动态SQL,允许在运行时动态生成SQL语句。 - **if**:根据条件生成SQL片段。 - **choose/when/otherwise**:类似于Java中的`switch`语句。 - **trim/where/set**:用于处理SQL中的空格和逗号等问题。 - *...

    MyBatis3--开发指南(附JavaDB实例)

    - **目录结构**:通常包含以下核心组件:`SqlSessionFactoryBuilder`、`SqlSessionFactory`、`SqlSession`等。 - **SqlSessionFactoryBuilder**:构建`SqlSessionFactory`实例。 ```java SqlSessionFactory ...

    MYBatis总结.docx

    它们可以包含`&lt;select&gt;`、`&lt;insert&gt;`、`&lt;update&gt;`和`&lt;delete&gt;`等元素,分别对应数据库的查询、插入、更新和删除操作,并且可以进行动态SQL构建,提供了很高的灵活性。 在实际应用中,MyBatis通过SqlSessionFactory...

    针对mybatis3 基本环境搭建优化(一) .

    MyBatis 是一款优秀的持久层...综上所述,搭建 MyBatis 基本环境并进行优化,主要是配置 MyBatis 相关文件,设置别名简化类名引用,以及编写高效的 SQL 查询。通过这些步骤,可以有效地提升项目的开发效率和运行性能。

    MyBatis 10道面试题和答案.docx

    1. 灵活性:MyBatis允许直接编写SQL语句,提供了XML标签以支持动态SQL,使得在处理复杂查询时更加灵活。 2. 代码量减少:相比于JDBC,MyBatis极大地减少了代码量,因为它自动处理了连接创建、关闭和参数设置等任务。...

    mybatis-超详细文档-文档

    MyBatis 支持动态 SQL,可以在映射文件中使用 `&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;` 等元素来实现动态 SQL 的拼接。 #### 四、关系映射与性能优化 **1. 关系映射** MyBatis 支持一对一、一对多、多对多等...

    源码:【Spring+MyBatis+MySQL实战入门】一、MyBatis操作入门

    《Spring+MyBatis+MySQL实战入门》系列教程旨在帮助初学者快速掌握这三大核心技术在实际项目中的应用。本文将重点讲解MyBatis操作入门的相关知识,通过源码解析,帮助你深入理解MyBatis的工作原理及使用方法。 1. ...

    mybatis-3.2.8jar包及其源码jar包

    - MyBatis的动态SQL允许在XML映射文件中直接编写条件语句,无需大量if-else逻辑。 - **, , , **:用于条件判断。 - **, **:自动添加SQL的WHERE和SET子句。 - ****:用于遍历集合,生成嵌套的SQL片段。 5. **...

    MyBatis 27道面试题和答案.docx

    5. ORM支持:通过XML标签或注解,MyBatis能实现对象与数据库字段的映射,同时支持对象关系组件的维护。 然而,MyBatis也存在一定的缺点: 1. SQL编写工作量:当涉及到复杂的SQL或大量字段的映射时,SQL编写可能会变...

    springmybatis

    mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:...

Global site tag (gtag.js) - Google Analytics