环境搭建
主配置文件( SqlMapConfig.xml )
<?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">
<!--mybatis的主配置文件 -->
<!--引入外部配置文件-->
<properties resource="jdbcConfig.properties"></properties>
<!--配置实体类的别名-->
<typeAliases>
<!--配置完成后可直接使用user类(不需要再写全限定类名)-->
<typeAlias type="com.it.domain.User" alias="user"></typeAlias>
<!--也可使用package属性配置,指定实体类所在的包,配置后类名就是别名,且不区分大小写-->
<package name="com.it.domain"/>
</typeAliases>
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件是每个dao独立的配置文件-->
<mappers>
<mapper resource="com/it/dao/UserDao.xml"/>
<!--也可以使用package指定dao接口所在的包-->
<package name="com.it.dao"/>
</mappers>
</configuration>
实体类映射配置文件
在resources下配置和dao类同级的配置文件,这样就可以使用代理模式不在需要dao的实现类
<?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">
<!--namespace : 映射位置-->
<mapper namespace="com.it.dao.IUserDao">
<!--定义User的resultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!--一对多映射配置封装Account集合的内容-->
<!--ofType:集合中元素类型-->
<collection property="accounts" ofType="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
</collection>
</resultMap>
<!--查询所有-->
<!--id : 映射位置内方法 resultMap : 封装到哪里去-->
<select id="findAll" resultMap="userAccountMap">
<!--左外连接返回左边所有的数据和右边匹配数据-->
select * from user u left outer join account a on u.id = a.uid;
</select>
<!--根据id查询-->
<select id="findById" parameterType="int" resultType="user">
select * from user where id like #{uid};
</select>
<!--删除使用delete标签-->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{uid}
</delete>
<!--保存使用insert标签-->
<insert id="insertUser" parameterType="com.it.domain.User">
insert into user (username,password) values (#{username},#{password})
</insert>
<!--更新使用upadate标签-->
<update id="updateUser" parameterType="com.it.domain.User">
update user set username=#{username},password=#{password} where id=#{id}
</update>
测试类
使用代理模式
public static void main(String[] args) throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂创建SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建Dao接口代理对象
UserDao userDao = session.getMapper(UserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
延时加载
延时加载:在真正使用一个数据时候才去查询(即按需加载或懒加载;
一般在一对多、多对多的情况下使用;
在查询一个学生信息时,其关联的课程信息是需要时候才去查询,不需要的时候仅查询学生信息
立即加载:不管用不用,只要调用就马上查询;
一般多对一,一对一的情况下使用;
延时加载的使用
查询学生信息:
<select id="findUserById" parameterType="int" resultMap="user_course" >
select user.id,user.name,user.age from user where user.id=#{id}
</select>
查询学生的选课信息可以使用延时加载
fetchType属性:lazy为延时加载,默认为立即加载eager
<resultMap id="user_course" type="User">
<id column="id" property="id">
<collection property="ucourse" column="id" select="com.it.dao.CourseDao.queryCourseByUserId" fetchType="lazy"></collection>
</resultMap>
注解配置
在使用mybatis的注解开发时要在主配置文件中添加下列内容,使用注解开发后可以不在书写映射文件
<mappers>
<mapper class="com.it.dao.UserDao"/>
<!--或者也可以使用package标签-->
<package name="com.it.dao"/>
</mappers>