mybatis学习(2)

3、实例(根据用户名称模糊查询用户列表)

//根据用户名称模糊查询用户列表

    @Test

    public void findUserByNameTest() {

        String resource = "SqlMapConfig.xml";

        try {

           InputStream inputStream = Resources.getResourceAsStream(resource);

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

           SqlSession sqlSession = sqlSessionFactory.openSession();

           List<User> list = sqlSession.selectList("test.findUserByName", "客");

           System.out.println(list);

           sqlSession.close();

        } catch (IOException e) {

           e.printStackTrace();

        }

       

    }

 

User.xml:

<!--

    ${}:表示拼接sql串,将接收到参数得内容不加任何修饰

    拼接在sql中,使用${}拼接sql,会引起sql注入

    ${value}:接收输入参数得内容,如果输入类型是简单

    类型,${}中只能用value

     -->

    <select id="findUserByName" parameterType="java.lang.String" resultType="com.fzy.mybatis.po.User">

        select * from users where userName like '%${value}%'

</select>

 

4、小结:

       parameterType:输入映射

       resultType:  输出映射

 

#{}表示一个占位符号                                      #{value}

${}表示一个拼接符号,会引起sql注入。        ‘%${value}%’

 

       selectOne和selectList

selectOne表示查询出一条记录进行映射(可以用selectList查询)

selectList表示查询出一个列表(多条记录)进行映射

 

5、添加用户

映射文件:在user.xml中配置添加用户得Statement

<!-- 添加用户

    patameterType:指定输入参数类型POJO(包括用户信息)

    #{}中指定pojo得属性名,接收pojo对象得属性值,mybatis通过OGNL获取对象得属性值

     -->

    <insert id="insertUser">

        insert into users(userName,password,phone,email,sex,status)

        value(#{userName},#{password},

        #{phone},#{email},#{sex},#{status})

    </insert>

程序代码:

//添加用户信息

    @Test

    public void insertUserTest() {

        String resource = "SqlMapConfig.xml";

        InputStream inputStream;

        try {

           inputStream = Resources.getResourceAsStream(resource);

           SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

                   .build(inputStream);

           SqlSession sqlSession = sqlSessionFactory.openSession();

           //插入用户对象

           User user = new User();

           user.setUserName("why");

           user.setPassword("fzy");

           user.setPhone("13683");

           user.setEmail("why@qq.com");

           user.setSex("女");

           user.setStatus(2);

           sqlSession.insert("test.insertUser", user);

           //事务提交

           sqlSession.commit();

           sqlSession.close();

        } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

    }

 

6、自增主键返回

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

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

LAST_INSERT_ID()         :在insert之后调用该函数

<!-- 添加用户

    patameterType:指定输入参数类型POJO(包括用户信息)

    #{}中指定pojo得属性名,接收pojo对象得属性值,mybatis通过OGNL获取对象得属性值

     -->

    <insert id="insertUser" parameterType="com.fzy.mybatis.po.User">

        <!-- 将插入数据的主键返回,返回到User对象中

        select last_insert_id():得到刚插入记录的主键值

        注:只适用于自增主键

        keyProperty:将查询得到的主键值设置到parameterType指定的对象的属性

        order:此查询语句的执行顺序,相对于insert语句的执行顺序

        resultType指定查询的结果类型

        -->

        <selectKey keyProperty="userId" order="AFTER" resultType="java.lang.Integer">

            select last_insert_id()

        </selectKey>

        insert into users(userName,password,phone,email,sex,status)

        value(#{userName},#{password},

        #{phone},#{email},#{sex},#{status})

    </insert>

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

 

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

思路:

通过uuid()得到主键,将主键值设置到user对象的userId属性中

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

在insert执行时,从user对象中取出userId属性值

<selectKey keyProperty=”userId” order=”BEFORE” resultType=”java.lang.String”>

       select uuid()

</selectKey>

insert into users(userId,username,……) value (#{userId},#{username},……)

 

通过Oracle的序列生成主键:

<selectKey keyProperty=”userId” order=”BEFORE” resultType=”java.lang.String”>

       select 序列名.nextval()

</selectKey>

insert into users(userId,username,……) value (#{userId},#{username},……)

 

8、删除用户

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

    <delete id="deleteUser" parameterType="java.lang.Integer">

        delete from user where userId=#{userId}

    </delete>

  

@Test

    public void deleteUserTest() {

        String resource = "SqlMapConfig.xml";

        InputStream config;

        try {

           config = Resources.getResourceAsStream(resource);

           SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

                   .build(config);

           SqlSession sqlSession = sqlSessionFactory.openSession();

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

           sqlSession.commit();

           sqlSession.close();

        } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

    }

9、更新用户

<!-- 根据userId更新用户

    需要初入用户的id

    传入用户的更新信息

  parameterType指定user对象(包括id和更新信息,i的必须存在)

  #{userId}:从输入user对象中获取id属性值

     -->

    <update id="updateUser" parameterType="com.fzy.mybatis.po.User">

        update users set userName=#{userName} where userId=#{userId}

    </update>

 

@Test

    public void updateUserTest() {

        String resource = "SqlMapConfig.xml";

        try {

           InputStream inputStream = Resources.getResourceAsStream(resource);

           SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()

                   .build(inputStream);

           SqlSession sqlSession = sqlSessionFactory.openSession();

           User user =  new User();

           user.setUserId(4);

           user.setUserName("岩");

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

           sqlSession.commit();

           sqlSession.close();

        } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }

       

    }

10、总结

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

       若是简单类型,#{}可以写成value或其它名称

       若是pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值。

 

${}表示一个拼接符号,                   会引起sql注入           ‘%${value}%’

#{}接收输入参数,类型可以时简单类型,pojo,hashmap

       若是简单类型,#{}只能写成value

       若是pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性..的方式获取对象属性值。

posted @ 2018-09-03 15:08  陌上花开远  阅读(173)  评论(0)    收藏  举报