Mybatis入门(一)

【Mybatis产生背景】

我们以前是用原始的JDBC程序进行对数据库的操作的,但是会出现一系列的问题,小编在这里就进行总结一下。

1.环境

   java环境:jdk1.7.0_72

   eclipse:indigo

    mysql:5.1

2.创建mysql数据

导入下边的脚本:http://download.csdn.net/download/tengliu6/10220639

3. jdbc程序

(1)使用jdbc查询mysql数据库中用户表的记录。

(2)创建java工程,加入jar包:数据库驱动包(mysql5.1


(3)程序代码

public class JdbcTest {
	
	public static void main(String[] args) {
		
		//数据库连接
		Connection connection = null;
		//预编译的Statement,使用预编译的Statement提高数据库性能
		PreparedStatement preparedStatement = null;
		//结果 集
		ResultSet resultSet = null;
		
		try {
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			
			//通过驱动管理类获取数据库链接
			connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "1234");
			//定义sql语句 ?表示占位符 将来用来建立用户名
			String sql = "select * from user where username = ?";
			//获取预处理statement
			preparedStatement = connection.prepareStatement(sql);
			//设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
			preparedStatement.setString(1, "王五");
			//向数据库发出sql执行查询,查询出结果集
			resultSet =  preparedStatement.executeQuery();
			//遍历查询结果集
			while(resultSet.next()){
				System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//释放资源
			if(resultSet!=null){
				try {
					resultSet.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(preparedStatement!=null){
				try {
					preparedStatement.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(connection!=null){
				try {
					connection.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}

4、问题总结

(1)数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。

设想:使用数据库连接池管理数据库连接。

(2)将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。

设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

(3)向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

设想:将sql语句及占位符号和参数全部配置在xml中。

(4)从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。

设想:将查询的结果集,自动映射成java对象。

【Mybatis】

1、mybatis是一个持久层的框架,是apache下的顶级项目。mybatis托管到goolecode下,再后来托管到github(https://github.com/mybatis/mybatis-3/releases)

2、mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。

3、mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射

【框架】


【Mybatis与hibernate比较】

1、hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。

应用场景:

 适用与需求变化不多的中小型项目,比如:后台管理系统,ERP、ORM、OA。。

2、mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis也可以实现映射(输入映射、输出映射)。

应用场景:

  适用与需求变化较多的项目,比如:互联网项目。

 3、企业进行技术选型,以低成本高回报作为技术选型的原则,根据项目组的技术力量进行选择。

【优缺点】

优点:

 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. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

 10. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

 11. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

 12. 缓存使用不当,容易产生脏数据。

【总结】

  这篇文章主要是对mybatis有一个入门的了解,接下来小编会进行详细的讲解,敬请期待了。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值