Java EE核心框架实战:如何使用MyBatis实现CURD-2种数据库
mhr18 2024-09-29 13:40 24 浏览 0 评论
MyBatis框架针对每一种数据库的操作都大同小异,本节将用示例的方式演示Oracle数据库的CURD操作。
1.准备开发环境
(1)创建数据表。
创建userinfo数据表,表结构如图1-23所示。
(2) 准备generatorConfig.xmli向配置文件。
(3)创建名称为mybatis_curd_oracle的Web项目。
(4)创建Userinfo.java实体类,实体类Userinfo.java类结构如图1-24所示。
(5)项目结构如图1-25所示。
(6)在Web项目mybatis_curd_oracle中的src路径下创建连接数据库的配置文件mybatis-config.xml,代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1522:accp11g" />
<property name="username" value="ghy" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userinfoMapping.xml" />
</mappers>
</configuration>
其中userinfoMapping.xml映射文件内容如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
<mapper namespace="mybatis.testcurd">
<insert id="insertUserinfo" parameterType="orm.Userinfo">
<selectKey resultType="java.lang.Long" keyProperty="id"
order="BEFORE">
select idauto.nextval from dual
</selectKey>
insert into
userinfo(id,username,password,age,insertDate) values(#{id},#{username},#{password},#{age},#{insertdate})
</insert>
<select id="getUserinfoById" parameterType="int" resultType="orm.Userinfo">
select * from
userinfo where id=#{id}
</select>
<delete id="deleteUserinfoById" parameterType="int">
delete from
userinfo where id=#{id}
</delete>
<select id="getAllUserinfo" resultType="orm.Userinfo">
select * from userinfo
</select>
<update id="updateUserinfoById" parameterType="orm.Userinfo">
update userinfo
set
username=#{username},password=#{password},age=#{age},insertDate=#{insertdate}
where id=#{id}
</update>
</mapper>
需要特别说明的是,如果SQL语句有一些特殊符号,则必须使用如下的格式进行设计SQL语句。
<![CDATA[ sql语句 ]]>
其中配置代码如下所示。
<selectKey resultType="java.lang.Long" keyProperty="id"
order="BEFORE">
select idauto.nextval from dual
</selectKey>
标记<selectkey>的order="BEFORE"属性含义是select语句比insert语句先执行, resultType属性值为"java.lang.Long"是将序列返回的数字转成Long类型, keyProperty="id"的作用是将这个Long值放入parameterType的Userinfo的id属性里面。此段配置的主要功能是根据序列对象生成一个主键d值,并且此值还可以在代码中获取,也就是插入一条记录后使用程序代码就可以获取刚才插入记录的id值。
属性parameterType定义参数类型,属性resultType定义返回值的类型。继续创建测试用的Servlet对象,完整的项目结构如图1-26所示。
在图中可以发现src路径下有两个dtd文件,这是为了在开发XML配置或XML映射文件时实现代码自动提示功能。
2.创建获取SqlSession对象工具类
核心代码如下。
package dbtools;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public abstract class GetSqlSession {
public static SqlSession getSqlSession() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream); SqlSession sqlSsession = sqlSessionFactory.openSession();
return sqlSsession;
}
}
3.插入多条记录
创建Servlet,核心代码如下。
public class insertUserinfo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Userinfo userinfo = new Userinfo();
userinfo.setUsername("高洪岩");
userinfo.setPassword("岩洪高");
userinfo.setAge(100L);
userinfo.setInsertdate(new Date());
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.insert("mybatis.testcurd.insertUserinfo", userinfo);
System.out.println(userinfo.getId());
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
变量SqlSession的insert方法的第1个参数是userinfoMapping.xml映射文件<insert>标签的id值,还要加上namespace命名空间的前缀,映射文件部分代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
<mapper namespace="mybatis.testcurd">
<insert id="insertUserinfo" ……>
在代码中可以看到获取已经插入数据表中记录的主键值。
执行Servlet后在控制台输出如图1-27所示。
Oracle数据库中的userinfo数据表内容如图1-28所示。
4. 根据id值查询记录
创建Servlet,核心代码如下。
public class getUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession.getSqlSession();
Userinfo userinfo = sqlSession.selectOne(
"mybatis.testcurd.getUserinfoById", 7);
System.out.println(userinfo.getId());
System.out.println(userinfo.getUsername());
System.out.println(userinfo.getPassword());
System.out.println(userinfo.getAge());
System.out.println(userinfo.getInsertdate().toLocaleString());
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序运行后的效果如图1-29所示。
5. 查询所有记录
创建Servlet,核心代码如下。
public class getAllUserinfo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession.getSqlSession();
List<Userinfo> listUserinfo = sqlSession
.selectList("mybatis.testcurd.getAllUserinfo");
for (int i = 0; i < listUserinfo.size(); i++) {
Userinfo userinfo = listUserinfo.get(i);
System.out.println(userinfo.getId() + " "
+ userinfo.getUsername() + " " + userinfo.getPassword()
+ " " + userinfo.getAge() + " "
+ userinfo.getInsertdate().toLocaleString());
}
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序运行后打印出3条记录,如图1-30所示。
6. 更新记录
7. 创建Servlet,核心代码如下。
public class updateUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession.getSqlSession();
Userinfo userinfo = sqlSession.selectOne(
"mybatis.testcurd.getUserinfoById", 7);
userinfo.setUsername("最新版高洪岩");
sqlSession.update("mybatis.testcurd.updateUserinfoById", userinfo);
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序运行后数据表userinfo中的记录被更新,如图1-31所示。
8. 删除记录
创建Servlet,核心代码如下。
public class deleteUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.delete("mybatis.testcurd.deleteUserinfoById", 6);
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
程序运行后,将id为6的记录删除了,如图1-32所示。
自此,针对Oracle数据库的CURD操作到此结束。
1.3.2 针对MySQL的CURD
本章节也将从零开始,使用MyBatis操作MySQL数据库。
1.准备开发环境
(1)在Eclipse中创建名称为mybatis_curd_mysql的项目。
(2)创建Userinfo.java实体类。
(3)创建mybatis-config.xml配置文件,代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3307/ghydb" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userinfoMapping.xml" />
</mappers>
</configuration>
(4)创建SQL映射文件userinfoMapping.xml,代码如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
<mapper namespace="mybatis.testcurd">
<insert id="insertUserinfo" parameterType="orm.Userinfo"
useGeneratedKeys="true" keyProperty="id">
insert into
userinfo(username,password,age,insertDate)
values(#{username},#{password},#{age},#{insertdate})
</insert>
<select id="getUserinfoById" parameterType="int" resultType="orm.Userinfo">
select * from
userinfo where id=#{id}
</select>
<delete id="deleteUserinfoById" parameterType="int">
delete from
userinfo where id=#{id}
</delete>
<select id="getAllUserinfo" resultType="orm.Userinfo">
select * from userinfo
</select>
<update id="updateUserinfoById" parameterType="orm.Userinfo">
update userinfo
set
username=#{username},password=#{password},age=#{age},insertDate=#{insertdate}
where id=#{id}
</update>
</mapper>
MySQL的主键是自增的,所以不需要序列这种机制。
2.增加一条记录并且返回主键值
创建Servlet对象,插入记录的代码和Oracle数据库对应的Servlet代码一致,运行后在控制台打印4条记录的主键D值,效果如图1-33所示。
数据表userinfo中的内容如图1-34所示。
3.其他业务方法的测试
其他的业务方法代码和操作Oracle数据库的大体一致,并且已经成功运行,详细代码请参看随书下载的源代码。
1.3.3 SQL映射文件中namespace命名空间的作用
当多个SQL映射文件中的id值一样时,在使用SqlSession操作数据库时会出现异常。
创建测试用的namespaceError项目,创建userinfoMapping.xml映射文件代码如下。
<mapper namespace="AAAAA">
<insert id="insertUserinfo" parameterType="orm.Userinfo">
<selectKey resultType="java.lang.Long" keyProperty="id"
order="BEFORE">
select idauto.nextval from dual
</selectKey>
insert into
userinfo(id,username,password,age)
values(#{id},#{username},#{password},#{age})
</insert>
</mapper>
再创建名称为userinfoMappingZZZZZZZZ.xml映射文件,代码如下。
<mapper namespace="BBBBB">
<insert id="insertUserinfo" parameterType="orm.Userinfo">
<selectKey resultType="java.lang.Long" keyProperty="id"
order="BEFORE">
select idauto.nextval from dual
</selectKey>
insert into
userinfo(id,username,password,age)
values(#{id},#{username},#{password},#{age})
</insert>
</mapper>
将这2个SQL映射文件使用<mapper>标签注册到mybatis-config.xml配置文件中,代码如下。
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="y2" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userinfoMapping.xml" />
<mapper resource="userinfoMappingZZZZZZZZ.xml" />
</mappers>
</configuration>
在2个SQL映射文件中都有insert的id属性值为insertUserinfo的配置代码,执行如下Java代码。
public class insertUserinfo {
public static void main(String[] args) {
try {
Userinfo userinfo = new Userinfo();
userinfo.setUsername("高洪岩");
userinfo.setPassword("岩洪高");
userinfo.setAge(100L);
userinfo.setInsertdate(new Date());
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.insert("insertUserinfo", userinfo);
System.out.println(userinfo.getId());
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行后出现了异常,异常信息如下。
java.lang.IllegalArgumentException: insertUserinfo is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries)
异常信息提示insertUserinfo并不是确定的名字,是模糊的,可以尝试使用全名称的方式来调用此SQL映射,所谓的"全名称方式就是指sqlld之前写上namspace命名空间,对namespace命名空间的命名可以写上表的名称,或者是业务的名称,这样有助于区分重复的sqlld。
更改后的Java代码如下。
public class insertUserinfoOK {
public static void main(String[] args) {
try {
Userinfo userinfo = new Userinfo();
userinfo.setUsername("高洪岩");
userinfo.setPassword("岩洪高");
userinfo.setAge(100L);
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.insert("BBBBB.insertUserinfo", userinfo);
System.out.println(userinfo.getId());
sqlSession.commit();
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行insert()方法时在第1个参数加上了命名空间BBBBB ,使用小数点(.)做为间隔,再执行程序就不会出现异常了。
本文节选自《Java EE核心框架实战(第2版)》
本书基于MyBatis3+Hibernate5+Struts2+Spring4MVC+Spring4,融合了作者多年软件开发和培训的经验,面向实战,通过丰富且有参考价值的案例,展现了JavaEE开发领域中最核心、最实用的开发技术,帮助读者全面提升开发技能。
相关推荐
- 甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入
-
IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...
- 甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云
-
IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...
- Spring Boot 自定义数据源设置,这些坑你踩过吗?
-
你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...
- 一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)
-
今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...
- 低代码建模平台-数据挖掘平台(低代码平台的实现方式)
-
现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...
- navicat 17.2.7连接oracle数据库提示加载oracle库失败
-
系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...
- 开源“Windows”ReactOS更新:支持全屏应用
-
IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...
- SSL 推出采用全模拟内置混音技术的模拟调音台Oracle
-
英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...
- 47道网络工程师常见面试题,看看有没有你不会的!
-
你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
-
e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...
- 36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!
-
前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 手把手教你在嵌入式设备中使用SQLite3
-
摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...
- JAVA语言基础(java语言基础知识)
-
一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...
- 再见 Navicat!一款开源的 Web 数据库管理工具!
-
大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入
- 甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云
- Spring Boot 自定义数据源设置,这些坑你踩过吗?
- 一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)
- 低代码建模平台-数据挖掘平台(低代码平台的实现方式)
- navicat 17.2.7连接oracle数据库提示加载oracle库失败
- 开源“Windows”ReactOS更新:支持全屏应用
- SSL 推出采用全模拟内置混音技术的模拟调音台Oracle
- 47道网络工程师常见面试题,看看有没有你不会的!
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)