MyBatis入门(3)

前记:这是很早之前自学学习myBatis时的笔记,内容比较基础,适合新手,内容基本是来自网络,如有雷同,敬请谅解!

jar包

加入mybatis核心包、依赖包、数据驱动包。

MyBatis入门(3)

配置日志

在classpath下创建log4j.properties如下:

# Global loggingconfiguration

log4j.rootLogger=DEBUG, stdout

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

mybatis默认使用log4j作为输出日志信息。

 配置SqlMapConfig.xml

在SqlMapConfig.xml文件中配置:

SqlMapConfig.xml就是myBatis的全局配置文件

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC"-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

  <!-- 和spring整合后 environments配置将废除-->

   <environmentsdefault="development">

      <environment id="development">

     <!--jdbc事务管理-->

         <transactionManagertype="JDBC"/>

      <!--数据库连接池-->

         <dataSource type="POOLED">

            <property name="driver"value="com.mysql.jdbc.Driver"/>

            <property name="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>

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

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

         </dataSource>

      </environment>

   </environments>

</configuration>

SqlMapConfig.xmlmybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

 映射文件

映射文件命名:

举例:

           User.xml(原始ibatis命名),mapper代理开发映射文件名称叫XXXMapper.xml,比如:UserMapper.xml、ItemsMapper.xml

在映射文件中配置sql语句。

MyBatis入门(3)

parameterType:定义输入到sql中的映射类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType定义结果映射类型。mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。

#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value

    在SqlMapConfig.xml中加载映射文件

举例:

      在sqlMapConfig.xml中加载User.xml:

    MyBatis入门(3)

     自增主键返回

mysql自增主键,执行insert提交之前自动生成一个自增主键。

通过mysql函数获取到刚插入记录的自增主键:

LAST_INSERT_ID()

是insert之后调用此函数。

修改insertUser定义:

MyBatis入门(3)

<insertid="insertUser"parameterType="cn.itcast.mybatis.po.User">

       <!-- selectKey将主键返回,需要再返回 -->

       <selectKey keyProperty="id"

                   order="AFTER"

                   resultType="java.lang.Integer">

          select LAST_INSERT_ID()

       </selectKey>

       insert into user(username,birthday,sex,address)

        values(#{username},#{birthday},#{sex},#{address});

</insert>

添加selectKey实现将主键返回:

     keyProperty:返回的主键存储在pojo中的哪个属性

     orderselectKey的执行顺序,是相对与insert语句来说,

             由于mysql的自增原理执行完insert语句之后才将主键生成,

             所以这里selectKey的执行顺序为after

     resultType:返回的主键是什么类型

       LAST_INSERT_ID():mysql的函数,返回auto_increment自增列新记录id值。

select LAST_INSERT_ID()得到刚insert进去记录的主键值,只适用于自增主键。

     非自增主键返回(使用uuid())

1.        使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

   执行思路:

      先通过uuid()查询到主键,将主键输入到sql语句中。

       执行uuid()语句顺序相对于insert语句之前执行。

MyBatis入门(3)

注意这里使用的order是“BEFORE

2.        通过oracle的序列生成主键:

<selectKeykeyProperty="id"

            order="BEFORE"

            resultType="java.lang.String">

         SELECT序列名.nextval()

</selectKey>

insert into user(id,username,birthday,sex,address)

       value(#{id},#{username},#{birthday},#{sex},#{address})

注意这里使用的order是“BEFORE

    总结

1.        parameterType 在映射文件中通过parameterType指定输入 参数的类型。

2.        resultType 在映射文件中通过resultType指定输出结果的类型。

3.        #{}和${}

           #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。

           如果接收简单类型,#{}中可以写成value或其它名称。

           #{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

          ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}

          ${}接收输入参数,类型可以是简单类型,pojo、hashmap。

           如果接收简单类型,${}中只能写成value。

          ${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

4.        selectOne和selectList

           selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。

           selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。

如果使用selectOne报错:

org.apache.ibatis.exceptions.TooManyResultsException:Expected one result (or null) to be returned by selectOne(), but found: 4