1. 连接池和事务相关
- 连接池是用于存储连接的一个容器(一个集合对象,必须是线程安全的,不能两个线程拿到统一的连接,必须实现队列的特征:先进先出),减少获取连接所用的时间。
Mybatis提供了三种配置方式及主配置文件SqlMapperConfig.xml中dataSource标签的type属性:
POOLED:从池中获取一个连接来用
UNPOOLED: 新建一个连接来用
JNDI:模仿windows注册表Map结构 key-value - 事务:通过sqlSession中的commit方法提交事务在使用工厂类创建sqlsession对象时
sqlSession = factory.openSession(true);
就可以自动提交
2.基于XML配置的动态sql语句
- if标签:
select * from user where 1=1
<if test="username != null">
and username = #{username}
</if>
- where标签:
使用where标签可以省略sql语句中的where
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
- foreach
<select id="findByCondition" parameterType="com.mybatisDemo.domain.User" resultType="com.mybatisDemo.domain.User">
select * from user
<where>
<if test="username != null and username.size()>0">
<foreach collection="username" open="and id in(" close=")" item="username" separator=",">
#{username} <!-- 由item的值决定-->
</foreach>
</if>
</where>
</select>
- sql 抽取重复的sql语句
<!--编写可以重复调用的sql-->
<sql id="defaultSQL">
select * from user
</sql>
<!--id要与方法名称一致 resultType指定返回的实体类-->
<!--配置查询所有-->
<select id="findAll" resultType="com.mybatisDemo.domain.User">
<!--调用编写的sql-->
<include refid="defaultSQL"></include>
</select>
3.多表
先使用外键将两表连接。
- 一对一
Mybatis中把多对一看成了一对一;需要在从表的实体类中添加主表的是实体类对象并且添加get和set方法。
// 从表包含主表实体对象
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
xml:
<!--定义封装Account和User的resultMap-->
<resultMap id="accountUserMap" type="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射-->
<association property="user" column="uid" javaType="com.mybatisDemo.domain.User">
<id property="id" column="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<!--配置查询所有-->
<select id="findAll" resultMap="accountUserMap">
select u.*,a.id as aid, a.uid,a.money from account a , user u where u.id=a.uid;
</select>
- 一对多
一对多关系映射,主表实体类包含从表对象集合,并且添加get和set方法。
// 一对多关系映射,主表实体类包含从表对象集合。
private List<Account> accounts;
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
在xml文件中添加map集合
<!--定义user的ResultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<result property="address" column="address"></result>
<!--配置user对象中accounts对象集合的映射-->
<collection property="accounts" ofType="com.mybatisDemo.domain.Account">
<id column="id" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
</resultMap>
sql语句:
<!--配置查询所有-->
<select id="findAll" resultMap="userAccountMap">
select * from user u left outer join account a on u.id = a.uid
</select>
- 多对多
要在两个表的实体类中都添加相互的列表对象。