MyBatis核心配置

MyBatis核心配置


1.SqlSessionFactory

Reader reader =
	Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

通常每个数据库对应一个SqlSessionFactory,建议使用单例


2.SqlSession

每一个线程都应该有自己的SqlSession实例,使用后及时关闭

SqlSession sqlSession = sqlSessionFactory.openSession();
try{
    //持久化操作
}finally{
    sqlSession.close();
}

3.配置文件

<mapper>元素为根元素

  • <properties>元素

  • 建立db.properties文件

    <properties resource="db.proerties" />
    
    <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>
    

  • 使用property子元素

    <property name="" value="" />
    

  • <settings>用来改变MaBatis运行时的行为,开启二级缓存,延迟等

    <!--设置-->
    <settings>
        <setting name="cacheEnabled" value="true" />
        <setting name="lazyLoadingEnabled" value="true" />
        ...
    </settings>
    

  • <typeAliases>用来给配置文件中Java类型设置别名

    <typeAliases>
        <typeAlias alias="user" type="完整包名.User"/>
    </typeAliases>
    

    如果省略Alias则默认类名首字母小写为别名


    也可以使用自动扫描的方式把整个包下的类起别名

    <typeAliases>
        <package name="需要扫描的包"/>
    </typeAliases>
    

    还可以采用注解方式(优先级高)

    @Alias(value="user")
    public class User{
        //....
    }
    

  • <typeHandle>类型处理器 用于完成 javaType到 jdbcType的转换

  • <objectFactory> 对象工厂用于创建结果对象实例 一般不用修改

  • <plugins> 插件

  • <environments>元素 用于配置数据源

    <environments default="mysql">
    	<environment id="mysql">
    		<!--使用JDBC事务管理-->
    		<transactionManager type="JDBC"/>
    		<!--数据库连接池-->
    		<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>
    
    • default属性:用于指定默认数据源ID
    • transactionManager子元素:配置事务管理器,一般使用Spring自带管理器
    • 数据源类型:UNPOOLED、POOLED、JNDI
  • <mappers>元素 用于指定映射文件的位置

    • 类路径引入

      <mappers>
      	<mapper resource="com/itheima/mapper/CustomerMapper.xml"/>
      </mappers>
      
    • 接口类引入

      <mappers>
      	<mapper class="完整包名.接口名"/>
      </mappers>
      
    • 包名引入

      <mappers>
      	<mapper name="完整包名"/>
      </mappers>
      

4.映射文件

<mapper>元素为根元素

  • <select>元素 用于映射查询语句

    <select id="findCustomerById" parameterType="Integer" 
    	resultType="com.itheima.po.Customer">
    	select * from t_customer where id = #{id}
    </select>
    

    下面列举常用属性:

    属性 说明
    id 元素唯一标识符
    parameterType 传入参数类型
    resultType 返回值类型/集合包含类型
    resultMap resultMap的id引用
    flushCache 查询前是否清理缓存
    useCache 是否开启二级缓存
    fetchSize 获取记录总条数
    resultSetType 结果集类型

  • <insert>元素 用于映射插入语句

    <insert id="addCustomer" parameterType="com.itheima.po.Customer"
            keyProperty="id" useGeneratedKeys="true">
        insert into t_customer(username,jobs,phone)
        values (#{username},#{jobs},#{phone})
    </insert>
    

    列举三个特有属性:

    属性 说明
    keyProperty 将插入或更新时的返回值赋给(输入对象的)某个属性,通常设置为主键对应属性
    keyColumn 用于设置第几列是主键,当不是第一列时需要设置
    useGeneratedKeys 用于获取数据库内部产生的主键,如自动增长字段

    SqlSession sqlSession = MybatisUtils.getSession();
    Customer customer = new Customer();
    customer.setUsername("rose");
    customer.setJobs("student");
    customer.setPhone("13333533092");
    int rows = sqlSession.insert("com.itheima.mapper"
    	+".CustomerMapper.addCustomer",customer);
    
    //输出插入数据的主键id
    System.out.println(customer.getId());
    
    if(rows>0){
    	System.out.println("插入了"+rows+"条数据");
    }else{
    	System.out.println("插入失败");
    }
    sqlSession.commit();
    sqlSession.close();
    

  • <update>和<delete>元素 比较简单略过

  • <sql>元素用于抽出SQL语句中相同的部分

    <mapper namespace="com.itheima.mapper.CustomerMapper">
        <!--抽出重复代码-->
        <sql id="customerColumns">id,username,jobs,phone</sql>
        <!--通过id查询用户-->
        <select id="findCustomerById" parameterType="Integer" resultType="com.itheima.po.Customer">
            select <include refid="customerColumns"/>
            from t_customer where id = #{id}
        </select>
    </mapper>
    

  • <resultMap>元素 用于定义映射规则、级联的更新、类型转化器等。

    <mapper namespace="com.itheima.mapper.UserMapper">
        <!--type 返回的类型-->
        <resultMap id="resultMap" type="com.itheima.po.User">
            <!--主键 column为表中列名-->
            <id property="id" column="t_id"/> 
            <!--普通属性-->
            <result property="name" column="t_name"/>
            <result property="age" column="t_age"/>
        </resultMap>
        <select id="findAllUser" resultMap="resultMap">
            select * from t_user
        </select>
    </mapper>
    

    <association>和<collection>子元素可以实现关联在后面讨论

上一篇:520前,我放弃陪女朋友时间,*写代码:“SSM框架整合+excel文件上传到数据库+数据更新“


下一篇:Sharding-JDBC自定义复合分片算法