Mybaits的核心配置

一、mybatis主要有两种配置文件:

  1. mybatis-config.xml(配置文件)

  2. mybatis的映射文件(以mapper做后缀的文件)

二、mybaits的核心对象

  1. SqlSessionFactory:主要用于创建SqlSession,相当于整个数据库在内存中的镜像,所以说在一个项目中只能有一个工程。采用单利模式创建对象即可完成只有一个工厂类的操作。

  2. SqlSession:应用层与持久层进行交互的(执行sql语句) 在一个项目当中SqlSession可以有多个,每当执行sql操作时就应当创建一个Sqlsession,执行完毕后最后关闭释放资源即可。可以创建一个工具类哦

    (1)Sqlssion中的一些重要方法

    • selectOne:返回一条记录的查询(可以重载,重载中第一个参数为你要执行的sql语句的绝对路径,第二个参数为你要传的参数条件)
    • selectList:返回多条记录的查询(可重载,不需要传参时用一个参数的,需要传参时用传递两个参数的,如果想要用它来进行分页操作就要使传递第三个参数的)
    • insert:执行插入操作时。(可以重载,重载中第一个参数为你要执行的sql语句的绝对路径,第二个参数为你要传的参数条件)
    • update:执行修改操作时使用。(可以重载,重载中第一个参数为你要执行的sql语句的绝对路径,第二个参数为你要传的参数条件)
    • delete:执行删除操作时使用。(可重载。如果想要删除所有没有where条件时就只需要执行传递一个参数的方法即可;如果有where条件则调用传递两个参数的方法)
    • commit:sqlsession中的事务默认不自动提交,而commit()方法正是在进行事务提交的时候调用。如果不执行commit()方法,且执行不出错只是代表内存当中的数据发生了改变而数据库中的信息不会发生改变。所以所只有在调用了commit() 方法后才会将内存中的改变提交个数据库,从而使得数据库中的信息发生改变。
    • rollback:回滚操作。当内存当中的所进行的操作发生错误时让其进行回滚操作,(反悔)经过验证后没有问题是再进行提交操作。提交后将不能再次进行回滚操作
    • close:关闭SqlSession,释放资源
    • getMapper:该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象,开发人员可使用该对象直接调用方法操作数据库,参数type是Mapper的接口类型。
    • getConnection:获取JDBC数据库连接对象的方法

三、mybatis配置文件详解

​ configuration标签中的子标签一定要按照顺序来写properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environment-s,databaseIdProvider,mappers

  • properties:是一个配置属性的元素,通常用于将内部的标签外在化。将四个连接数据库的串单独放到一个配置文件中进行编辑(db.properties)以键值对的方式来进行创建。在mybatis的配置文件中导入db.properties

    <properties resource="db.properties"></properties>
    <!--引入该属性后再<dataSource>标签中value值得地方替换成db.properties中的键名(关键字进行调用。关键字可自定义)-->
    <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>
  • setting:一些标签的开关可以再次标签中进行设置

  • typeAliases:可以定义别名,在mapper映射文件中可以直接使用别名

    <typeAliases>
            <!-- 设置类型的别名 如果不写alias属性,系统默认的别名为类名的首字母小写-->
             <!--<typeAlias alias="customer" type="com.ruanyuan.pojo.Customer" />-->
             <!-- <typeAlias alias="user" type="com.ruanyuan.pojo.User" />-->
        <!--可以给整个实体类的包进行创建,默认是类名首字母小写-->
              <package name="com.runayuan.pojo"/> 
    </typeAliases>
  • typeHandlers:用于数据库的数据类型和java的数据类型之间的转换

  • environments:是环境配置的根元素,它包含一个default属性,该属性用于指定默认的环境ID。其中<enviroment>是它的子元素,可以定义多个,其中ID属性用于表示所定义环境的ID值。在子标签中包含事务管理和数据源的配置信息,其中transactionManager 元素用于配置事务管理,它的type属性用于指定事务管理的方式,即使用哪个事务管理器;dataSource元素用于配置数据源,他的type属性用于指定使用哪种数据源。

    在mybatis中,可以配置两种类型的事务管理器,分别是JDBC和MANACED。

    • JDBC:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
    • MANACED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。在默认情况下,它会关闭连接,但一些容器不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。
    <environments default="mysql">
            <environment id="mysql">
                <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>
  • mappers:指定映射文件的具体位置其中第二种方式是只有在使用接口的形式下才可以使用

    <mappers>
        <!--第一种-->
        <mapper resourse="com/mapper/UserMapper.xml"></mapper>
        <!--第二种使用包名引入-->
        <package name="com.mapper"/>
    </mappers>

四、mybaits映射文件配置详解

在未来实际项目开发中,所有的标签都必须要写id属性

select标签中的paramterType属性可以省略不写,resultType属性必须得写。但根据java开发手册中的ORM映射规范来讲 不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需要 定义<resultMap>;反过来,每一个表也必然有一个<resultMap>与之对应。 说明: 配置映射关系,使字段与 DO 类解耦,方便维护。

所以说最好使用resultMap标签,当使用resultMap标签时,不得使用resultType标签。两个标签只能写一个

<mapper namespace="">

对于<insert><update><delete>这3个标签,通常我们只写id属性,其他属性一概不写。
    在xml中写sql语句时,涉及到传参时要使用#{}的方式。其中的参数名称要和实体类中属性名称保持一致,只有这样在mybatis的ORM映射才能真正的起到作用。

namespace为工作空间,其中的属性都为当前mapper文件的绝对路径例:com.mapper,UserMapper

select:该标签在你执行查询语句时进行使用

<!--id具有唯一性,要将id的名称和接口类中所定义的方法名保持一致
 parameterType:传入参数的类型
resultType:返回的数据类型
-->
<select id="getCustomerById" parameterType="Integer"
        resultType="customer">
        select
        <include refid="customerColums"></include>
        customer where cust_id = #{cust_id}
</select>

模糊查询时要用concat拼接

例如:

<!--paramerType:传入的参数类型,resultType:返回的数据类型-->
<select id="getCustomerByName" parameterType="String"
        resultType="com.xiangyu.pojo.Customer">
        select * from customer where cust_name like
        concat('%',#{value},'%')
</select>
如果在查询所有信息时,paramterType为List集合中的泛型的绝对路径

update:执行修改语句时进行使用

delete:执行删除语句时进行使用

insert:执行插入语句时进行使用

  • 在插入数据后想要通过对象获取到该用户id时,通常情况下会获取不到,所以我们要来使用useGeneratedKeys="true" keyProperty="" 这两个属性来进行配置其中keyProperty中的值为我们定义的实体类中的数据库的主键名称。

    <!-- 插入语句 数据库可以实现自动增长时 -->
        <insert id="isnertCustomer" parameterType="customer"
            useGeneratedKeys="true" keyProperty="custId"> insert into customer
            (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address)
            values
            (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress})
        </insert>
    <!-- 插入语句,数据库不会实现自动增长时 -->
         <insert id="isnertCustomer" parameterType="customer"> <selectKey keyProperty="cust_id" 
            resultType="Integer" order="BEFORE"> select if(max(cust_id) is null,1,max(cust_id)+1) 
            as newId from customer </selectKey> insert into customer (cust_name,cust_userId,cust_create_id,cust_sourrce,cust_industry,cust_address) 
            values (#{custName},#{custUserid},#{custCreateId},#{custSourrce},#{custIndustry},#{custAddress}) 
            </insert> 

(1)resultMap

有的时候在创建数据库中的字段时两个单词之间会用‘__’进行连接,但在定义java实体类中的属性值时通常喜欢使用驼峰命名法来命名两个单词,而正因为如此在mybatis中orm映射机制会由于实体类中的属性值和数据库中字段的值不一致而导致映射失败,传值无效报错

解决方法:(1)在mybatis的配置文件中(mybatis-config.xml)

<!--configuration标签中的settings标签进行全局设置-->
<!--在通常情况下,java中的实体类中的属性一般是采用驼峰命名命名的,而数据库中表的字段则用下划线区分字母。在这种情况下,Mybatis提供了一个全局属性mapUnderscoreToCamelCase来解决两者名字不一致的问题。-->
<setting name="mapUnderscoreToCamelCase" value="true" />

(2)也可以直接使用上文所提及到的resultMap进行自定义映射(important)

<resultMap id="BaseResultMap" type="com.ruanyuan.pojo.User">
    <!--主键-->
        <id column="user_id" jdbcType="BIGINT" property="userId" />
    <!--columu:数据库中的字段名,jdbctype:字段的数据类型,property:你在实体类中自己定义的一个实体类属性名称-->
        <result column="user_code" jdbcType="VARCHAR"
            property="userCode" />
        <result column="user_name" jdbcType="VARCHAR"
            property="userName" />
        <result column="user_password" jdbcType="VARCHAR"
            property="userPassword" />
        <result column="is_state" jdbcType="CHAR" property="state" />
</resultMap>

一个实体类对应一个mapper.xml文件,实体类的名称和mapper的名称保持一致,sql语句写到mapper.xml文件z中,将mybatis-config配置文件放在根目录下,在该文件中进行连接数据库操作。并且还要映射有sql语句的mapper.xml文件。

(2)Sql元素:在一个映射文件中,通常需要定义多条sql语句,这些sql语句的组成可能有一部分是相同的

如果每一个sql语句都重写一遍相同的部分,那势必会增加代码量,导致映射文件过于臃肿

此时就需要使用sql元素将SQL语句中的相同的组成部分抽取出来,然后在需要的地方用<include>标签进行插入即可。

<sql id="Base_Column_List">
        user_id, user_code, user_name, user_password, is_state,
        create_time,
        update_time
</sql>
<select id="selectByPrimaryKey" parameterType="Integer"
        resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from login_user
        where user_id = #{userId}
</select>
上一篇:Android开发之按键、触摸屏和手势输入专业压力测试方法


下一篇:【MySQL学习】分组数据,使用子查询