深入浅出MyBatis(1)

前言:

什么是MyBatis?

MyBatis 是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

简单来说,MyBatis是一个实现了数据持久化的开源框架,支持三种语言的实现,Java,.NET以及Ruby。当然我们这里讲的是Java的使用,所以可以将MyBatis理解为一个JDBC的封装框架。

我们知道Java开发经常使用到的另外一个JDBC封装框架是Hibernate,

那么MyBatis和Hibernate之间有什么区别和共同点呢?

MyBatis和Hibernate都是ORM框架。———>(ORM(object relation mapping) 对象关系映射关系)。

MyBatis是”半自动化”的ORM实现,这里的”半自动化”,是相对Hibernate提供了全面的数据库封装机制的”全自动化”ORM实现而言,”全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。

而MyBatis的关注点,在于POJO与SQL之间的映射关系。

MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。 MyBatis可以使用简单的XML或注解用于配置和原始映射,通过接口将JavaBean映射成数据库中的记录。


MyBatis的优点:

  1. 与JDBC相比,减少了50%以上的代码量。

  2. MyBatis是最简单的持久化框架,小巧并且简单易学。

  3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

  4. 提供XML标签,支持编写动态SQL语句。

  5. 提供映射标签,支持对象与数据库的ORM字段关系映射。


MyBatis框架的缺点:

  1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。

  2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。


MyBatis框架适用场合:

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。


入门阶段一:以Maven为项目管理工具并创建项目,开发工具为IDEA。

  1. 搭建环境,pom.xml配置依赖jar包。
//mybatis依赖
    <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.4.5</version>
    </dependency>
//数据库依赖
    dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.25</version>
    </dependency>

2、新建数据表,当然如果数据库中有数据的话你可以直接数据库。这里我们就以新建数据表为例给大家演示。

create table t_user(
    id int primary key auto_increment,
    username varchar(11),
    password varchar(11),
    age int
)

3.创建对应的实体类User。

public class User{
    private int id;
    private String username;
    private String password;
    private int age;
    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;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

4.添加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>
    <!-- 配置MyBatis运行环境 -->
    <environments default="dev">
        <environment id="dev">
             <!-- 配置JDBC事务管理 -->
            <transactionManager type="JDBC">
            </transactionManager>
            <!-- POOLED配置JDBC数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="prod">
            <transactionManager type="JDBC">
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

MyBatis开发的两种方式:

一、使用原生接口

二、Mapper代理实现自定义接口

第一种使用原生接口

(1)创建Mapper文件UserMapper.xml。

namespace通常设置为文件所在包名+文件名,但不是一定要这样设置,可以自定义,出于代码规范一般设置为包名+文件名的形式。

parameterType为参数数据类型。

resultType为返回值数据类型

<?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.southwind.mapper.UserMapper"> 

    <select id="get" parameterType="int" resultType="com.southwind.entity.User">
        select * from user where id=#{id}
    </select>

</mapper>

2)在全局配置文件config.xml中注册UseMapper.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>
    <!-- 配置MyBatis运行环境 -->
    <environments default="dev">
        <environment id="dev">
             <!-- 配置JDBC事务管理 -->
            <transactionManager type="JDBC">
            </transactionManager>
            <!-- POOLED配置JDBC数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="prod">
            <transactionManager type="JDBC">
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!-- 注册UserMapper.xml -->
    <mappers>
        <mapper resource="com/southwind/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

(3)测试类调用原生接口执行SQL语句获取结果。

public class Test {
    public static void main(String[] args) {

        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //加载MyBatis配置文件
        InputStream is = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用MyBatis原生接口执行SQL
        //statement为UserMapper.xml的namespace值+"."+select标签的id值
        String statement = "com.southwind.mapper.UserMapper.get";
        User user = sqlSession.selectOne(statement , 1);
        System.out.println(user);
    }
}

第二种方式:自定义接口,

但是不需要实现该接口,通过Mapper代理来实现,具体的实现逻辑或者说要执行的SQL语句配置在Mapper.xml中。这里为了统一,我们换了一个名字UserDAO.xml,实际和UserMapper.xml没有区别。

(1)自定义接口

public interface UserDAO {

    /**
     * 新增用户
     * @param user
     * @return
     */
    public int addUser(User user);

    /**
     * 根据id删除用户
     * @param id
     * @return
     */
    public int deleteUser(int id);

    /**
     * 修改用户
     * @param user
     * @return
     */
    public int updateUser(User user);

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    public User selectUserById(int id);

}

2)创建UserDAO.xml,定义接口方法对应的SQL语句。

statement标签根据SQL执行的业务可选择insert,delete,update,select。

MyBatis会根据规则自动创建UserDAO接口实现类的代理对象。

规则如下:

1.UserDAO.xml 中 namespace 为接口的全类名。

2.UserDAO.xml 中 statement 的 id 为接口中对应的方法名。

3.UserDAO.xml 中 statement 的 parameterType 和接口中对应方法的参数类型一致。

4.UserDAO.xml 中 statement 的 resultType 和接口中对应方法的返回值类型一致。

<?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.southwind.dao.UserDAO"> 

    <insert id="addUser" parameterType="com.southwind.entity.User">
       insert into t_user (username,password,age) values (#{username},#{password},#{age})
    </insert>

    <delete id="deleteUser" parameterType="int">
       delete from t_user where id=#{id}  
    </delete> 

    <update id="updateUser" >
       update t_user set username=#{username},password=#{password},account=#{account} where id=#{id}
    </update>

    <select id="selectUserById" parameterType="int" resultType="com.southwind.entity.User">
       select * from t_user where id=#{id}
    </select>

</mapper>

(3)在config.xml中注册UserDAO.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>
    <!-- 配置MyBatis运行环境 -->
    <environments default="dev">
        <environment id="dev">
             <!-- 配置JDBC事务管理 -->
            <transactionManager type="JDBC">
            </transactionManager>
            <!-- POOLED配置JDBC数据源连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="prod">
            <transactionManager type="JDBC">
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/写自己的数据库名字"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!-- 注册UserDAO.xml -->
    <mappers>
        <mapper resource="com/southwind/mapper/UserDAO.xml"/>
    </mappers>
</configuration>

(4)测试。

public class Test {
    public static void main(String[] args) {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //加载MyBatis配置文件

        InputStream is = Test.class.getClassLoader().getResourceAsStream("config.xml");

        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);

        //获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取实现接口的代理对象
        UserDAO userDAO = sqlSession.getMapper(UserDAO.class);

        //新增用户
        User user = new User();
        user.setUsername("张三");
        user.setPassword("123");
        user.setAge(22);
        System.out.println(userDAO.addUser(user));
        sqlSession.commit();

        //删除用户
        System.out.println(userDAO.deleteUser(2));
        sqlSession.commit();

        //查询用户
        User user = userDAO.selectUserById(3);
        System.out.println(user);

        //修改用户
        User user = userDAO.selectUserById(3);
        user.setUsername("李四");
        System.out.println(userDAO.updateUser(user));
        sqlSession.commit();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41112517/article/details/81369976