接下来我们来实现新增用户功能:

一、新增用户

  这里我们使用的sql为:insert into user(username,birthday,sex,address) values ("lwj","2018-01-26","2","南天门");

1.1 在userMapper.xml 文件中新增配置内容:

 <?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="user">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? --> <!--根据id查询用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.lwjnicole.pojo.User">
select * from user where id = #{v}
</select> <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
<!--resultType的配置和返回一个结果的配置一样 -->
<!--实现功能 :根据用户名模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
select * from user where username like '%${value}%'
</select> <!--实现功能:新增用户 -->
<insert id="insertUser" parameterType="com.lwjnicole.pojo.User">
insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>

1.2 在Test类中新增Junit测试代码:

 package mybatis_study;

 import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before; import com.lwjnicole.pojo.User; public class Test {
private SqlSessionFactory sqlSessionFactory = null;
private SqlSession session = null; @Before
public void before(){
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = null;
try {
//加载SqlMapConfig.xml配置文件
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
} //新增用户
@org.junit.Test
public void insertUser(){
//创建SqlSession对象
session = sqlSessionFactory.openSession();
//创建需要新增的User对象
User user = new User();
user.setUsername("lwj");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("南天门");
//执行新增操作
session.insert("insertUser", user);
System.out.println(user);
//提交事务
session.commit();
} @After
public void after(){
//释放资源
session.close();
}
}

1.3 执行结果为:

保存成功,这里我们注意到上面的 id 字段值为 0,那么接下来我们来解决id=0 的问题。

二、mysql 的自增主键返回

  查询自增主键的sql为:SELECT LAST_INSERT_ID();

我们只需要修改 userMapper.xml 映射文件就可以将主键返回,添加 selectKey 标签:

 <?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="user">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? --> <!--根据id查询用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.lwjnicole.pojo.User">
select * from user where id = #{v}
</select> <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
<!--resultType的配置和返回一个结果的配置一样 -->
<!--实现功能 :根据用户名模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
select * from user where username like '%${value}%'
</select> <!--实现功能:新增用户 -->
<insert id="insertUser" parameterType="com.lwjnicole.pojo.User">
<!--selectKey 标签实现主键返回 -->
<!--keyColumn :主键对应数据库表中的哪一列 -->
<!--keyProperty :主键对应pojo中的哪一个属性 -->
<!--order :设置在执行insert语句之前执行查询id的sql,还是在执行insert语句之后执行查询id的sql -->
<!--resultType:设置返回id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>
LAST_INSERT_ID() 是mysql的函数,返回auto_increment自增列新记录id值。
修改userMapper.xml映射文件后的执行结果为:

上面我们可以看到 id的值已经出来了,如果后续操作需要id参数,那么就可以这样来使用啦!

三、修改用户

  3.1 在 userMapper.xml映射文件中添加配置内容如下:

 <?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="user">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? --> <!--根据id查询用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.lwjnicole.pojo.User">
select * from user where id = #{v}
</select> <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
<!--resultType的配置和返回一个结果的配置一样 -->
<!--实现功能 :根据用户名模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
select * from user where username like '%${value}%'
</select> <!--实现功能:新增用户 -->
<insert id="insertUser" parameterType="com.lwjnicole.pojo.User">
<!--selectKey 标签实现主键返回 -->
<!--keyColumn :主键对应数据库表中的哪一列 -->
<!--keyProperty :主键对应pojo中的哪一个属性 -->
<!--order :设置在执行insert语句之前执行查询id的sql,还是在执行insert语句之后执行查询id的sql -->
<!--resultType:设置返回id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert> <!--实现功能:修改用户 -->
<update id="updateUser" parameterType="com.lwjnicole.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>
</mapper>

  3.2 Test类中新增Junit测试代码如下:

 package mybatis_study;

 import static org.junit.Assert.*;

 import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before; import com.lwjnicole.pojo.User; public class Test {
private SqlSessionFactory sqlSessionFactory = null;
private SqlSession session = null; @Before
public void before(){
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = null;
try {
//加载SqlMapConfig.xml配置文件
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
} //修改用户
@org.junit.Test
public void updateUser(){
//创建SqlSession对象
session = sqlSessionFactory.openSession();
//创建需要修改的User对象
User user = new User();
user.setId(31);
user.setUsername("神龙");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("浦东");
//执行修改操作
session.update("updateUser", user);
//提交事务
session.commit();
} @After
public void after(){
//释放资源
session.close();
}
}

  3.3 执行结果:

四、删除用户

  4.1 在 userMapper.xml映射文件中添加配置内容如下:

 <?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="user">
<!-- id:statement的id 或者叫做sql的id-->
<!-- parameterType:声明输入参数的类型 -->
<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
<!-- #{}:输入参数的占位符,相当于jdbc的? --> <!--根据id查询用户信息 -->
<select id="findUserById" parameterType="Integer" resultType="com.lwjnicole.pojo.User">
select * from user where id = #{v}
</select> <!--如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
<!--resultType的配置和返回一个结果的配置一样 -->
<!--实现功能 :根据用户名模糊查询用户列表 -->
<select id="findUserByUsername" parameterType="String" resultType="com.lwjnicole.pojo.User">
select * from user where username like '%${value}%'
</select> <!--实现功能:新增用户 -->
<insert id="insertUser" parameterType="com.lwjnicole.pojo.User">
<!--selectKey 标签实现主键返回 -->
<!--keyColumn :主键对应数据库表中的哪一列 -->
<!--keyProperty :主键对应pojo中的哪一个属性 -->
<!--order :设置在执行insert语句之前执行查询id的sql,还是在执行insert语句之后执行查询id的sql -->
<!--resultType:设置返回id的类型 -->
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address});
</insert> <!--实现功能:修改用户 -->
<update id="updateUser" parameterType="com.lwjnicole.pojo.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update> <!--实现功能:删除用户 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id = #{id}
</delete>
</mapper>

  4.2 Test类中新增Junit测试代码如下:

 package mybatis_study;

 import static org.junit.Assert.*;

 import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before; import com.lwjnicole.pojo.User; public class Test {
private SqlSessionFactory sqlSessionFactory = null;
private SqlSession session = null; @Before
public void before(){
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = null;
try {
//加载SqlMapConfig.xml配置文件
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象
this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
} //删除用户
@org.junit.Test
public void deleteUserById(){
//创建SqlSession对象
session = sqlSessionFactory.openSession();
//执行删除sql
session.delete("deleteUserById", 31);
//提交事务
session.commit();
} @After
public void after(){
//释放资源
session.close();
}
}

  4.3 执行结果:

五、mybatis解决了JDBC的哪些问题

  1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

      解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

  2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

      解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

  3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

      解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

  4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

      解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

六、mybatis 和 hibernate 的比较

  Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

  Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

  Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

  总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

mybatis的CRUD实例(四)的更多相关文章

  1. mybatis的CRUD实例(三)

    前面的文章我们已经实现了根据id查询用户信息的功能,下面我们进行其他业务功能的实现. 一.根据用户名模糊查询用户列表 查询使用的sql : select * from user where usern ...

  2. MyBatis基础入门《四》接口方式.Select查询集合

    MyBatis基础入门<四>接口方式.Select查询集合 描述: 在<MyBatis基础入门<二>Select查询>中有说过,SQLSession有两种用法,这里 ...

  3. Mybatis的CRUD案例

    一.Mybatis增删改查案例 上一节<Mybatis入门和简单Demo>讲了如何Mybatis的由来,工作流程和一个简单的插入案例,本节主要继上一讲完整的展示Mybatis的CRUD操作 ...

  4. mybatis 学习笔记(四):mybatis 和 spring 的整合

    mybatis 学习笔记(四):mybatis 和 spring 的整合 尝试一下整合 mybatis 和 spring. 思路 spring通过单例方式管理SqlSessionFactory. sp ...

  5. 03 Mybatis:05.使用Mybatis完成CRUD

    mybatis框架:共四天 明确:我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式.不管使用XML还是注解配置. 第二天:mybatis基本使用 mybatis的单表crud操作 ...

  6. mybatis(CRUD)

    3.mybatis(CRUD) 有了mybatis,我们要对数据库进行增删改查只需要操作接口和mapper.xml文件,然后进行测试就可以了. 实例代码如下: 接口 public interface ...

  7. C语言库函数大全及应用实例四

    原文:C语言库函数大全及应用实例四                                    [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...

  8. Springboot & Mybatis 构建restful 服务四

    Springboot & Mybatis 构建restful 服务四 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务三 2 restful ...

  9. MyBatis:CRUD功能

    在前面已经自动生成了mapper和pojo,接下来我们实现mybatis的CRUD功能,先新建service.controller层的方法. 这里的sid是一个开源的id生成类,写完后,我们还需要在启 ...

随机推荐

  1. 面向对象的JavaScript-009-闭包

    引自:https://developer.mozilla.org/cn/docs/Web/JavaScript/Closures 闭包是指能够访问自由变量的函数 (变量在本地使用,但在闭包中定义).换 ...

  2. cakephp中sql查询between

    $trading_list = $this->Trading->find('all', array('conditions' => array('buy_time BETWEEN ? ...

  3. [SoapUI] 通过编程的方式设置当前的Environment

    testRunner.testCase.testSuite.project.setActiveEnvironment("Live")

  4. 查看并解除Oracle锁

    当某个数据库用户在数据库中插入.更新.删除一个表的数据,或者增加一个表的主键时或者表的索引时, 常常会出现ora-00054:resource busy and acquire with nowait ...

  5. centos7如何知道jdk的在哪个目录

    今天一个小实验需要安装jdk,用命令Java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...

  6. jQuary总结9:html()的常见用法

    1html() 不传参数 用于获取内容 //html <div> <p></p> <span></span> 文本 </div> ...

  7. 公司web安全等级提升

    目录 背景介绍 目录 针对国调的初次测试结果 解决方案 二次测试 关于XSS 什么是XSS 基本防御 代码防御 xss代码辑录 说明 参考文章 版本记录 背景介绍 公司的一个web数据展示系统,本来是 ...

  8. HALCON机器视觉软件

    HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境.它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉,医学图像和图像分析 ...

  9. 我的CSS3学习笔记

    1.元字符使用: []: 全部可选项 ||:并列 |:多选一 ?: 0个或者一个 *:0个或者多个 {}: 范围 2.CSS3属性选择器: E[attr]:存在attr属性即可: E[attr=val ...

  10. [Selenium With C#基础教程] Lesson-05 文本框

    作者:Surpassme 来源:http://www.jianshu.com/p/7dca7d0d1ea3 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 文本框在Web页面中 ...