SSM框架体系-从JDBC到Mybatis(一)

前言

Java学到一定水平,框架究竟是不可防止的,究竟程序支付很多时候不是1人的事宜。那两日学习了MyBatis框架,想着结合一下这几天学到的东西和实习的经验计算一下。差不多的笔触正是从JDBC的缺点到MyBatis的牵线和平运动行流程,再不怕Mybatis的3个增加和删除改查小程序;然后是店铺中MyBatis实行数据库开发时行使Dao方法和Mapper方法的三个介绍,最终是和Spring的多少个组成。

也盼望大家建议宝贵的提出。

JDBC

JDBC小程序

DBHelper(数据库连接类)

/**
  * @param连接数据库
  * */
public class DBHelper {
    //参数配置
//public static final String url = "jdbc:mysql://127.0.0.1/test";
public static final String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "8888";

public static Connection conn= null;

public DBHelper() {
    // TODO Auto-generated constructor stub
    try{
        Class.forName(name);            //加载数据库驱动
        conn = DriverManager.getConnection(url, user, password);    //通过驱动管理类获取数据库链接
    }catch(Exception e){
        e.printStackTrace();
    }
}

public static void Close(){
    try {
        conn.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}   
}

testJdbc(测试SQL查询)

public class testJdbc {

private static String sql = null;
private static DBHelper db = null;

public static PreparedStatement pst = null;
public static ResultSet ret = null;

public static void main(String[] args) {
    // TODO Auto-generated method stub
    db = new DBHelper();        //通过构造器连接到数据库
    System.out.println(db.conn);
    db.Close();
    /*
    //sql = "INSERT INTO `test`.`user` (`Username`, `Password`, `Age`, `Address`, `UserId`) VALUES"
    //      + " ('bb', '1234', '23', 'hubei', '4');";       //插入语句
    //sql = "UPDATE `test`.`user` SET `Username`='ouou' WHERE `UserId`='1';";   //更新语句
    sql = "DELETE * where `UserId` = '2'";                                  //删除语句  
    String sql1 = "select * from user";                                     //选择语句
    try {
        pst = db.conn.prepareStatement(sql);
        pst.execute();
        ret = pst.executeQuery(sql1);
        while(ret.next()){
            String name = ret.getString(1);
            String pass = ret.getString(2);
            String age = ret.getString(3);
            String addr = ret.getString(4);
            String id = ret.getString(5);
            System.out.println(id+" "+name+" "+pass+" "+age+" "+addr);
        }
    }catch(SQLException e){
        e.printStackTrace();
    }*/ 
  }
 }

标题计算

小结网上收集到东西和和气实在境遇的归结为以下几点:

  • 数据库频仍地连接开启和倒闭,造成财富的浪费。(使用数据库连接池进行管理)
  • SQL语句、preparedStatement设置参数硬编码在Java代码中,不便宜系统一保险险。(使用xml进行布局)
  • resultSet遍历结果集数据时,也设有硬编码。(将查询的结果集,自动映射成Java对象)

MyBatis

为什么选用MyBatis

  MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 
代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java的 
POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(选自官网)
  • 相当于说开发者只需求关爱SQL本人,而不必要开销精力去处理例如登记驱动、创制connection、创设statement、手动设置参数、结果集检索等jdbc的过程代码。MyBatis通过xml或表明的主意将要执行的各样statement(statement,preparedStatement、CallableStatement)配置起来,并通过Java对象和statement中的SQL举办映射生成最后实施的SQL语句,最终又mybatis框架执行SQL并将结果映射成Java对象并回到。

MyBatis是什么

MyBatis 本是apache的1个开源项目iBatis, 二〇〇八年那个项目由apache software
foundation 迁移到了google
code,并且改名为MyBatis,实质上Mybatis对ibatis举行局部更上一层楼。

MyBatis框架图

Paste_Image.png

MyBatis的运作流程

  • 在SQLMapConfig.xml(mybati的全局配置文件)中布局mybatis的周转条件等音信。并在其间加载mapper.xml(sql映射文件,配置了操作数据库的SQL语句)文件。
  • 通过mybatis环境等布署新闻构造SQLSessionFactory会话工厂。
  • 由会话工厂创建SQLSession来操作数据库。
  • mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有焦点执行器和缓存执行器四个落实。
  • Mapped
    Statement也是mybatis2个平底封装对象,包装了mybatis配置音信及SQL映射新闻等。mapper.xml文件中三个SQL对应一个Mapped
    Statement 对象,SQL的id正是Mapped Statement的id。
  • Mapped
    Statement对SQL执行输入参数进行定义,包含HashMap、基本项目、pojo,Executor通过Mapped
    Statement在实行SQL前将输入的Java对象映射至SQL中,输入参数映射正是jdbc编制程序中对preparedStatement设置参数。
  • Mapped
    Statement对SQL执行输出结果开始展览定义,包罗HashMap、基本类型、pojo,Executor通过Mapped
    Statement在执行SQL后将出口结果映射至Java对象中,输出结果映射进度相当于jdbc编程中结果的辨析处理进度。

MyBatis的利弊及Hibernate的简易相比较

Mybatis和hibernate的分化之处在于它不是2个通通的O奥德赛M框架,它须要开发者本身编辑SQL语句,可是mybatis能够通过xml或评释情势灵活配置要运维的SQL语句,并将Java对象和SQL语句映射生成最后实施的SQL,最终将SQL执行的结果再映射生成Java对象。
MyBatis相对于hibernate来说,学习窍门低,易于学习,灵活度也高,适合对关周全据模型供给不高的软件开发,以为其急需变化频仍。就是因为mybatis的冲天灵活,所以它不能形成数据库非亲非故性,要求贯彻支持多种数据库的软件则供给自定义多套SQL映射文件。
Hibernate对象/关系映射能力强,数据库无关性好,对于涉及模型要求高的软件(例如供给稳定的定制化软件)假如用hibernate开发能够节约成千上万代码,提升成效。然而Hibernate的学习窍门高,要领悟门槛更高,而且怎么设计O/凯雷德映射,在品质和指标模型之间怎么样权衡,以及哪些用好Hibernate必要具备很强的经历和力量才行。
为此如是说:没有最好的框架,唯有最符合的框架。

简单易行的CRUD入门程序

导入的包:

Paste_Image.png

项目工程协会:

Paste_Image.png

出口日志信息配置(log4j.properties):
# Global logging configuration
log4j.rootLogger = DEBUG,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] – %m%n
全局配置文件(SqlMapConfig.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载属性文件 -->
<properties resource="db.properties">
</properties>
<!-- 和spring整合后 environments配置将废除  -->
<environments default="development">
    <environment id="development">
    <!-- 使用jdbc事务管理 -->
        <transactionManager type="JDBC" />
    <!-- 数据库连接池-->
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </dataSource>
    </environment>
</environments>
<!-- 加载映射文件 -->

<mappers>
    <mapper resource = "sqlmap/User.xml"/>
</mappers>

</configuration>

数据库配置文件(db.properties)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=8888

User po类:

package com.howie.po;

import java.io.Serializable;
import java.util.Date;

/**
 * @param User po类
 */
public class User implements Serializable {

private int id;
private String username;// 用户名
private String sex;//性别
private Date birthday;// 生日
private String address;// 地址

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 getSex() {
    return sex;
}
public void setSex(String sex) {
    this.sex = sex;
}
public Date getBirthday() {
    return birthday;
}
public void setBirthday(Date birthday) {
    this.birthday = birthday;
}
public String getAddress() {
    return address;
}
public void setAddress(String address) {
    this.address = address;
}
}

照耀文件user.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 对SQL进行分类话管理,理解SQL隔离
注意:是用mapper代理方法开发,namespace有特殊重要的作用
 -->
<mapper namespace = "test">

<!-- 在映射文件中配置很多SQL语句 -->

<!-- 查找 -->
<select id = "findUserById" parameterType="int" resultType="com.howie.po.User">
    SELECT * FROM test.user where id = #{value}
</select>

<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.howie.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
    select LAST_INSERT_ID() 
</selectKey>
  insert into user(username,birthday,sex,address) 
  values(#{username},#{birthday},#{sex},#{address})
</insert>

<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="int">
    delete from user where id=#{id}
</delete>

<!-- 更新用户 -->
<update id="updateUser" parameterType="com.howie.po.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
    where id=#{id}
</update>

</mapper>

测试文件MybatisTest类
(防止麻烦,测试3个搜寻语句,读者感兴趣的能够自动完成其余成效)

package com.howie.test;

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;

import com.howie.po.User;

public class MybatisTest {

public static void findUserByIdTest() throws IOException{
    //配置文件
    String resource = "SqlMapConfig.xml";

    InputStream inputStream = Resources.getResourceAsStream(resource);
    //创建回话工厂
    SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(inputStream);
    //通过工厂得到SQLSession
    SqlSession ss = sf.openSession();
    //通过SQLSession操作数据库
    //第一个参数:映射文件中statement的id,等于=namespace+statement的id
    //第二个参数:制定和映射文件中所匹配的parameterType得参数
    //ss.selectOne结果是与映射文件中所匹配的resultType类型的对象
    User user = ss.selectOne("test.findUserById", 1);
    System.out.println(user);
    System.out.print(user.getAddress()+" "+user.getId()+" "+user.getUsername()+
            " "+user.getSex());
    System.out.println();
    //释放资源
    ss.close();
}


  public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        findUserByIdTest();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

未完待续…….

网站地图xml地图