欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis入门

程序员文章站 2022-03-02 15:19:37
...

一.环境配置

1.引入依赖

  • 引入mybatis的外部依赖
  • 引入mysql的驱动依赖

2.配置mybatis-config.xml

  • mybatis-config.xml配置文件实例

    <environments default="product">
    	<environment id="product">
        	<transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            	<property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="test">
        	<transactionManager type="JDBC"/>
            <dataSource type="POOLED">
            	<property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    	<mapper resource="org/mybatis/example/testMapper.xml"/>
    </mappers>
    
  • 配置文件中的<properties resource="db.properties"></properties>用于配置properties文件的信息

  • environments标签主要用于数据源的配置,可以配置多个数据源,通过default属性来指定当前项目运行过程中使用的是哪个数据源

    • environment标签用于配置具体的独立的数据源,id属性用于给当前数据源定义一个名称,方便我们的项目指定
    • environment标签中标签
      • transactionManager用于配置事务管理,默认情况下使用的是JDBC事务管理
      • dataSource配置具体数据源的链接信息,type属性用于指定是否使用连接池
  • mappers主要用于配置我们外部的映射配置文件,在主配置文件中需要引入加载映射配置文件

    • mapper标签主要配置引入某一个具体的映射文件,resource进行路径方式的引入

3.配置mapper.xml

  • mapper.xml实例

    <mapper namespace="org.mybatis.example.TestMapper">
    	<select id="findAll" resultType="org.mybatis.example.Test">
        	select * from test
        </select>
    </mapper>
    
  • mapper用于定义一个映射配置文件的根节点,namespace属性是用来配置命名空间主要进行session级别的缓存管理,命名空间默认情况下使用我们当前操作的实体类的全路径

4.配置实体类

  • 创建与数据库表字段对应的实体类

二.动态SQL语句

1.if

  • 动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如:

    <select id="findActiveBlogWithTitleLike" resultType="Blog">
      SELECT * FROM BLOG 
      WHERE state = ‘ACTIVE’ 
      <if test="title != null">
        AND title like #{title}
      </if>
    </select>
    
  • 上述代码的title应传递的是对象,对象中的属性有title

2.choose(when,otherwise)

  • 有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

  • 还是上面的例子,但是这次变为提供了“title”就按“title”查找,提供了“author”就按“author”查找的情形,若两者都没有提供,就返回所有符合条件的 BLOG(实际情况可能是由管理员按一定策略选出 BLOG 列表,而不是返回大量无意义的随机结果)。

    <select id="findActiveBlogLike"
         resultType="Blog">
      SELECT * FROM BLOG WHERE state = ‘ACTIVE’
      <choose>
        <when test="title != null">
          AND title like #{title}
        </when>
        <when test="author != null and author.name != null">
          AND author_name like #{author.name}
        </when>
        <otherwise>
          AND featured = 1
        </otherwise>
      </choose>
    </select>
    

3.trim(where,set)

未完待续…

4.foreach

未完待续…

5.动态SQL:sql片段—公用sql

  • 定义sql片段,使用sql标签(id定义标识),如

    <sql id="user_fields">
    	username,userpass,nickname,age,gender
    </sql>
    
  • 引入sql片段,使用include标签(refid引入标识),如

    <insert id="addUsers" useGenereateKeys="true" keyProperty="id">
        insert into users(<include refid="user_fields"></include>)
        values(#{name},#{userpass},#{nickname},#{age},#{gender})
    </insert>
    <!-- 等同于
    	insert into users(username,userpass,nickname,age,gender)
        values(#{name},#{userpass},#{nickname},#{age},#{gender}) 
    -->
    

6.动态SQL:set配置

  • 常规操作存在问题:如果一个值为null则插入的数据则为null

    <update id="updateUser">
    	update users 
        	set username = #{name},
        		userpass = #{userpass},
        		nickname = #{nickname},
        		age = #{age},
        		gender = #{gender}
        	where id = #{id}
    </update>
    
  • 使用set配置

    <update id="updateUser">
      update users
        <set>
          <if test="name != null">username=#{name},</if>
          <if test="userpass != null">userpass=#{userpass},</if>
          <if test="nickname != null">nickname=#{nickname},</if>
          <if test="age != null">age=#{age}</if>
          <if test="gender != null">gender=#{gender}</if>
        </set>
      where id=#{id}
    </update>
    

三.实体中的属性与表字段不相同的解决方案

1.添加resultMap

  • 实例代码如下

    <!-- 自定义映射关系集合,主要包含对一些自定义操作的配置,如不一致的属性和字段名称 -->
    <resultMap id="forUsers" type="com.demo.entity.Users">
        <!-- 配置实体类中的主键与数据库中的主键匹配使用id -->
        <!-- <id column="" property=""></id> -->
        <!-- result配置:column表示数据库中字段名,property表示实体类中的属性名 -->
    	<result column="username" property="name"></result>
    </resultMap>
    
  • 将resultType的返回类型改为resultMap并值为resultMap的id内容

  • 注意:resultMap中只需要定义表与实体间不同名的内容,其他内容将自动映射

四.使用log4j打印日志记录

1.引入log4j依赖

2.添加log4j的properties配置文件(通过官网的log4j.properties文件获取)

3.使用log4j

  • 创建对应的日志记录对象private Logger log = Logger.getLogger(类名.class);
  • 通过不同的级别进行日志的记录【级别:DEBUG/WARN/INFO/LOG】log.info("查询到的id内容:"+id)

五.Mybatis相关特性

1.自动生成主键值

  • 使用insert标签的useGenerateKeys="true"和keyProperty="id"定义主键,如

    <insert id="addUsers" useGenereateKeys="true" keyProperty="id">
    	...
    </insert>
    

六.基础进阶—多表关联入门

  • 创建用户表和地址表,并设置关联(一个用户可以有多个地址)
  • 在User实体中添加List<Address>addresses属性

1.一对一的映射<association>

  • resultMap中绑定id字段<id property="id" column="id"></id>
  • association中定义一对多的类属性property,多的对象类型ofType,column传递到查询中的数据库字段名,select查询的sql标签id。<association property="addresses" column="id" ofType="com.demo.entity.Address" select="getAddress"></association>

2.一对多的映射<collection>

  • resultMap中绑定id字段<id property="id" column="id"></id>
  • collection中定义一对多的类属性property,多的对象类型ofType,column传递到查询中的数据库字段名,select查询的sql标签id。<collection property="addresses" column="id" ofType="com.demo.entity.Address" select="getAddress"></collection>
相关标签: Mybatis