mybatis是一个java持久层框架,java中操作关系型 数据库用的是jdbc,mybatis是对jdbc的一个封装。 jdk1.7.0_72 eclipse:eclipse-3.7-indigo mysql:mysql5.1 企业开发中,根据项目大小、特点进行技术选型 ,jdbc操作数据库时效率是很高的,jdbc也是技术选型的参考。 需要数据库的驱动包:mysql-connector-java-5.1.7-bin.jar ojdbc14-10.2.0.1.0.jar 上边是mysql的驱动,下边是oracle的驱动。 1、数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率 设想:使用数据库连接池 2、sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护。 设想:将sql语句 统一配置在文件中,修改sql不需要修改java代码。 3、通过preparedStatement向占位符设置参数,存在硬编码( 参数位置,参数)问题。系统不易维护。 设想:将sql中的占位符及对应的参数类型配置在配置文件中,能够自动输入 映射。 4、遍历查询结果集存在硬编码(列名)。 设想:自动进行sql查询结果向java对象的映射(输出映射)。 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。 目前mybatis在github上托管。git(分布式版本控制,当前比较流程) MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。 Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
纯jdbc操作:
package cn.itcast.mybatis.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JdbcTest { public static void main(String[] args) { Connection connection = null; //PreparedStatement是预编译的Statement,通过Statement发起数据库的操作 //PreparedStatement防止sql注入, //写的sql语句是以预编译方式发过去的,sql语句在数据是要进行编译的,编译完成之后会记录到数据库缓存, //当第二次在发预编译的sql时发现一样就不再编译了,执行数据库效率高 PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加载数据库驱动,驱动在jar包里面 Class.forName("com.mysql.jdbc.Driver"); //通过驱动管理类获取数据库链接 //数据库连接频繁的创建和关闭,缺点浪费数据库的资源,影响操作效率,设想:使用数据库连接池 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql"); //定义sql语句 ?表示占位符 //sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护。 //设想:将sql语句 统一配置在文件中,修改sql不需要修改java代码。 String sql = "select * from user where username = ?" ; //获取预处理statement preparedStatement = connection.prepareStatement(sql); //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 //通过preparedStatement向占位符设置参数,存在硬编码( 参数位置,参数)问题。系统不易维护。 //设想:将sql中的占位符及对应的参数类型配置在配置文件中,能够自动输入 映射。 preparedStatement.setString(1, "王五"); //向数据库发出sql执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); //遍历查询结果集 //遍历查询结果集存在硬编码(列名)。 //设想:自动进行sql查询结果向java对象的映射(输出映射)。 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(); } } } } }