mybatis
mybatis 介绍
是开源的持久型框架,
jdbc 的问题
1> 数据库连接频繁的被创建,释放, 浪费系统资源。 如果使用数据库连接池就会解决这个问题,
2> SQL 语句写在Java 代码中,存在硬编码问题
3> 使用preparedStatement 向占位符传参数存在硬编码。
4> 对结果解析存在硬编码
mybatis 架构
1> mysql 配置文件 (SqlMapConfig.xml+ 若干个和实体类(表)对应的mapper.xml)
2> SqlSessionFactory (工厂中的原材料就是1 提供的)
3> 工厂会产生一个SqlSession,其实SqlSession 就已经可以操作数据库了
4> Executor 当Sqlsession 调用对数据库的增删改查时,实际上是通过Executor 来执行的. Executor 在Sqlsession 里面
5> MappedStatement
sql 语句被存放在一个pojo 对象里,这里MapperStatement 对象就是作为存放 sql 的pojo 来存在的。 MappedStatement 在Executor里面6> 在MappedStatement 这个环节,有输入和输出
输入: Map 类型 ,String Integer 等基础数据类型,pojo
输出: Map 类型 ,String Integer 等基础数据类型,pojo, List
在MappedStatement向数据库发送请求后,会将查询结果自动映射成输出支持的类型。
mybatis 实战初级版
主配置文件 SqlMapConfig.xml (主要用于配置别名和mapper文件信息)
1> 在configuration标签下使用typeAliases 变迁可以配置别名或者指定包路径
<!-- 别名 包以其子包下所有类 头字母大小都行--> <typeAliases> <!-- <typeAlias type="cn.xiechengxu.pojo.User" alias="User"/> --> <package name="cn.xiechengxu.pojo"/> </typeAliases>
2> 在configuration标签下使用environments 配置数据库连接相关的信息。这个和spring整合后就可以废弃掉
3> 在configuration标签下使用 mappers 配置和实体类(数据表)对应的mapper.xml 文件
“`java
“`
在mapper.xml 文件中写sql语句
<mapper namespace="test"> <select id="findUserById" parameterType="Integer" resultType="cn.xiechengxu.pojo.User"> select * from user where id = #{v} </select> </mapper>
在测试类中 构建 SqlSession 来执行sql 语句
String resource="SqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql User user=sqlSession.selectOne("test.findUserById",10); System.out.println(user);
mapper 文件中在写sql时,#{v} 和${value}的区别
前者可以防止sql注入,后者不行
前者是占位符,select * from user where id=? 占位符 ? == ‘五’
{} 表示字符串拼接 select * from user where username like ‘%五%
和占位符相比,少了单引号
应为不能防止sql 注入,所有可以将其改写为#{} 这个占位符的形式
select * from user where username like "%"#{value}"%"
${} 这种写法,sql注入,可以通过传入 参数 “五%’ or ‘1%’ =’1” 这样会生成这样的sql
select * from user where username like ‘%五%’ or ‘1%’ =’1%’