mybatis入门程序-(二)

 1. 添加配置文件

 

log4j.properties

# Global logging configuration
#开发环境下日志级别设置成DEBUG,生产环境设置成info或者error
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

 

db.properties

;;;;;;;;;;;;;;;;;;;;
;DataBaseConnection;
;;;;;;;;;;;;;;;;;;;;

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam
jdbc.username=sa
jdbc.password=123456

 

 

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 resource="db.properties">
        <!--properties中还可以配置一些属性名和属性值  -->
        <!-- <property name="jdbc.driver" value=""/> -->
    </properties>
    <!-- 全局配置参数,需要时再设置 -->
    <!-- <settings>
    
    </settings> -->
    
    <!-- 别名定义 -->
    <typeAliases>
       
        <package name="cn.xm.pojo"/>
        
    </typeAliases>
    
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC" />
        <!-- 数据库连接池,由mybatis管理-->
            <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>
     
        <package name="cn.xm.mapper"/>
     
           <!--引入分开的xml-->
      <mapper resource="sqlmap/User.xml"/>
    </mappers>
    
</configuration>

 

 

User.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">

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="test">

    <!-- 在 映射文件中配置很多sql语句 -->
    <!-- 需求:通过id查询用户表的记录 -->
    <!-- 通过 select执行数据库查询
    id:标识 映射文件中的 sql
    将sql语句封装到mappedStatement对象中,所以将id称为statement的id
    parameterType:指定输入 参数的类型,这里指定int型 
    #{}表示一个占位符号
    #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
    
    resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
     -->
     <!-- 开启二级缓存 -->
     <cache/>
     
    <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
        SELECT * FROM USER WHERE id=#{value}
    </select>
    
    
    
    <!-- 需求:通过username模糊查询用户表的记录
   resultType:指定sql输出结果 的所映射的java对象类型(无论查出一条记录还是多条记录都是这样)
   ${}:Sql字符串拼接符,将接收到的参数不加任何修饰符拼接在sql中。如果参数类型是简单类型,${}中只能使用value
   ${}会引起sql注入,就是'%' or 1=1 or '%',客户输入其他sql语句让程序正常执行
     -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
        SELECT * FROM USER WHERE username like '%${value}%'
    </select>    
    
    
    
    <!-- 增加用户 (主键自增)-->
    <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" >
        insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
        
        <!--获取自增主键设置的主键值,利用mysql的SELECT last_insert_id()  返回上次插入数据的主键 (只适用于自增主键)
          keyProperty:将查询到的主键值映射到parameterType对应的对象的哪个属性
          resultType:指定查询到的id返回的结果类型
          order:指定相对insert语句的执行顺序
         -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
           SELECT last_insert_id()
        </selectKey>
    </insert>    
    
    
    <!-- 删除用户,根据Id删除 ,需要输入Id(int型)
    #{id}表示取一个参数,根据参数指定的类型
    -->
    <delete id="deleteUserByTd" parameterType="int">
    delete from user where id=#{id}
    </delete>
    
    
    <!-- 更新用户,根据Id更新 ,需要传入Id(int型)与更新信息
    parameterType类型为User类型,指定需要修改的用户id和修改后的属性值,#{username}表示从传入的对象中取对应的username属性
    #{id}表示从user对象中获取id
    -->
    <update id="updateUserByTd" parameterType="cn.itcast.mybatis.po.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
    where id=#{id}
    </update>
    
    
</mapper>

 

 

2.入门代码测试:

  (1)根据Id查询用户信息

 

 

  (2)模糊查询代码测试

 

  (3)添加用户

 

 

  (4)删除用户

 

 

  (5)更新用户

 

 

 

总结:

  1.  parameterType

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

2.     resultType

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

3.    #{}和${}

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

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

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

 

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

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

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

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

 

实际可以这么理解,#{}会在里面加上单引号。${}不会加上单引号。比如:

如果变量的值是:safehatnum

(1)#{}加引号

select * from safehat order by #{order};

相当于

select * from safehat order by 'safehatnum';

 

(2)${}不加引号

select * from safehat order by ${order};

 

相当于

select * from safehat order by safehatnum;

 

参考:http://www.cnblogs.com/qlqwjy/p/7818579.html

 

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

 

5.  mybatis和hibernate本质区别和应用场景

  

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。

应用场景:

         适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

 

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。

应用场景:

         适用与需求变化较多的项目,比如:互联网项目。

 

企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

 

posted @ 2017-08-06 15:33  QiaoZhi  阅读(295)  评论(0编辑  收藏  举报