码迷,mamicode.com
首页 > 其他好文 > 详细

3.MyBatis 入门程序

时间:2015-06-20 14:27:36      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:mybatis 入门程序

1     Mybatis门程序

    1.1 需求

            具体需求:

             

            1、  根据用户ID来查询用户信息;

            2、  根据用户名称来模糊查询用户信息列表;

            3、  添加用户;

            4、  删除用户;

            5、  修改用户。       

    1.2 下载MyBatis

            mybaits的代码由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases

            技术分享 

             

            Libmybatis的依赖包

            Mybatis-3.2.7.jarmybatis的核心包

            Mybatis-3.2.7.pdfmybatis的使用指南

        

    1.3 数据库环境搭建

        1.1.1 数据库环境搭建

        数据库用的是MySQL5.1

         

            技术分享这个数据库文件,等下在下面链接技术分享

         

        1、  执行sql_table.sql脚本,创建数据库表;

        2、  执行sql_data.sql初始化测试数据。

        1.1.2 代码环境搭建

        1.1.2.1  创建java工程

        先用eclipse创建一个java工程,jdk使用1.7.0_72

        1.1.2.2  加入jar

        包括mybatis的核心包、依赖包、数据驱动包。(学习时加上junit4的包)

         

        

         

        1.1.2.3  添加log4j.properties文件

        Mybatis使用的日志包是log4j的,所以需要添加log4j.properties

         

        文件内容可以从mybatis-3.2.7.pdf中拷贝

         

        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

         

        日志级别在开发阶段设置成DEBUG,在生产阶段设置成INFO

         

        1.1.3 编程步骤

        第一步:创建sqlMapConfig.xml配置文件;

        第二步:创建PO类;

        第三步:编写映射文件;

        第四步:把映射文件在SqlMapConfig.xml中进行加载配置;

        第四步:编写测试代码

                 思路:

                 1、读取配置文件;

                 2SqlSessionFactoryBuilder通过配置文件构造SqlSessionFactory会话工厂。

                 3、通过SqlSessionFactory创建SqlSession

                 4、调用SqlSession的操作数据库的方法。

                 5、关闭SqlSession

         

         

        1.1.4 入门程序编写

        1.1.4.1  创建SqlMapConfig.xml配置文件

        SqlMapConfig.xml的文件头(可以从mybatis-3.2.7.pdf文档的2.1.2小节中拷贝):

        <?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>

        <!-- 配置mybatis的环境信息 -->

        <environments default="development">

            <environment id="development">

               <!-- 配置JDBC事务控制,由mybatis进行管理 -->

               <transactionManager type="JDBC"></transactionManager>

               <!-- 配置数据源,采用dbcp连接池 -->

               <dataSource type="POOLED">

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

                   <property name="url"value="jdbc:mysql://localhost:3306/mybatis"/>

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

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

               </dataSource>

            </environment>

        </environments>

        </configuration>

         

        1.1.4.2  创建PO

        根据需求设计出数据库结构,然后根据数据库表创建PO类(一张表一个类,一个字段一个属性)。

        根据需求设计出的表和PO类如下:

        user表(会员表)--User(本部分讲课只需要这一个表和PO类)

        items表(商品表)--Items

        orders 表(订单表)--Orders

        orderdetail表(订单商品表)--OrderDetail

         

        User.java类如下:

        Public class User {

            private int id;

            private String username;// 用户姓名

            private String sex;// 性别

            private Date birthday;// 生日

            private String address;// 地址

        get/set……

         

         

        1.1.4.3  根据需求编写入门程序

        Mybatis的映射文件头(可以从mybatis-3.2.7.pdf文件中拷贝):

        <?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">

        Mybatis的映射文件根路径:

        <mapper></mapper>

        

        ----------------------------------------------根据用户ID查询-------------------------------------------------------------------------------------------

          根据用户ID来查询用户信息;
          编写映射文件

        sqlmap目录下,创建User.xml映射文件,内容如下:

         

        <!--

            namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离

            注意:使用mapper代理开发时,namespace有特殊且重要的作用

         -->

        <mapper namespace="test">

         

            <!-- 根据用户ID,查询用户信息 -->

            <!--

               [id]statementid,要求在命名空间内唯一 

               [parameterType]:入参的java类型

               [resultType]:查询出的单条结果集对应的java类型

               [#{}]表示一个占位符?

               [#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义

             -->

            <select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">

               SELECT * FROM USER WHERE id = #{id}

            </select>

        </mapper>

         

        1.1.4.3.1.2     加载映射文件

        sqlMapConfig.xml中,添加以下代码:

        <!-- 加载mapper -->

        <mappers>

            <mapper resource="sqlmap/User.xml"/>

        </mappers>

        1.1.4.3.1.3     编写测试程序

        publicclass MybatisFirst {

         

            @Test

            publicvoid findUserByIdTest() throws Exception{

              

               //1、读取配置文件

               String resource = "SqlMapConfig.xml";

               InputStream inputStream = Resources.getResourceAsStream(resource);

               //2、根据配置文件创建SqlSessionFactory

               SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

               //3SqlSessionFactory创建SqlSession

               SqlSession sqlSession = sqlSessionFactory.openSession();

               //4SqlSession执行statement,并返回映射结果

               //第一个参数:statementid,建议:namespace.statementId(确保唯一)

               //第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

               User user = sqlSession.selectOne("findUserById", 1);

              

               //打印输出结果集

               System.out.println(user);

              

               //5、关闭SqlSession

               sqlSession.close();

            }

        }

        
    ----------------------------------------------根据姓名模糊查询---------------------------------------------------------------------------------------------

      根据用户名称来模糊查询用户信息列表;
     编写映射文件

User.xml中,添加以下内容:

    <!-- 根据用户名称模糊查询用户信息列表 -->

    <!--

           [${}]:表示拼接SQL字符串,即不加解释的原样输出

            [${value}]:表示要拼接的是简单类型参数。

            注意:

           1、如果参数为简单类型时,${}里面的参数名称必须为value

           2${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}

    -->

    <select id="findUsersByName"parameterType="String" resultType="cn.itcast.mybatis.po.User">

        SELECT * FROM USER WHERE username LIKE ‘%${value}%‘

    </select>

   加载映射文件

章节已配置,此处无需再次配置。

编写测试程序

 

注意:如果查询出的结果集记录大于1条,此时调用SqlSessionselectOne方法时,会报错。此时要选用selectList方法。

 

        @Test

        publicvoid findUsersByNameTest()throws Exception {

            // 1、读取配置文件

            String resource = "SqlMapConfig.xml";

            InputStream inputStream = Resources.getResourceAsStream(resource);

            // 2、根据配置文件创建SqlSessionFactory

            SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);

            // 3SqlSessionFactory创建SqlSession

            SqlSession sqlSession = sqlSessionFactory.openSession();

            // 4SqlSession执行statement,并返回映射结果

            // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

            // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

            List<User> users = sqlSession.selectList("test.findUsersByName", "小明");

         

            // 打印输出结果集

            System.out.println(users);

         

            // 5、关闭SqlSession

            sqlSession.close();

           

    ----------------------------------------------添加用户---------------------------------------------------------------------------------------------

     添加用户;
    编写映射文件

    <!-- 添加用户 -->

    <!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给予赋值 -->

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

        INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})

    </insert>

 加载映射文件

    章节已配置,此处无需再次配置。

 

  编写测试程序

    注意:增删改操作要对SqlSession执行commit操作。

        @Test

        publicvoid insertUserTest() throws Exception {

           // 1、读取配置文件

           String resource = "SqlMapConfig.xml";

           InputStream inputStream = Resources.getResourceAsStream(resource);

           // 2、根据配置文件创建SqlSessionFactory

           SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder()

                  .build(inputStream);

           // 3SqlSessionFactory创建SqlSession

           SqlSession sqlSession = sqlSessionFactory.openSession();

           // 4SqlSession执行statement,并返回映射结果

          

           //构建user参数,没有赋值的属性采取默认值

           User user = new User();

           user.setUsername("栋哥");

           user.setAddress("海淀西三旗");

          

           // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

           // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

           sqlSession.insert("insertUser", user);

     

           //切记:增删改操作时,要执行commit操作

           sqlSession.commit();

     

           // 5、关闭SqlSession

           sqlSession.close();

        }


     ----------------------------------------------删除用户---------------------------------------------------------------------------------------------


     删除用户;
      编写映射文件

    <!-- 根据ID删除用户 -->

    <delete id="deleteUser"parameterType="int">

        DELETE FROM USER WHERE id= #{id}

    </delete>

   加载映射文件

    章节已配置,此处无需再次配置。

 编写测试程序

        @Test

        publicvoid deleteUserTest() throws Exception{

            // 1、读取配置文件

            String resource = "SqlMapConfig.xml";

            InputStream inputStream = Resources.getResourceAsStream(resource);

            // 2、根据配置文件创建SqlSessionFactory

            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

                      .build(inputStream);

            // 3SqlSessionFactory创建SqlSession

            SqlSession sqlSession = sqlSessionFactory.openSession();

            // 4SqlSession执行statement,并返回映射结果

            // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

            // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

            sqlSession.delete("test.deleteUser", 30);

              

            //切记:增删改操作时,要执行commit操作

            sqlSession.commit();

         

            // 5、关闭SqlSession

            sqlSession.close();

        }


    ----------------------------------------------修改用户---------------------------------------------------------------------------------------------

     修改用户。
  编写映射文件

 

    <!-- 根据传入的用户信息修改用户 -->

    <update id="updateUser"parameterType="cn.itcast.mybatis.po.User">

        UPDATE USER SET username = #{username},sex=#{sex}WHERE id=#{id}

    </update>

 

1.1.1.1.1.2     加载映射文件

    章节已配置,此处无需再次配置。

    编写测试程序

        @Test

        publicvoid updateUserTest() throws Exception{

            // 1、读取配置文件

            String resource = "SqlMapConfig.xml";

            InputStream inputStream = Resources.getResourceAsStream(resource);

            // 2、根据配置文件创建SqlSessionFactory

            SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);

            // 3SqlSessionFactory创建SqlSession

            SqlSession sqlSession = sqlSessionFactory.openSession();

            // 4SqlSession执行statement,并返回映射结果

              

            //构建user参数,没有赋值的属性采取默认值

            User user = new User();

            user.setId(28);

            user.setUsername("栋哥11");

            user.setAddress("海淀西三旗");

              

            // 第一个参数:statementid,建议:namespace.statementId(确保唯一)

            // 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致

            sqlSession.update("test.updateUser", user);

              

            //切记:增删改操作时,要执行commit操作

            sqlSession.commit();

         

            // 5、关闭SqlSession

            sqlSession.close();

        }

        


        ----------------------------------------------总结---------------------------------------------------------------------------------------------


1.1.1 小结

1.1.1.1  parameterType

指定SQL中输入参数的java类型,可以填写别名或Java类的全限定名。mybatis通过ognl从输入对象中获取参数值拼接在sql中。

1.1.1.2  resultType

指定SQL中输出结果的java类型,可以填写别名或Java类的全限定名

1.1.1.3  #{}${}

#{}:相当于预处理中的占位符?。

#{}里面的参数表示接收java参数的名称。

#{}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,#{}里面可以是value,也可以是其他。

#{}可以防止SQL注入。

${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

${}会引起SQL注入,所以要谨慎使用。

${}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,${}里面只能是value

1.1.1.4  selectOneselectList

selectOne:只能查询01条记录,大于1条记录的话,会报错:


selectList:可以查询0N条记录

 

1.1.1.5  SqlSessionSqlSessionFactorySqlSessionFactoryBuilder生命周期

通过入门程序,大家可以看出,在测试代码中,有大量的重复代码。所以我们第一反应就是想给它抽取出共性的部分,但是SqlSessionSqlSessionFactorySqlSessionFactoryBuilder有着各自的生命周期,因为这些生命周期的不同,抽取时要有针对性的处理。

所以在抽取之前,我们先来了解并总结下它们三个的生命周期。

1.1.1.5.1      SqlSessionFactoryBuilder

它的作用只是通过配置文件创建SqlSessionFactory,所以只要创建出SqlSessionFactory,它就可以销毁了。所以说,它的生命周期是在方法之内。

 

1.1.1.5.2      SqlSessionFactory

它的作用是创建SqlSession的工厂,工厂一旦创建,除非应用停掉,不要销毁。

所以说它的生命周期是在应用范围内。这里可以通过单例模式来管理它。

mybatis整合spring之后,最好的处理方式是把SqlSessionFactory交由spring来做单例管理。

 

1.1.1.5.3      SqlSession

SqlSession是一个面向用户的接口,它的默认实现是DefaultSqlSession

Mybatis是通过SqlSession来操作数据库的。SqlSession中不仅包含要处理的SQL信息,还包括一些数据信息,所以说它是线程不安全的,因此我们最佳的生命周期范围是在方法体之内。


3.MyBatis 入门程序

标签:mybatis 入门程序

原文地址:http://liuzedong.blog.51cto.com/8906170/1663807

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!