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 也可以实现映射(输入映射、输出映射)。
应用场景:
    适用与需求变化较多的项目,比如:互联网项目。
企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还[基于Python]自己写的一个微信跳一跳自动游戏程序(针对安卓手机)。 全自动运行 自动适应不同分辨率 自动调整各个参数误差.zip行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值