浅笑博客
浅笑博客
Mybatis应用与学习
Mybatis应用与学习

Mybatis 功能

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

操作:EntityDao接口中的方法定义参数和返回值。具体操作数据的SQL通过映射的.xml,由Mybatis执行,xml一个sql语句/节点就会对应生成一个Mappedstatement对象。

Dao接口的工作原理是JDK动态代理,即生成一个实现该接口的代理对象,当该方法被执行时,拦截器进行拦截,转而执行代理对象中的Invoke方法,即Mappedstatementsql语句。

Dao中接口不可以重载方法,容易出bug!!!

测试:

/*UserDao.java*/
public interface UserDao {
    User findByCondition(@Param("id") Integer id);
    User findByCondition(@Param("id") Integer id, @Param("username") String username);
}
/*MyTest.java*/
public class MyTest {
    public static void main(String[] args) throws IOException {
        //定义mybatis配置文件的路径
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取Sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserDao实现类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user1 = userDao.findByCondition(2);
        System.out.println(user1);
        User user2 = userDao.findByCondition(1, "UZI");
        System.out.println(user2);
        //释放资源
        sqlSession.close();
    }
}
<!--UserDao.xml-->
<mapper>
<select id="findByCondition" resultType="org.example.pojo.User">
        select *
        from user
        <where>
            id = #{id}
            <if test="username != null">
                username = #{username}
            </if>
        </where>
    </select>
</mapper>
image

单独执行1,2都会报如下错误,跟踪源码发现代理的找到的代理方法参数是一致的(参数数量对应),猜测应该是MappedStatement生成的时候出了问题。除此之外, 使用`@Param(“”)`会把参数再拷贝一遍。
所以我觉得应该是不支持重载的

获取参数时 #{}和${}的区别

​ 如果使用#{},是预编译的sql可以防止SQL注入攻击
​ 如果使用${},是直接把参数值拿来进行拼接,这样会有SQL注入的危险

发表评论

textsms
account_circle
email

浅笑博客

Mybatis应用与学习
Mybatis 功能 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单…
扫描二维码继续阅读
2022-03-18