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常用内置别名:
别名 | 映射的类型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
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>