文档章节

【MyBatis框架】MyBatis入门程序第二部分

M
 Mysoft
发布于 2015/09/17 10:40
字数 1970
阅读 61
收藏 0

我们通过写一个简单的MyBatis小项目来在实战中学习MyBatis,接着上一篇继续

我们开始实现需求中的添加和删除用户功能
(1)向数据库中添加用户数据
使用User.xml,加入添加用户的sql语句。

<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息) 
#{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    insert into user(username,birthday,sex,address) value(#{username}.#{birthday,jdbcType=DATE}.#{sex},#{address})
</insert>

*注:在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date类型:
#{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。


测试方法:

//添加用户

 @Test 
    public void insertUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //将配置文件加载成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //创建会话工厂,传入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //通过工厂得到sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //插入用户对象
            User user=new User();
            user.setUsername("李云华");
            user.setBirthday(new Date());
            user.setSex("男");
            user.setAddress("云南大理");
            //通过SqlSession操作数据库
            //第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id
            //第二个参数:指定和映射文件所匹配的parameterType类型的参数
            //sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型
            sqlSession.insert("test.insertUser",user);
            
            //提交事务
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //释放资源
            sqlSession.close();
        }
        
    }

测试结果:
在数据库中插入了
李云华(String), 2015-06-07(Date), 男(String), 云南大理(String)


(2)主键返回
a.自增主键的返回
mysql的自增主键,执行insert之前自动生成一个自增主键
通过mysql函数获取到刚插入记录的自增主键
LAST_INSERT_ID
(当插入一个数据后,立即用这个函数就会返回刚加的主键:SELECT LAST_INSERT_ID())
在刚刚的User.xml中这么写:

<!-- 添加用户
parameterType:指定输入参数类型是pojo(包括用户信息) 
#{}中指定POJO的属性名,接收到POJO对象的属性值,mybatis通过OGNL获取对象的属性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    <!-- 将插入数据的主键返回,返回到user对象中。
    SELECT_INSERT_ID():得到刚insert进去的主键值,只适用于自增主键 
    KeyProperty:将查询到主键值设置到parameterType指定对象的哪个属性。
    order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
    -->
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
</insert>

我们在刚刚的方法后面输出user的ID

//插入用户对象
User user=new User();
user.setUsername("李云华");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("云南大理");
//通过SqlSession操作数据库
//第一个参数:映射文件中的statement的Id,等于=namespace+"."+statement的Id
//第二个参数:指定和映射文件所匹配的parameterType类型的参数
//sqlSession.selectOne最终结果与你映射文件中所匹配的resultType类型
sqlSession.insert("test.insertUser",user);
            
//提交事务
sqlSession.commit();
            
System.out.println(user.getId());

结果:6
为啥能得到,就是在配置文件里设置了当insert完成之后就把id取出来存到user对象中

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

执行思路:
先通过uuid()查询到主键,将主键输入到sql语句中。

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

在刚刚的User.xml中这么写:

<!-- 使用MySql的UUID来生成主键
        执行过程:
        首先通过uuid()得到主键,将主键设置到user对象的id属性中
        其次在insert执行时,从user对象中取出id属性值 -->
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})

如果使用的数据库是oracle那么通过oracle的序列生成主键写法:
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT 序列名.nextval()
</selectKey>
insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday,jdbcType=DATE},#{sex},#{address})


(3)删除和更新用户

映射文件User.xml中添加的语句:

<!-- 删除用户 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
    delete from user where id=#{id}
</delete>
    
<!-- 更新用户 
分析:
需要传入用户的id,需要传入用户的更新信息.
parameterType指定user对象,包括id和更新信息(注意:id必须存在)
#{id}:从输入user对象中获取id属性值-->
<update id="updateUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address}     
        where id=#{id}
</update>

测试代码:
删除测试代码:

//删除用户
    @Test 
    public void deleteUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //将配置文件加载成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //创建会话工厂,传入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //通过工厂得到sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //传入id删除用户
            sqlSession.delete("test.deleteUser",6);
            
            //提交事务
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //释放资源
            sqlSession.close();
        }
        
    }

   

测试结果:从数据库删除了id为6的数据

更新测试代码:

   

//更新用户
    @Test 
    public void updateUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //将配置文件加载成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //创建会话工厂,传入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //通过工厂得到sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //更新用户信息(更改id=5的用户数据)
            User user=new User();
            user.setId(5);
            user.setUsername("刘三姐");
            user.setBirthday(new Date());
            user.setSex("女");
            user.setAddress("云南大理");
            sqlSession.update("test.updateUser",user);
            
            //提交事务
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //释放资源
            sqlSession.close();
        }
        
    }

测试结果:
id=5的数据被更新

小结:
a.parameterType
在映射文件中通过parameterType指定输入 参数的类型。

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

c.#{}和${}

#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

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

d.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


最后来说说hibernate与mybatis,大家如果用过hibernate,刚学mybatis就会很疑惑,mybatis的执行效率并不比 hibernate高多少,而且还要多写sql语句,为什么要用它呢?下面来看一下它们的区别,你就会明白mybatis的存在是有一定道理的
看看mybatis和hibernate本质区别和应用场景:

hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
对sql语句进行优化、修改比较困难的。
应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。

mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
应用场景:
适用与需求变化较多的项目,比如:互联网项目。

本文转载自:http://blog.csdn.net/acmman/article/details/46455411

M
粉丝 4
博文 58
码字总数 24535
作品 0
广州
高级程序员
私信 提问
MyBatis3.2.x从入门到精通系列

Java框架篇---Mybatis 入门 MyBatis3.2.x从入门到精通之第一章 MyBatis3.2.x从入门到精通之第二章 MyBatis3.2.x从入门到精通之第三章 MyBatis3.2.x从入门到精通之第四章 MyBatis3.2.x从入门到...

HenrySun
2016/10/07
88
0
springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits [TOC] 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,...

brianway
2016/03/30
2.3K
2
基于MyBatis的增删改查的基础操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/81482092 MyBtais入门 Mybatis和hibernate的区别 2.MyBatis的入门程序 2.1 在项目中...

杨校
2018/08/07
0
0
基于MyBatis的增删改查操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/81484334 MyBtais入门 Mybatis和hibernate的区别 2.MyBatis的入门程序 2.1 在项目中...

杨校
2018/08/07
0
0
SSM框架之MyBatis3专题1:MyBatis入门

1 框架 百度百科介绍:框架(Framework)是整个或者部分系统的可重用设计,表现为一组抽象构件以及构件实例间交互的方法;另一种定义认为,框架是可被应用功能开发者制定的应用骨架。可以说,...

糖醋白糖
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何编写高质量的 JS 函数(1) -- 敲山震虎篇

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/7lCK9cHmunvYlbm7Xi7JxQ 作者:杨昆 一千个读者,有一千个哈姆雷特。 此系列文章将会从函数的执行机制、鲁棒性、函...

vivo互联网技术
32分钟前
4
0
学会这5个Excel技巧,让你拒绝加班

在网上,随处都可以看到Excel技巧,估计已看腻了吧?但下面5个Excel技巧会让你相见恨晚。关键的是它们个个还很实用 图一 技巧1:快速删除边框 有时当我们处理数据需要去掉边框,按Ctrl+Shif...

干货趣分享
今天
11
0
JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
9
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
15
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3.3K
25

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部