MyBatis简介
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索 等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
搭建Mybatis环境的步骤
-
添加jar包
-
创建数据库,创建数据表。
要熟练掌握最基本的Sql语句。 -
创建Mybatis的全局配置文件(xxx.xml)
因为该文件是整个项目共享的,所以将他存放在类路径下面。
注意:1.不是只有src是类路径,对于一个普通文件夹,通过右键–>use a source folder,也可以成为类路径文件夹,同样会存放在项目的bin目录下。
2 .就全局配置文件的名称也是自定义的,这没有什么限制,只要能保证在加载该文件的时候名称一致就可以了。 -
定义实体类
对应数据表,用来接收从数据表中映射出的数据。
数据表字段名可以不和JavaBean属性对应,因为两个不同的领域,命名规范也不尽相同。
解决办法: -
修改sql语句,给数据表的字段名取别名,使与JavaBean属性一一对应。
-
< resultMap > 之后会详解,这是Mybatis提供的解决字段名和属性不相同的方法
-
标签
< setting name="mapUnderscoreToCamelCase" value="true" />
开启驼峰命名,不过这种方法只适用于有下划线_ 的情况下转驼峰,到时候随机应变就可以了。 -
编写Mapper.xml配置文件
这里实现java代码和sql语句的解耦。用于编写和存放sql语句。至于该文件的位置多数人都建议将他置于对应的JavaBean的同级目录下,我个人喜欢将所有的xml文件都放在conf的构件路径下,完全可以通过文件名辨别对应, -
将自定义Mapper.xml注册到全局的xxx.xml文件中
告诉Mybatis sql语句的存放位置。 -
测试运行
1.Junit测试:简单,高效,具有针对性。摒弃之前的main方法作为入口的测试,那样会生成大量的类,给项目做了没有意义的放大,逻辑也会变得混乱。
2.将公共的步骤抽象成一个(静态)方法。包括加载全局配置文件、获取sqlSessionFactory对象、获取sqlSession对象…根据实际情况和需要进行不同粒度大小的封装。
Mapper.xml文件的编写(非接口编程)
<mapper namespace="com.rjxy.mybatis.dao.EmployeeMapper">
<select id="getEmployeeById"
parameterType="int"
resultType="com.rjxy.mybatis.bean.Employee">
select * from table_employee where id = #{id}
</select>
</mapper>
-
namespace:命名空间 可以随便命名,但为了后期的维护,一般用JavaBean的全类名+Mapper文件名 的默认规范。
-
id: sql语句的唯一标识,要做到顾名知义。
-
parameterType:传入参数的数据类型,该属性可有可无。
-
resultType: 返回值类型,实现数据表到JavaBean的映射。
值为JavaBean的全类名,这里如果觉得全类名看起来很长,可以为类或包取别 名达到视觉效果。不太建议大家用别名,如果用全类名,我们可以通过Ctrl
+鼠标左键,完成到对应JavaBean的跳转,也可以作为校验是否对应正确的一种方式,而别名不可以。 -
Sql语句:唯一不同的就是占位符. #{id}就相当于 JDBC 中preparedstatement的?占位符,同样有防止sql注入漏洞的作用。(自行了解一下${id}和#{id}的区别)
Mybatis.xml全局配置文件
所有的配置信息全部写在< configuration >根标签下。
连接数据库:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
连接数据库优化:
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456
<properties resource="dbconfig.properties"></properties> <!--xml标记一般都是双标记-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
注册Mapper.xml
<mappers>
<mapper resource="EmployeeMapper.xml" /> <!--resource为xml的全路径-->
</mappers>
测试
用SqlSession对象提供的方法来操作sql语句
Employee employee = openSession.selectOne("com.rjxy.mybatis.dao.EmployeeMapper.selectEmp", 1);
selectOne(namespace+selectId,占位符);
int result= sqlSession.delete("com.rjxy.mybatis.dao.EmployeeMapperAnnotation.deleteEmployeeById",2);
delete(namespace+deleteId,占位符);
CRUD都一样,以此类推。
但是,问题来了!!
这样写未必也太麻烦了,每次都得namespace+id一个一个去找,于是有新的解决办法了----- MyBatis接口式编程。