前言
第一步:准备工作
1.下载并添加MyBatis依赖
mybatis-3.5.10.jar是MyBatis的核心包,mybatis-3.5.10.pdf 是Mybatis官方使用手册,lib文件夹的jar文件shiMybatis的依赖包.
最重要不要忘记加mysql-connector-java-8.0.21.jar包
没有加会出现以下异常
2.创建数据库表结构
3.创建实体类
4.SQL映射文件
在src目录下创建xx.mapper包。映射文件为xx.xml;
5.核心配置文件
在src目录下创建Mybatis的核心配置文件mybatis-config.xm;在该文件中来配置数据库环境和映射文件的位置。
遇到问题:数据库密码账号或数据库名字写错
将mapper文件加入到配置文件中
如果接口名和mapper里的名字不一样,会出现以下异常
而且要注意的一点是一但在mapper里加载了该接口,映射文件里必须有mapper
如果没有写,会发生如下异常
6:日志文件
Mybatis默认使用 log4j输出日志文件,如果开发着需要查看控制台输出的sql语句,需在classpath路径下配置其日志文件.
7.测试类
首先使用输入流读取配置文件,然后根据配置信息构建SqlSessionFactory对象,接下来通过SqlSessionFactory对象创建SqlSessionFactory对象创建SqlSession对象,并使用SqlSession对象的方法执行数据库操作
在传递多个参数时遇到的问题:
接口
mapper.xml
不能和参数匹配
解决方案:
使用注解通过@Param提供的名称就会直到#{name}代表name参数.
insert标签
如果没有设置主键
注意最后要提交commit否则数据库里没有添加的数据
自定义主键
<insert id="insertNewWebsite"
parameterType="com.apesource.entity.Website">
<selectKey keyProperty="id" resultType="Integer" order="BEFORE">
select if(max(id) is null,1,max(id)+1) as newId from Website
</selectKey>
insert into website(id,name,url,age)values(#{id},#{name},#{url},#{age})
</insert>
resultMap元素
resultMap是MyBatis中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。
出现问题
把column和property写反了
一对一关联查询
<association property="studentCard" column="cardId"
javaType="com.apesource.entity.StudentCard"
select="com.apesource.mapper.StudentCardMapper.selectStuCardById" />
一对多
<collection property="orderList"
ofType="com.apesource.entity.Order" column="id"
select="com.apesource.mapper.OrderMapper.selectOrderById" />
如果把ofType和javaType弄混
动态SQL
${}一般用于在SQL中拼接数据库表名,视图或关键字,例如,动态使用order by进行排序时,就需要使用${}来拼接排序字段名称和排序规则。
使用#{}会产生一个?占位符,并使用PreparedStatement进行处理。而$则进行的是字符串的拼接。
使用#{}可以预防SQL注入,而${}无法防止SQL注入。
心得
通过Mybatis的学习,我感受到了Mybatis简单易懂,传统JDBC弊端太多,jdbc底层没有用连接池,操作数据库需要频繁的创建和关联连接,消耗资源。它封装JDBC,简化了加载驱动,创建连接,创建statement等过程。学习Mybatis和核心在于其映射关系的学习。学习过程中,我感受到SQL语句工作量较大,对我们的SQL语句的功底有一定要求。在今后的学习中,一定要多去运用到实际开发应用的过程中,这样才能更加熟悉。