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

一、新增用户

  这里我们使用的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. 633E Binary Table

    传送门 分析 我们发现n特别小,所以可以从这里入手 我们记录出所有列中某一种状态的列有多少个 我们再记录出每种列最少有多少个1(原来的1的个数和取反后的个数去最小值) 于是我们可以得出对于所有列异或一 ...

  2. Excel数据透视表

    Excel中每列是一个字段,每行是一条记录. 值字段设置,双击更改统计方法. 双击透视表中的数据可以看具体是哪些记录贡献的这些数据. 显示报表筛选页,生成多个工作簿.

  3. 开发工具Visual Studio使用相关知识和经验的碎片化记录

    开发工具Visual Studio使用相关知识和经验的碎片化记录 1.Visual Studio提示"无法启动IIS Express Web服务器"的解决方法 有时,在使用Visu ...

  4. Hibernate环境搭建

    Hibernate的环境搭建,主要步骤分为一下四步: 首先创建一个工程,在工程里创建一个实体类User,在这个实体类中必须包含无参的构造器,和这个类对属性的存取方法(getter and setter ...

  5. SQL数据透视

    透视是一种通过聚合和旋转把数据行转换成数据列的技术.当透视数据时,需要确定三个要素:要在行(分组元素)中看到的元素,要在列(扩展元素)上看到的元素,要在数据部分看到的元素(聚合元素). SQL Ser ...

  6. oracle imp使用

    1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp system/manager file=bible_db log=dible_db full=y ignore=y 3. 导入一 ...

  7. kalilinux-权限提升

    meterpeter: 可以在 Meterpreter 使用 incognito 来开始模拟过程: use incognito 展示 incognito 的帮助文档,通过输入 help 命令: hel ...

  8. 螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题

    原创 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0, 1)=3, ...

  9. 安装Python-Windows

    安装Python-Windows 在开始Python编程前,需要先安装Python环境.Python安装包可以到Python的官网下载,官网地址是https://www.python.org/,如果想 ...

  10. delphi 中封装的VCl窗体Tab键响应问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...