2018.4.3
仅为个人理解 不足之处欢迎指正~
MyBatis在JavaWeb中可以当作对JDBC的封装,完成与数据库的交互功能,相当于在以前不用框架的JavaWeb中的Dao层
为什么要使用MyBatis?
比如说在之前写的论坛后端中,在一个JDBC.java中,包含了非常多的结构比较相似的代码
public static Connection getConnection(){//获得连接
String driver ="com.mysql.jdbc.Driver";
String url ="jdbc:mysql://localhost:3306/mybbs";
//
String user ="root";
String password ="12345";
Connection connection =null;
try {
Class.forName(driver);
connection =DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
在这一段作用为 获得链接 的代码中 包含了几个不便之处
1.获取链接需要产生一个connection 而其他的增删改查或者其他操作也需要从获取链接开始 也就是说每一个操作都需要一个connection 而connection的创建和销毁都会消耗较多资源
2.
//获取用户信息
public UserBean getMessage(Integer id){
String stuid=null;
String name=null;
String birthday=null;
String school=null;
String major=null;
String note=null;
String email=null;
String res = null;
String sql = "select * from db_user where stuid = ?";
Connection con =getConnection();
PreparedStatement pstmt =null;
ResultSet rs = null;
try { //String stuid,String name,String birthday,String school,String major,String note,String email
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
while(rs.next()){
//System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" ");
stuid=rs.getString(2);
name=rs.getString(3);
birthday=rs.getString(6);
school=rs.getString(7);
major=rs.getString(8);
note=rs.getString(10);
email=rs.getString(11);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(con!=null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
UserBean ub=new UserBean(stuid,name,birthday,school,major,note,email);
return ub;
}
在这样一个 获取用户信息 的方法中 :
String sql = "select * from db_user where stuid = ?";
sql语句是已经写好在源代码中的 那么这样导致的后果是如果在后期想要修改调整sql语句 必须深入到代码中 找到相应的方法 非常的不方便
3.
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
while(rs.next()){
//System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" ");
stuid=rs.getString(2);
name=rs.getString(3);
birthday=rs.getString(6);
school=rs.getString(7);
major=rs.getString(8);
note=rs.getString(10);
email=rs.getString(11);
在这段代码中 对数据库的set操作和get操作 都已经有了明确的对象 这是在最初构建数据库和数据关系时已经确定的 而无论是想要修改sql语句 还是要修改数据库结构 都需要修改这些代码 需要改动的地方太多了
Mybatis是如何解决上面三个问题的?
1.Mybatis在其config.xml中配置连接池
而这个连接池可以管理所有connection
2.sql语句独立在某个类(Bean)的xml映射文件中
insert into category_(name)values(#{name})
delete from category_ where id=#{id}
update category_ set name=#{name} where id=#{id}
在这样一个对 Category 类的增删改查中 包含了所需的sql语句 需要修改时只需要改动配置文件
而在参数传递行为中 传参的语句和sql语句一样 也移动到 映射文件 中
3.修改sql语句导致映射语句也需要修改:将结果映射直接配置到映射文件中 Mybatis将自动映射
总结:
平时我们使用JDBC访问数据库 除了需要自己写SQL之外 还必须操作Connection, Statment, ResultSet 这些其实只是手段的辅助类 不仅如此 访问不同的表 还会写很多雷同的代码 虽然熟练之后可以很快完成 但是依然很繁琐且不方便改动
而在使用Mybatis之后 我们的工作只需要自己提供SQL语句 而其他的比如建立连接、异常处理、statement等操作交给框架去做 那些繁琐的重复的工作也不用再去写了 这样我们就可以专注与sql语句的操作层面
后记:
Mybatis的原理后续慢慢补充~
Mybatis的操作将在另一篇文章中一步一步记录~项目驱动学习~