MyBatis基础小记

MyBatis基础小记

Scroll Down

1. 配置文件基本结构(只列出了部分重要的):

<?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/>    <!--可引入属性文件供下面使用-->
<settings/>
<typeAliases/>   <!--类型别名,很有用-->
<plugins/>       <!--配置插件的-->
<environments default="development">
  <!--支持多环境配置-->
  <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
       <property name="driver" value="${driver}"/>
       <property name="url" value="${url}"/>
       <property name="username" value="${username}"/>
       <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>
<mappers>          <!--mapper的xml配置位置-->
<mapper resource="classpath:/mapper/*.xml"/>
</mappers>
</configuration>

2. MyBatis中的几大对象:

  • SqlSessionFactoryBuilder:用于创建SqlSessionFactory的对象
  • SqlSessionFactory:核心中的核心对象,整个数据库的连接就靠它,应用周期存在
  • SqlSession:非线程安全,不是共享的,每个线程都会有自己的,获得一个SqlSession实例就相当于获取一个JDBC连接,使用完即关闭。
  • Mapper实例:即我们编写的Mapper接口或者编写的接口的XML来进行映射

3. MyBatis的基本使用:

1. 通过XML、Java代码创建SqlSessionFactory,示例:

//XML创建,代码创建不怎么常用

String resource = "classpath:mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2. 通过SqlSessionFactory获取SqlSession对象,示例:

//使用完需要关闭
SqlSession sqlSession=sqlSessionFactory.openSession();

3. 通过SqlSession在我们要使用的地方调用Mapper(假设已经创建)的方法,示例:

//Mapper的创建
//方法一:接口加注解
//接口:UserMapper.java

interface UserMapper
{
  @Select("SELECT * FROM t_user WHERE email = #{email}")
  User EgetUserByEmail(String email);
}


//方法二:接口加XML配置文件
//接口:


interface UserMapper
{
  User EgetUserByEmail(String email);
}
//配置文件:UserMapper.xml
//注意:需要在配置文件中指定该XML文件的位置使用<mapper>标签
//编写Mapper的XML配置的时候注意使用namespace命名空间

<?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.clay.mybatis.mapper.UserMapper">
  <select id="getUserByEmail" resultType="com...User">
    SELECT * FROM t_user WHERE email = #{email}
  </select>
</mapper>


//假设mapper里面我们定义了如下方法
//接口:UserMapper
//方法:User getUserByEmail(String email)
//包:com.clay.mybatis.mapper
//方法一:

User user = sqlSession.selectOne("com.clay.mybatis.mapper.UserMapper.getUserByEmail","4555555555@outlook.com");


//方法二:最好

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserByEmail("65659989@outlook.com");

4. MyBatis常用内置别名:

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

5. 动态SQL:

  • 语句判断条件:
<select id="getUserByEmail"
     resultType="com....User">
  SELECT * FROM t_user WHERE email = #{email}
  <if test="state != null">
    AND state = 'ACTIVE'    
    <!--如果传入对象的state字段不为空,获取激活的用户-->
  </if>
</select>

  • 选择语句:
<select id="getUserByEmail"
     resultType="com....User">
  SELECT * FROM t_user WHERE email = #{email}
  <choose>
    <!--以下任选一个执行-->
    <when test="state != null">
      AND state = 'ACTIVE'
    </when>
    <when test="id != null">
      AND id = '0'
    </when>
    <otherwise>    <!--以上都不执行的情况-->
      AND featured = 1
    </otherwise>
  </choose>
</select>

  • 批量操作:
<!--
方法定义:void addUser(List<User> list);
-->
<select id="addUser">
  INSERT INTO t_user(name,password)
  <!--
    separtor是指明下面两条插入语句的分隔符
    open="("和close=")":是让我们可以不在下面的foreach里面写包围插入数据的括号所用
    collection:指明所使用的的集合类别,可见类型别名
    index:是索引
    item:是当前遍历元素
  -->
  VALUES
  <foreach item="item" separator="," collection="list">
     (
       #{item.name},
       #{item.password}
     )
  </foreach>
</select>