mybatis基础知识2

3.6 根据用户名称模糊查询用户信息

<!--根据用户名称模糊查询用户信息,可能返回多条
     resultType:指定就是单条记录所映射的Java对象类型
     ${}:表示拼接sql串,将接收到的参数的内容不加任何修饰拼接到sql中
     使用${}拼接sql,引起sql注入
     ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
       -->
      <select id="findUserByName" parameterType="java.lang.String" resultType="mybatis.po.User">
        select * from user where loginname like '%${value}%'
      </select>
/**
     * 根据用户名称模糊查询用户列表
     * @throws IOException
     */
    @Test
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //list 中的user和映射文件中resultType所指定的类型一致
        List<User> list=sqlSession.selectList("test.findUserByName", "小美");

        System.out.println(list);

        //释放资源
        sqlSession.close();
    }

3.7 添加用户

 <!--添加用户
      parameterType:指定输入参数类型是po(包括用户信息)
      #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
        -->
      <insert id="insertUser" parameterType="mybatis.po.User" >
            insert into user(loginname,password,sex,age) value(#{loginname},#{password},#{sex},#{age})
      </insert>
/**
     * 添加用户
     * @throws IOException
     */
    @Test
    public void insertUserTest() throws IOException{
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //插入用户对象
        User user=null;
        for(int i=0;i<10;i++){
            user=new User();
            user.setLoginname("小美"+i);
            user.setPassword("12"+i*16);
            user.setSex(i%2!=0?"男":"女");
            user.setAge(12+i*3);
            sqlSession.insert("test.insertUser", user);
        }


        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

3.7.3 自增主键返回

mysql自增主键,执行insert提交之前自动生成一个自增主键。
通过mysql函数获取到刚插入记录的自增主键:
SELECT LAST_INSERT_ID()
是insert之后调用此函数。 修改insertUser定义:

<insert id="insertUser" parameterType="mybatis.po.User" >
            <!--将插入数据的主键返回,返回到user对象中
            select last_insert_id():得到刚刚insert进去的主键值,只适用自增主键
            keyProperty:将查询到主键值设置到paramterType指定的对象的那个属性
            order:select last_insert_id()执行顺序,相对于insert语句来说它的执行顺序
            resultType:指定 select last_insert_id()结果类型
             -->
             <selectKey keyProperty="uid" order="AFTER" resultType="java.lang.Integer">
                SELECT LAST_INSERT_ID() 
             </selectKey>
            insert into user(loginname,password,sex,age) value(#{loginname},#{password},#{sex},#{age})
      </insert>

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

使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
执行思路:
先通过uuid()查询到主键,将主键输入 到sql语句中。
执行uuid()语句顺序相对于insert语句之前执行

<insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">
    <selectKey resultType="java.lang.String" order="BEFORE" 
        keyProperty="id">
            select uuid()
    </selectKey>
    insert into user(uid,loginname,password,sex,age) value(
    #{uid},#{loginname},#{password},#{sex},#{age})
</insert>
注意这里使用的order是“BEFORE”

1.6.7.2.5   Oracle使用序列生成主键
首先自定义一个序列且用于生成主键,selectKey使用如下:
<insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">
    <selectKey resultType="java.lang.Integer" order="BEFORE" 
    keyProperty="id">
    SELECT 自定义序列.NEXTVAL FROM DUAL
    </selectKey>
    insert into user(uid,loginname,password,sex,age) value(
    #{uid},#{loginname},#{password},#{sex},#{age})
</insert>
注意这里使用的order是“BEFORE”

3.8 删除用户

 <!--删除用户 
      根据loginname删除用户,需要输入loginname值 
      -->
      <delete id="deleteUser" parameterType="java.lang.String">
        delete from user where loginname like '%${value}%'
      </delete>
/**
     * 根据用户名删除用户
     * @throws IOException
     */
    @Test
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        //删除用户
        sqlSession.selectList("test.deleteUser", "小美");

        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

3.9 更新用户

<!--更加id更新用户
      分析:
      需要传入用户的id
     需要传入用户的更新信息
     parameterType指定user对象,包括id和更新信息,注意:id必须存在
     #{id}:从输入user对象中获取id属性值
        -->
      <update id="updateUser" parameterType="mybatis.po.User">
            update user set loginname=#{loginname},age=#{age} where uid=#{uid}
      </update>
/**
     * 更新用户信息
     * @throws IOException
     */
    @Test
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream=Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();

        User user=new User();
        //必须设置id
        user.setUid(1234275);
        user.setLoginname("斯蒂芬");
        user.setSex("男");
        user.setAge(23);

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

        //提交事务
        sqlSession.commit();

        //释放资源
        sqlSession.close();
    }

3.10 总结

1) parameterType
在映射文件中通过parameterType指定输入 参数的类型。
2)resultType
在映射文件中通过resultType指定输出结果的类型。

3) #{}和${}
1.#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。如果接收简单类型,#{}中可以写成value或其它名称。
2.#{}接收pojo对象值,通过OGNL Object-Graph Navigation Language对象图导航语言读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

4) selectOne和selectList
1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
3.如果使用selectOne报错:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4

3.11 mybatis和hibernate本质区别和应用场景

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
          对sql语句进行优化、修改比较困难的。
应用场景:
      适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa 电子审批。。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
    适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。
阅读更多
换一批

没有更多推荐了,返回首页