Java EE核心框架实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-05 00:58:53

点击下载

作者:高洪岩 著

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java EE核心框架实战

Java EE核心框架实战试读:

版权信息书名:Java EE核心框架实战作者:高洪岩 著排版:吱吱出版社:人民邮电出版社出版时间:2014-09-01ISBN:9787115365712本书由人民邮电出版社授权北京当当科文电子商务有限公司制作与发行。— · 版权所有 侵权必究 · —第1章MyBatis 3操作数据库

本章将和大家一起分享MyBatis 3框架,此框架的主要作用就是更加便携地操作数据库,比如将数据库返回的内容进行List或实体类的封装,将执行操作的SQL语句配置到XML文件中,这样做有利于代码的后期维护,使代码的分层更加明确。MyBatis框架还具有优化查询效率的缓存等功能。那么在本章中,读者应该着重掌握如下内容:

• 使用基于Eclipse的MyBatis插件执行CURD增删改查操作;

• 使用MyBatis操作常用数据库Oracle、MySQL、MsSQL;

• MyBatis框架中核心对象的生命周期;

• MyBatis结合ThreadLocal类进行CURD的封装。1.1 MyBatis介绍

为什么要使用MyBatis框架呢?举一个最简单的例子,在使用传统的JDBC代码时,需要写上必要的DAO层代码,在DAO层代码中将数据表中的数据封装到自定义的实体类中。这给代码的维护带来了问题。但MyBatis和Hibernate解决了这样的问题,使用它们做查询时,可以自动地将数据表中的数据记录封装到实体或Map中,再将它们放入List中返回。这么常见的功能都可以由MyBatis和Hibernate自由方便地实现,可见,使用这两个框架开发应用软件会非常方便快捷。

MyBatis是一个持久化框架,它有不同的语言版本,比如.NET和Java都有MyBatis对应的类库;它有大多数ORM框架都具有的功能,比如程序员自定义的SQL语句、调用存储过程和一些高级的映射。但在这里需要说明的是,它是一种半自动化的ORM映射框架,所以使用方式和Hibernate有非常大的区别。它以SQL语句为映射基础,在使用MyBatis框架时,可以将SQL语句灵活多变的特性融入项目开发中。

另外,如果使用MyBatis这个框架,还可以省略大多数的JDBC代码,因为它把常用的JDBC操作都进行了封装,可以加快开发效率。MyBatis可以使用XML或Annotations注解的方式将数据表中的记录映射成一个Map或Java POJO实体对象,这也是现在流行ORM的技术方向。比如Hibernate和大多数JPA规范实现者都可以使用Annotations注解的方式来设计程序。

由于MyBatis框架是第三方软件,因此必须单独进行下载,下载的网址为:

http://code.google.com/p/mybatis/

打开网页后看到如图1-1所示的界面。图1-1 MyBatis官方网站

继续操作,单击Downloads链接,打开如图1-2所示的界面。图1-2 准备下载MyBatis框架

此刻已经把MyBatis框架从官网下载到本地计算机中,然后就可以使用它的jar文件进行开发了。下载的zip文件包含开发PDF文档及源代码和jar文件。1.2 MyBatis操作数据库的步骤

开门见山永远是快速学习一门技术最好的方式。

MyBatis框架的核心是SqlSessionFactory对象,从SqlSessionFactory类的名称来看,它是创建SqlSession对象的工厂。但SqlSessionFactory对象的创建来自于SqlSessionFactoryBuilder类,也就是使用SqlSessionFactoryBuilder类创建SqlSessionFactory对象。

使用SqlSessionFactoryBuilder类创建SqlSessionFactory对象的方式可以来自于一个XML配置文件,也可以来自于一个实例化的Configuration对象。1.2.1 使用XML配置文件创建SqlSessionFactory对象

使用XML配置文件方式创建SqlSessionFactory对象的核心代码如下。package test;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class Test {public static void main(String[] args) {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);System.out.println(sqlSessionFactory);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

上述代码的主要作用就是取得SqlSessionFactory工厂对象。下面测试代码是否能正常创建SqlSessionFactory类的实例。

其中mybatis-config.xml配置文件连接数据库的内容如下。

配置文件mybatis-config.xml中主要定义的就是如何连接数据库,以及连接数据库所必备的username和password及url等参数。

项目结构如图1-3所示。图1-3 项目结构

加入当时最新版的MyBatis框架的jar包,如图1-4所示。图1-4 使用当前最新的MyBatis 3.2.2版本

运行程序后并没有出现异常,输出的信息如图1-5所示。

到此,SqlSessionFactory对象成功地从XML配置文件中创建。图1-5 输出sqlSessionFactory对象1.2.2 SqlSessionFactoryBuilder和SqlSessionFactory类的结构

SqlSessionFactoryBuilder类的结构如图1-6所示。图1-6 SqlSessionFactoryBuilder类的结构

SqlSessionFactory类的结构如图1-7所示。图1-7 SqlSessionFactory类的结构

从图1-6和图1-7中可以看到,两者的类结构中基本上全是重载的方法,主要是为了取得SqlSessionFactory和SqlSession对象。1.2.3 使用MyBatis Generator工具逆向

在ORM框架MyBatis中,实现数据表与JavaBean映射时,配置的代码比较复杂,这种情况也存在于Hibernate框架中,虽然MyBatis框架实现ORM的原理是使用SQL语句进行映射JavaBean,但映射的代码还是比较繁多,所以为了加快开发效率,MyBatis官方提供一个Eclipse插件,该插件主要的功能就是生成ORM映射所需要的文件,但在目前来看,此插件只支持eclipse-java-indigo-SR2以上的版本,所以笔者在这里下载了eclipse-java-indigo-SR2-win32,在线成功安装了MyBatis Generator插件,下一步就是使用此插件生成ORM映射文件了。

新建一个Java项目,然后在Java项目的src节点上右键单击,新建一个MyBatis生成ORM文件的配置文件,如图1-8所示。图1-8 创建生成ORM的配置xml文件

单击Next按钮,出现如图1-9所示的界面。

在图1-9界面中,不需要更改配置,保持默认设置即可。单击Finish按钮完成配置文件的创建。图1-9 将文件放入src路径下即可

对生成的generatorConfig.xml配置文件代码进行如下更改。

配置文件generatorConfig.xml是MyBatis Generator插件中必备的文件,通过此文件可以从数据表的结构逆向出对应的Java类,然后用MyBatis的API就可以对这些Java类进行操作,从而演变成对数据表的增删改查操作。

数据表userinfo的表结构如图1-10所示。图1-10 userinfo数据表的结构

注意 需要在Java项目中添加sql驱动jar包。

准备就绪后,单击图1-11中的Generate My Batis/i BATIS Artifacts菜单。

成功生成orm映射文件后,项目结构如图1-12所示。图1-11 根据XML配置文件生成orm映射文件

把orm包中的内容复制到MyEclipse中Web项目的src路径中,如图1-13所示。图1-12 成功生成orm映射文件图1-13 MyEclipse中Web项目的结构

在Web项目中添加MyBatis需要的jar文件。

至此,MyBatis的基础类文件已经准备完毕。1.2.4 使用SqlSession对象在MsSql数据库中新建记录

本节开始把一条记录插入userinfo数据表中。

在Web项目的src目录中创建mybatis-config.xml文件,代码如下。

Servlet核心代码如下。package controller;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;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 orm.Userinfo;public class test extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {Userinfo userinfo = new Userinfo();userinfo.setUsername("usernameValue");userinfo.setPassword("passwordValue");String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSsession = sqlSessionFactory.openSession();sqlSsession.insert("insert", userinfo);sqlSsession.commit();sqlSsession.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

Servlet中的代码实现一个经典的insert数据表的功能,从代码中可以看到MyBatis用最精简的API就可以完全控制数据表中的记录,可见不管从学习、开发等方面MyBatis的成本都比较低。

运行程序后,在控制台输出如下异常信息:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'userinfo' 中的标识列插入显式值。

通过信息可以知道,MyBatis并没有识别userinfo数据表中主键id是自增的情况,解决办法很简单,回到eclipse,将generatorConfig.xml代码改成如下代码。

这里添加了关键的配置代码:

定义主键值id是自增的。

将生成的orm包中所有内容再次复制到MyEclipse的Web项目中,再次运行Servlet,成功在数据表中添加了一条记录,如图1-14所示。图1-14 成功添加一条记录1.2.5 使用SqlSession对象在Oracle数据库中新建记录

回到Eclipse,按照以下代码改动配置文件generatorConfig.xml的代码。

关键配置是如下代码。

由于Oracle数据库使用序列来获取ID主键值,因此不配置上述代码在运行时会出现异常。

用Eclipse生成orm的映射文件,并复制到MyEclipse中的Web项目中,运行Servlet,在数据表中插入了新记录,并且id值由序列生成,结果如图1-15所示。图1-15 Oracle数据表中的新记录1.3 使用MyBatis针对3种数据库(Oracle、MSSQL和MySQL)实现CURD

前面都是使用MyBatis Generator工具生成实体和SQL映射文件,并不能从基础上讲述MyBatis框架的使用,本节将从零基础开始研究如何使用MyBatis框架针对3种主流数据库实现经典功能CURD。1.3.1 针对Oracle的CURD

MyBatis框架针对每一种数据库的操作都大同小异,本节将用示例演示3种主流数据库的CURD操作。1.创建userinfo数据表

创建userinfo数据表,表结构如图1-16所示。图1-16 userinfo数据表的结构2.从Eclipse产生逆向的实体类

在Eclipse中新建java项目,名称为oracleGenerator,添加MyBatis配置文件generator Config.xml,配置代码内容如下。

根据此配置文件会生成实体类Userinfo.java。3.创建Web项目并配置基本开发环境

回到MyEclipse,创建一个Web项目,命名为mybatis_curd_oracle,将Eclipse项目oracle Generator中的orm包中的Userinfo.java复制到MyEclipse项目中的src路径下,如图1-17所示。

实体类Userinfo.java的类结构如图1-18所示。

在Web项目mybatis_curd_oracle中的src路径下创建连接数据库的配置文件mybatis-config. xml,代码如下。 图1-17 MyEclipse中的orm包中有实体图1-18 Userinfo.java的类结构

其中userinfoMapping.xml映射文件的内容如下。 select idauto.nextval from dualinsert intouserinfo(id,username,password,age,insertDate)values(#{id},#{username},#{password},#{age},#{insertdate})delete fromuserinfo where id=#{id}update userinfosetusername=#{username},password=#{password},age=#{age},insertDate=#{insertdate}where id=#{id}

需要特别说明的是,如果SQL语句有一些特殊字段,则必须按照如下格式使用SQL语句。

其中配置代码如下所示。select idauto.nextval from dual

主要的功能是根据序列对象生成一个主键id值,并且此值还可以从代码中获取,也就是插入一条记录后代码就可以获取刚才插入记录的id值。

属性parameterType定义参数的类型,属性resultType定义返回值的类型。

继续创建测试用的Servlet对象,完整的项目结构如图1-19所示。

在图1-19中可以发现src路径下两2个dtd文件,这样为了在开发xml配置或xml映射文件时实现代码自动提示功能。图1-19 完整的项目结构4.创建获取SqlSession对象的工具类

获取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;}}5.插入多条记录

创建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 blocke.printStackTrace();}}}

变量sqlSession的insert方法的第一个参数是userinfoMapping.xml映射文件标签的id值,还要加上namespace命名空间的前缀,映射文件的部分代码如下。

在代码中可以看到获取已经插入数据表中记录的主键值。执行Servlet后在控制台输出的结果如图1-20所示。

Oracle数据库中userinfo数据表的内容如图1-21所示。图1-20 插入多条记录图1-21 出现3条数据记录6.根据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 blocke.printStackTrace();}}}

程序运行后的结果如图1-22所示。图1-22 输出id是7的信息7.查询所有记录

创建Servlet,核心代码如下。public class getAllUserinfo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {SqlSession sqlSession = GetSqlSession.getSqlSession();List 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 blocke.printStackTrace();}}}

程序运行后输出3条记录,如图1-23所示。图1-23 输出3条记录信息8.更新记录

创建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 blocke.printStackTrace();}}}

程序运行后数据表userinfo中的记录已更新,如图1-24所示。图1-24 userinfo数据表中内容已更新9.删除记录

创建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 blocke.printStackTrace();}}}

程序运行后,将id为6的记录删除了,如图1-25所示。图1-25 无id为6的记录

到此,针对Oracle数据库的CURD操作到此结束。1.3.2 针对MSSQL的CURD

操作MSSQL数据库和操作Oracle数据库的大体步骤相同,在SQL Server数据库中创建数据表,如图1-26所示。图1-26 数据表的结构1.使用Eclipse逆向实体类

用相同的方法在Eclipse中创建Java项目,命名为mssqlGenerator,添加MyBatis生成文件,配置内容如下。

关键代码如下。

它的作用是定义userinfo数据表中的id字段是自增的,不需要显式地设置值。2.创建Web项目并搭建基本的开发环境

在MyEclipse中创建Web项目,复制Userinfo.java到Web项目中,并且创建一个连接数据库的配置文件mybatis-config.xml,代码如下。

还要创建sql映射文件userinfoMapping.xml,代码如下。 insert intouserinfo(username,password,age,insertDate)values(#{username},#{password},#{age},#{insertdate})

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载