什么是Mybatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码
为什么要使用Mybatis
>1.在JDBC中sql语句在编码中属于硬编码,如果对sql语句进行修改,将要进行重新编译
>2.JDBC中存在大量的重复的代码,使用框架可以避免这一现象
使用方法
1.添加依赖:
在pom中加入mybatis的依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
2.在项目 resource目录下编写mybatis全局配置文件
<?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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<!-- 可以配置多个environment -->
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/userdb" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
3.编写Mapper映射文件(以User类为例)
<?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="test">
<select id="findUserById" parameterType="int" resultType="org.csmf.mybatis.entity.User">
select * from t_user where id = #{id}
</select>
</mapper>
4.在将Mapper加入到全局配置文件中
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
5.在方法中使用
先通过SqlsessionFactoryBuilder创建SqlsessionFactory工厂类,再通过SqlsessionFactory的OpenSqlsession方法得到Sqlsession对象,最后通过Sqlsession的方法实现Mapper中配置的sql语句
InputStream inputStream = null;
try {
//0.加载Mybatis的主配置文件
// Resources.getResourceAsStream()获取classpath下面的资源
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
//1.通过Mybatis的主配置文件得到SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.通过SqlSessionFactory得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.通过SqlSession操作数据库
//selectOne():
//第一个参数是Statement的Id也就是sql映射文件中的select,insert,,标签的Id
//第二个参数是输入参数
User user = sqlSession.selectOne("findUserById",2);
细节(重点)
1.在Mapper映射文件中#{}和${}的区别
#{}相当于JDBC中的?占位,可以将参数与sql语句区分开,可以防止sql注入,安全性高
${}相当于JDBC中的字符串拼接,有sql注入的风险,主要应用于在变量的值为关键字的一部分时
2.selectOne和selectList的区别
selectOne的底层是selectList只是在查询出来的结果出做了是否list长度为1的判断,当结果超过1时会抛出TooManyResultsException的异常,而selectList的结果不做要求