如果说你还在用eclipse做开发,只能说明你要么是一个已经编程很久但是不远改变习惯的老程序员,要么是一个刚开始学习java的新手,如果是前者,我无言以劝,因为习惯很难改变,但是如果你是一个刚入门的新手,那么希望你从这篇文章开始,学习使用----IntelliJ IDEA,忘记eclipse吧
开发环境:
IDEA + mysql + mybatis + spring + maven + git
在这里我想引用下网上对于mybatis和springd的一些优缺点的分析,个人觉得非常透彻。
mybatis的优缺点:
优点:
1. 易于上手和掌握。
2. sql写在xml里,便于统一管理和优化。
3. 解除sql与程序代码的耦合。
4. 提供映射标签,支持对象与数据库的orm字段关系映射
5. 提供对象关系映射标签,支持对象关系组建维护
6. 提供xml标签,支持编写动态sql。
缺点:
1. sql工作量很大,尤其是字段多、关联表多时,更是如此。
2. sql依赖于数据库,导致数据库移植性差。
3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,
如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
5. DAO层过于简单,对象组装的工作量较大。
6. 不支持级联更新、级联删除。
7. 编写动态sql时,不方便调试,尤其逻辑复杂时。
8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
9. 使用不当,容易导致N+1的sql性能问题。
10. 使用不当,关联查询时容易产生分页bug。
11. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
12. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
13. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
14. 缓存使用不当,容易产生脏数据。
总结:
mybatis的优点其实也是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql
的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限,无法像j
dbc那样在代码里根据逻辑实现复杂动态sql拼接。mybatis简单看就是提供了字段映射和对象关系映射的jdbc,省去了数据赋值
到对象的步骤而已,除此以外并无太多作为,不要把它想象成hibernate那样强大,简单小巧易用上手,方便浏览修改sql就是它
最大的优点了。
mybatis适用于小型且程序员能力较低的项目和人群使用,对于中大型项目来说我并不推荐使用,如果觉得hibernate效率低的话
(实际上也是使用不当所致,hibernate是实际上是不适用于拥有高负载的工程项目),还不如直接用spring提供的jdbc简单框架
(Template),同样支持对象映射。
spring的优缺点:
优点
a. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的
framework,
Spring致力于解决剩下的问题。
b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性
和面向对象的程度。
c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经
对某个类
要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的
JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。
d. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
e. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
f. 使用Spring构建的应用程序易于单元测试。
g. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却
不会影响调用代码。
h.Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使
用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。
i.Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
缺点:使用人数不多、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
下面开始从一个非常简单的例子来进入对mybaits的学习。
例子demo地址:https://github.com/felay/mybaits-demo,其中doc文件是从官网上扒下来的中文文档,很多对于mybatis的介绍都在里面
1.首先打开IDEA-FILE-NEW 进入新建项目页面,如下图:
2.新建一个Maven项目,自己默认生成,不从maven骨架中选择,即不选择Create from archetype,选择next,填写GrounpId和ArtifactId,其中GrounpId一般填写公司名称,ArtifactId填写项目名称,比如下图:
此时我们新建了一个maven项目。
3.填写pom.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.vcg</groupId> <artifactId>mybatis</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <!--mybatis的依赖包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <!--mysql-jar包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies> <build> <!--让包路径下的xml文件在编译时候可以一起打包到classpath下--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> <!--让mavem编译的时候跳过测试--> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
4.新建实体类---User,如下:
package com.vcg.entity; import java.io.Serializable; /** * Created by felayman on 2015/5/12. */ public class User implements Serializable { private static final long serialVersionUID = 5290554467007482646L; private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
5.新建Mapper接口类---UserMapper,如下:
package com.vcg.dao; import com.vcg.entity.User; /** * Created by felayman on 2015/5/12. */ public interface UserMapper { public User getUser(int id); }
<?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"> <mapper namespace="com.vcg.dao.UserMapper"> <resultMap type="User" id="userResultMap"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> </resultMap> <!-- 查询学生,根据id --> <select id="getUser" parameterType="int" resultType="User" resultMap="userResultMap"> SELECT * from user WHERE id = #{id} </select> </mapper>7.新建mybatis的配置文件--mybatis-config.xml,如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--别名--> <typeAliases> <typeAlias alias="User" type="com.vcg.entity.User"/> </typeAliases> <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://127.0.0.1:3306/mybatis" /> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <!--Mappers标签:加载MyBatis中实体类的SQL映射语句文件--> <mappers> <mapper resource="com/vcg/dao/UserMapper.xml" /> </mappers> </configuration>
package com.vcg.test; import com.vcg.entity.User; 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 java.io.InputStream; import java.io.Reader; /** * Created by felayman on 2015/5/12. */ public class UserTest { private static SqlSessionFactory sqlSessionFactory ; //以流的方式来创建sqlSessionFactory private static InputStream in; /** * 获取sqlSessionFactory * @return */ public static SqlSessionFactory getSession(){ return sqlSessionFactory; } static { try { in = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); }catch(Exception e){ e.printStackTrace(); } } public static void main(String []args){ SqlSession session = sqlSessionFactory.openSession(); try { User user = session.selectOne("com.vcg.dao.UserMapper.getUser",1); System.out.println(user); }catch(Exception e){ e.printStackTrace(); } } }
/* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 60004 Source Host : localhost:3306 Source Database : mybatis Target Server Type : MYSQL Target Server Version : 60004 File Encoding : 65001 Date: 2015-05-12 23:00:46 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'root', 'root');
11.然后我们就会看到我们想要的结果(利用mybatis从数据库中查找我们需要的数据),这个demo非常简单,最重要的是我们不依赖于其他jar包,便完成了对mybatis简单的功能实现,后面会集成其他框架,以更好的体验出mybatis的优点,demo中没有说明各个包直接的包结构,大家可以下载源码看一下。下一节我们会对该demo中的代码部分进行分析,然后自己利用java自己简单实现一个类似于mybatis的sql映射工具出来。
原文地址:http://blog.csdn.net/u012332735/article/details/45676481