使用 mybatis mapper 好处:

使用 mapper 接口的方式,不用写接口实现类,直接完成数据库操作,简单方便。使用 mapper 接口,采用的是面向接口编程的思想。

mybatis mapper 的应用举例

定义实体类:User.java

public class User {
    private int id;
    private String name;
    private int age;
}

定义 mapper 接口:UserMapper.java

public interface UserMapper {
    void add(User user);
    void del(int id);
    void update(User user);
    User getUser(int id);
}

mapper 接口定义有以下特点:

Mapper 接口方法名和 UserMapper.xml 中定义的每个 sql 的 id 同名。
Mapper 接口方法的输入参数类型和 UserMapper.xml 中定义的 sql 的parameterType 类型相同。
Mapper 接口的返回类型和 UserMapper.xml 中定义的 sql 的 resultType 类型相同

定义 sql 映射文件:userMappers.xml

需要注意的是:xml文件的namespace要写成mapper接口的路径,像下面:

<mapper namespace="cn.mybatis.mapper.UserMapper">

下面是完整的xml文件

<?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,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<mapper namespace="cn.mybatis.mapper.UserMapper">
    
    <!-- 添加数据 -->
    <insert id="add" parameterType="cn.mybatis.beans.User">
        insert into t_user(name,age) value(#{name},#{age})
    </insert>
    
    <!-- 删除数据 -->
    <delete id="del" parameterType="int">
        delete from t_user where id = #{id}
    </delete>
    
    <!-- 修改数据 -->
    <update id="update" parameterType="cn.mybatis.beans.User">
        update t_user set name=#{name},age=#{age} where id=#{id}
    </update>
    
    <!--根据id查询得到一个user对象-->
    <select id="getUser" parameterType="int" resultType="cn.mybatis.beans.User">
        select * from t_user where id=#{id}
    </select>
    
</mapper>

定义mybatis的配置文件:conf.xml

这里需要配置两个东西

  • 配置JDBC的连接
  • 配置mapper.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
        <!-- 注册userMapper.xml文件      -->
    <mappers>
        <mapper resource="cn/mybatis/mapping/userMappers.xml"/>
    </mappers>
</configuration>

工具类:SqlSessionUtil.java

主要目的是要拿到sqlSession,因为之后每次操作数据库都需要写一遍,所以进行一次封装。

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;

public class SqlSessionUtil {

    public static SqlSession getSqlSession() throws Exception{
        String resource = "config.xml";
         //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = Resources.getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //创建能执行映射文件中sql的sqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        return sqlSession;
    }
}

测试类:MyTest.java

这是测试类,通过上面的工具类sqlSession,最关键的是下面这句

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

MyBatis通过动态代理的方式实现mapper接口,然后执行接口中定义好的方法就可以了。

注意:不要忘了sqlSession.commit()和sqlSession.close().否则在执行过程中虽然不会报错,但是数据库中是不会有变化的.

下面的例子只执行了添加的功能:

import org.apache.ibatis.session.SqlSession;
import cn.mybatis.beans.User;
import cn.mybatis.mapper.UserMapper;
import cn.mybatis.util.SqlSessionUtil;

public class MyTest {
    public static void main(String[] args) throws Exception {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        userMapper.add(user);
        sqlSession.commit();
        sqlSession.close();
    }
}

标签: none

添加新评论