Mybatis 功能
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
操作:EntityDao接口中的方法定义参数和返回值。具体操作数据的SQL通过映射的.xml,由Mybatis执行,xml一个sql语句/节点就会对应生成一个Mappedstatement
对象。
Dao接口的工作原理是JDK动态代理,即生成一个实现该接口的代理对象,当该方法被执行时,拦截器进行拦截,转而执行代理对象中的Invoke方法,即Mappedstatement
sql语句。
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>

单独执行1,2都会报如下错误,跟踪源码发现代理的找到的代理方法参数是一致的(参数数量对应),猜测应该是MappedStatement
生成的时候出了问题。除此之外, 使用`@Param(“”)`会把参数再拷贝一遍。
所以我觉得应该是不支持重载的
获取参数时 #{}和${}的区别
如果使用#{},是预编译的sql可以防止SQL注入攻击
如果使用${},是直接把参数值拿来进行拼接,这样会有SQL注入的危险
发表评论