1.作用:java的持久层框架,解决实体和数据库的映射问题
2.导包
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
3.两种方式:xml配置文件和注解,同一接口只能用一种
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.xmz.dao.IUserDao"> <!--配置查询结果的列名和实体类的属性的对应关系--> <resultMap id="userAccountMap" type="user"> <!-- 取完别名后可用<resultMap id="userMap" 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> <!--配置user对象中accounts集合的映射--> <collection property="accounts" ofType="account" select="com.xmz.dao.IAccountDao.findAccountById" column="id"> <!-- <id column="id" property="id"></id>--> <!-- <result column="uid" property="uid"></result>--> <!-- <result column="money" property="money"></result>--> </collection> </resultMap> <!--了解的内容,抽取重复的sql语句--> <sql id="defaultUser"> select * from user </sql>
注解:常用这种方式,更加便捷
@Select("select * from manager ") @Results(id = "managerMap", value = { @Result(id=true, column = "id", property = "id"),//id指示主键 @Result(column = "name", property = "name"), @Result(column = "password", property = "password"), }) List<Manager> findAll(); @Select("select * from manager where id = #{id} ") @ResultMap(value = {"managerMap"}) //@ResultMap("managerMap") List<Manager> findById(int id); // @Select("select * from user where username like '%${value}%' ") @Select("select * from manager where name like #{name} ") @ResultMap("managerMap") List<Manager> findByName(String username);
4.总的环境配置: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"> <configuration> <!-- 配置properties可以在内部配置连接数据库的信息,也可以通过属性引用外部配置文件信息 resources属性:指定配置文件路径,按照类路径来写,并且必须存在于类路径下 url属性:要求按照url写法来写地址(和resources效果一样) url=协议+主机+端口+URI --> <properties resource="jdbcConfig.properties"> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="WANan123"/> --> </properties> <!--配置参数--> <settings> <!-- 开启mybatis支持延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings> <!-- 使用typeAliases配置别名,只能配置domain中类的别名 --> <typeAliases> <!--type属性指定实体类全限定类名,alias属性指定类名,且不区分大小写--> <!--<typeAlias type="com.xmz.domain.User" alias="user"></typeAlias>--> <!-- 用于配置别名的包,当指定后,该包下的实体类都会注册别名,并且类名为别名,不区分大小写--> <package name="com.xmz.domain"/> </typeAliases> <environments default="mysql"> <!-- 配置环境--> <environment id="mysql"> <!--配置事务--> <transactionManager type="JDBC"></transactionManager> <!--配置连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 配置映射文件位置--> <mappers> <!-- <mapper resource="com/xmz/dao/IUserDao.xml"></mapper> 使用注解时的配置 <mapper resource="com.xmz.dao.IUserDao"></mapper> --> <!--也有package标签,用于指定dao接口所在的包,指定后不需要再写mapper以及resources和class--> <package name="com.xmz.dao"/> </mappers>
5.注解的一对一,一对多
一对一:
@Result(property = "user", column = "uid", one = @One( select="com.xmz.dao.IUserDao.findById", fetchType= FetchType.EAGER))
一对多:
@Result(property = "accounts",column = "id", many = @Many(select = "com.xmz.dao.IAccountDao2.findAccountByUid", fetchType = FetchType.LAZY))
6.xml配置文件的一对一,一对多
一对一:
<resultMap id="accountUserMap" type="account"> <id property="id" column="id"></id> <result property="uid" column="uid"></result> <result property="money" column="money"></result> <!--一对一关系映射,配置封装user的内容--> <!-- <association property="user" column="uid" javaType="user">--> <!-- <id property="id" column="id"></id>--> <!-- <result column="username" property="username"></result>--> <!-- <result column="address" property="address"></result>--> <!-- <result column="sex" property="sex"></result>--> <!-- <result column="birthday" property="birthday"></result>--> <!-- </association>--> <!-- select属性指定查询用户的唯一标识 column属性指定更具用户id查询所需要的参数 --> <association property="user" column="uid" javaType="user" select="com.xmz.dao.IUserDao.findById"></association> </resultMap>
一对多:
<resultMap id="roleMap" type="role"> <id property="roleId" column="rid"></id> <result property="roleName" column="role_name"></result> <result property="roleDesc" column="role_desc"></result> <collection property="users" ofType="user"> <id property="id" column="id"></id> <result column="username" property="username"></result> <result column="address" property="address"></result> <result column="sex" property="sex"></result> <result column="birthday" property="birthday"></result> </collection> </resultMap>
7.多表组合查询
select u.*, r.id as rid, r.role_name, r.role_desc from role r left outer join user_role ur on rid = ur.rid left outer join user u on u.id = ur.uid
8.xml的相关语句if,foreach,where
<select id="findUserByCondition" resultType="com.xmz.domain.User" parameterType="user"> select * from user <where> <if test="username!=null"> and username like #{username} </if> <if test="sex!=null"> and sex like #{sex} </if> </where> </select> <select id="findUserInIds" resultType="com.xmz.domain.User" parameterType="queryvo"> -- select * from user <include refid="defaultUser"></include> <where> <if test="ids!=null and ids.size()>0"> <foreach collection="ids" open="and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
9.实际调用测试
private InputStream in; private SqlSession sqlSession; private IAccountDao2 accountDao2; @Before//用于在测试方法执行之前执行 public void init() throws Exception{ in = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //设置自动提交commit sqlSession = factory.openSession(true); //sqlSession = factory.openSession(); accountDao2 = sqlSession.getMapper(IAccountDao2.class); } @After//用于在测试方法执行之后执行 public void destroy() throws Exception{ //sqlSession.commit(); sqlSession.close(); in.close(); }
/** * 测试查询所有 * @throws Exception */ @Test public void testFindAll() throws Exception{ List<Account> accounts = accountDao2.findAll(); for (Account account:accounts){ System.out.println(account); } }