Mybatis开发dao的方法

作者: 小小蒜头 | 来源:发表于2017-11-24 11:35 被阅读40次

    SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管SqlSessionFactoryBuilder
    在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

    SqlSessionFactory:通过SqlSessionFactory创建SqlSession,使用单例模式管理SqlSessionFactory(工厂一旦创建,使用一个实例)。将来Mybatisspring整合后,使用单例模式管理SqlSessionFactory

    SqlSession:SqlSession是一个面向用户(程序员)的接口。
    SqlSession中提供了很多操作数据库的方法:如selectOne(返回单个对象)、selectList(返回单个或多个对象);SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性;SqlSession最佳应用场合在方法体内,定义成局部变量使用。

    原始dao开发方法(程序员需要写dao接口和dao实现类)。

    1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

    2、调用sqlsession方法时将statement的id硬编码了。

    3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

    mapper代理方法(程序员只需要mapper接口(相当 于dao接口))

    1. 在mapper.xml中namespace等于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">
    <!-- namespace命名空间,作用就是对sql进行分类化管理
    注意:使用mapper代理方法开发,namespace有特殊重要作用,等于mapper接口地址
    -->
    <mapper namespace="com.eurasia.mapper.UserMapper">
        <!--在映射文件中配置很多sql语句-->
        <!--需求:通过id查询用户表的记录-->
        <!--通过select执行数据库查询
        id:标识映射文件中的sql,将sql语句封装到mappedstatement,
        所以将id称为statement的id
        #{}表示一个占位符,parameterType指定输入参数的类型
        #{id}:其中id表示接收输入的参数,名称叫id,如果输入参数是简单类型,#{}中参数名可以任意
        resultType:指定sql输出结果所映射的java对象类型
        -->
    
        <select id="findUserById" parameterType="int" resultType="com.eurasia.pojo.User">
            SELECT * FROM USER WHERE id = #{id};
        </select>
    
        <!--根据名称模糊查询用户信息,可能返回多条
        resultType指定单条记录映射的java对象类型
        '${}':表示拼接sql串,将接收到的参数内容不加任何修饰拼接在sql中
        使用${}易引起sql注入
        -->
        <select id="findUserByName" parameterType="java.lang.String" resultType="com.eurasia.pojo.User">
            SELECT * FROM USER WHERE username LIKE '%${value}%';
        </select>
    
        <!--添加用户
        parameterType:指定输入参数类型时pojo
        #{}中指定pojo的属性名,接收到pojo对象的属性值,Mybatis通过ognl获取对象的属性值
        -->
        <insert id="insertUser" parameterType="com.eurasia.pojo.User">
            /*
            *将插入数据的主键返回到User对象中
            *SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键值
            *keyProperty:将查询到的主键值设置到parameterType指定对象的那个属性
            *order: SELECT LAST_INSERT_ID()执行顺序相当于insert语句来说,在insert后才能拿到主键值
            */
            <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
                SELECT LAST_INSERT_ID()
            </selectKey>
            INSERT INTO user(username,birthday,sex,address) VALUE(#{username},#{birthday},#{sex},#{address})
        </insert>
    
        <!--删除用户-->
        <delete id="deleteUser" parameterType="java.lang.Integer">
            DELETE FROM USER WHERE id=#{id};
        </delete>
    
        <!--更新用户-->
        <update id="updateUser" parameterType="com.eurasia.pojo.User">
            UPDATE USER SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
        </update>
    </mapper>
    

    2. UserMapper.java

    package com.eurasia.mapper;
    
    import com.eurasia.pojo.User;
    
    import java.util.List;
    
    /**
     * Created by yvettee on 2017/11/23.
     */
    //相当于UserDao
    public interface UserMapper {
    
        //根据id查询用户信息
        /* mapper.java接口中方法名和mapper.xml中statement的id一致
         * mapper.java接口中方法输入参数类型和mapper.xml中statement的parameterType一致
         * mapper.java接口中方法返回值类型和mapper.xml中statement的resultType一致
         * 只有遵循了这些规范,Mybatis才可以自动生成mapper接口实现类代理对象
         */
        public User findUserById(int id) throws Exception;
    
        //根据username查询用户信息
        public List<User> findUserByName(String name) throws Exception;
        //添加用户信息
        public void insertUser(User user) throws Exception;
    
        //删除用户信息
        public void deleteUser(int id) throws Exception;
    }
    

    3. 在SqlMapConfig.xml中加载mapper.xml

    SqlMapConfig.xml中添加红色区域代码

    4. 测试

    package com.eurasia.test;
    
    import com.eurasia.dao.UserDao;
    import com.eurasia.dao.impl.UserDaoImpl;
    import com.eurasia.mapper.UserMapper;
    import com.eurasia.pojo.User;
    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 org.junit.Before;
    import org.junit.Test;
    
    import java.io.InputStream;
    import java.util.List;
    
    /**
     * Created by yvettee on 2017/11/23.
     */
    public class UserMapperTest {
        private SqlSessionFactory sqlSessionFactory;
    
        @Before
        public void setUp() throws Exception {
            String resource = "SqlMapConfig.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
    
        @Test
        public void testFindUserById() throws Exception {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //创建UserMapper的对象,Mybatis自动生成mapper代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            //调用UserMapper的方法
            User user = userMapper.findUserById(38);
            sqlSession.close();
            System.out.println(user);
        }
    
        @Test
        public void testFindUserByName() throws Exception {
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //创建UserMapper的对象,Mybatis自动生成mapper代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
            //调用UserDao的方法
            List<User> list = userMapper.findUserByName("小明");
            sqlSession.close();
            System.out.println(list);
        }
    }
    

    User类和数据库文件在上篇文章中已给出。

    相关文章

      网友评论

        本文标题:Mybatis开发dao的方法

        本文链接:https://www.haomeiwen.com/subject/kwvxbxtx.html