初学者学习笔记,主要在于复习和熟练相关代码的应用,亦是增加思考。
注:主要来源于自学网视频的学习笔记
一、MyBatis入门
1.1、相关概念(理解)
1.1.1、MyBatis:是一款一流的支持自定义的SQL,存储过程和高级映射的持久化框架。能够使用简单的xml格式或者注解进行配置,能够映射基本数据元素、Map接口和POJOs(普通java对象)到数据库中的记录。
1.1.2、框架:实际上框架是一个编码的半成品,它自动的塔建好了我们要进行操作的大部分设置。对于用户来讲,只是去填充必要的设置或者编码。
1.1.3、持久化:实现内存中的对象和数据库表中的记录的相互转化。框架和持久化相结合构成了持久化框架。
之前的JDBC操作数据库的步骤是这样的:加载驱动----->创建连接----->创建执行语句----->执行SQL语句---->处理结果----->关闭连接
使用框架,就可以省了许多代码
1.1.4、Mybatis执行过程示意图如下:
1.2、MyBatis核心配置文件(手写)
(1)文件常用命名方式:SqlMapConfig.xml或Mybatis-config.xml
(2)以实现对User的CRUD以及分页查询,配置文件SqlMapConfig.xml或Mybatis-config.xml包括了哪些基础内容呢?
<?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>
<!--读取数据库的属性配置文件,如果不在同一文件夹下,需要加上“目录文件名/”-->
<properties resource="db.properties"></properties>
<!--配置别名-->
<typeAliases>
<!--配单个类的别名-->
<!--<typeAlias type="com.study.entity.User" alias="user"></typeAlias>-->
<!--配整个包的别名,包中所有类的首字母自动变成小写,就是对应的类别名-->
<package name="com.study.entity"></package>
</typeAliases>
<!--模式配置有三种:开发模式(development_model)、测试模式(test_model)、线上模式(online_model)-->
<environments default="development">
<environment id="development">
<!--设置事务模式,这个可以用别的替代-->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</dataSource>
</environment>
</environments>
<!--配置xml映射文件,这里是其位置-->
<mappers>
<mapper resource="com/study/mapper/UserMapper.xml"></mapper>
</mappers>
<!--<plugins>-->
<!--<!– 配置分页插件,需要在pom文件中引入依赖 –>-->
<!--<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>-->
<!--</plugins>-->
</configuration>
1.3、MyBatis映射配置(手写)
(1)文件常用命名方式:xxxMapper.xml或xxxDao.xml
(2)以UserMapper.xml为例,手写其增删改查以及分页查询的简单配置(不带条件查询)。具体的步骤如下:
1)在java.com.study.entity下创建User实体类;
a.定义三个私有属性:Long stu_ID, String stu_name, String stu_password
b.创建一个空构造器和一个带所有属性的构造器,同时实现所有属性的get和set方法,对外提供访问
c.为了方便测试输出,重写其toString()方法
2)在java.com.study.mapper下创建UserMapper接口,创建以下几个方法:
3)在resources下创建配置文件(即1.2的内容);
4)在java.com.study.mapper下创建UserMapper.xml映射配置文件;
<?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" >
<!--传统方式配置
namespace="不包含拓展名的mapper文件所在路径"
-->
<mapper namespace="com.study.mapper.UserMapper">
<!--id的名字必须与mapper.java接口中的一样-->
<select id="getUserList" resultType="com.study.entity.User">
select
stu_ID,
stu_name,
stu_password
from user
</select>
<select id="getUser" parameterType="java.lang.Long" resultType="com.study.entity.User">
select
stu_ID,
stu_name,
stu_password
from user where stu_ID=#{stu_ID}
</select>
<!--
如果需要返回插入记录的主键值,配置如下:
(前提:主键必须是自增长的):useGeneratedKeys="true" keyProperty="主键名"
-->
<insert id="addUser" parameterType="com.study.entity.User" useGeneratedKeys="true" keyProperty="stu_ID">
insert into user values (null,#{stu_name},#{stu_password})
</insert>
<update id="updateUser" parameterType="com.study.entity.User">
update user set stu_name=#{stu_name},stu_password=#{stu_password} where stu_ID=#{stu_ID}
</update>
<delete id="deleteUser" parameterType="java.lang.Long">
delete from user where stu_ID=#{stu_ID}
</delete>
<select id="getUserPage" parameterType="java.util.Map" resultType="com.study.entity.User">
select
stu_ID,
stu_name,
stu_password
from user limit #{pageNum},#{pageSize}
</select>
</mapper>
5)在java.com.study.test下创建UserTest测试类(可以把pom.xml文件中的测试依赖的<scope>test</scope>暂时注释掉);
a.对应的创建不具有返回值不带任何参数的测试方法
b.构造一个工具类MybatisUtil.java,主要是构造SqlSession对象使用。即1.3的内容)
c.编写测试方法的内容,实现测试(一下图片整理了测试内容和结果)
1.3、MyBatis的核心API(理解)
(1)传统方式是使用时在创建,但是存在不少的问题,如下:
a.多次重复创建SqlSessionFactoryBuilder对象和SqlSessionFactoryBuilder对象,内存压力增大
b.代码繁多
(2)我们可以通过整理创建工具类可以更加优化管理和使用,当然学习了spring框架之后又可以省略了,只需配置就行:
package com.study.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class MybatisUtil {
//使用静态代码块实现了只创建一次factory,省了内存
private static SqlSessionFactory factory;
static {
try {
//1、创建SqlSessionFactoryBuilder对象,该对象的特点是用后即销毁
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//2、创建SqlSessionFactory对象
String configFile = "Mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(configFile);
factory = builder.build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
//3、创建SqlSession对象
public static SqlSession createSqlSession() {
//true是默认提交事务,false是手动提交
//添加、修改、删除必须提交事务,查询可以选择提交或者不提交
return factory.openSession(false);
}
//4.关闭SqlSession对象
public static void closeSqlSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
}
1.4、接口映射方式CRUD(熟练掌握)
二、MyBatis的入参和关联映射
2.1、MyBatis的入参
2.1.1、在MyBatis框架中,所有的参数都是自动由框架填充到Map<String, Object>中。简要说明框架内置对象Map结构的执行过程。
(1)基本类型
(2)实体类型
(3)map类型
2.1.2、在MyBatis框架中,参数的入参可以分为三类:基本类型入参,实体类入参、map类型入参。其中基本类型入参还可以分为单参数入参和多参数入参。如下表:
2.2、关联映射:包括一对一、一对多、多对一(以部门表和员工表为例)
2.2.1、一对多:如一个部门对应多名员工。例:查询某个部门的所有员工
1)创建DepartVo类,属性除了depart原有的,加上一个员工信息类属性:List<Employee> employees;实现其get和set方法
2)DepartMapper.xml映射配置文件的书写,重点在于学习collection节点
<?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="com.study.mapper.DepartMapper">
<resultMap id="departResultMap" type="com.study.vo.DepartVo">
<id column="did" property="depid" />
<result column="depname" property="depname" />
<!--
collection :处理一对多关联关键节点
property:对应实体类中属性的名称(就是添加的List<Employee> employees属性名)
ofType:描述该集合中每个元素的类型
-->
<collection property="employees" ofType="com.study.model.Employee">
<id column="empid" property="empid" />
<result column="empname" property="empname" />
<result column="bsaralry" property="bsaralry" />
<result column="hiredate" property="hiredate" />
<result column="address" property="address" />
<result column="depid" property="depid" />
</collection>
</resultMap>
<select id="getDepartDepname" parameterType="String" resultMap="departResultMap">
select d.depid as did,d.depname,e.* from employee e,depart d where d.depid=e.depid and d.depname=#{depname}
</select>
</mapper>
2.2.2、多对一:如多名员工对应一个部门。例:查询所有员工的部门信息
1)创建EmployeeVo类,属性除了employee原有的,加上一个部门信息类属性:Depart depart;实现其get和set方法
2)DepartMapper.xml映射配置文件的书写,重点在于association节点
<?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="com.study.mapper.EmployeeMapper">
<resultMap id="BaseResultMap" type="com.study.vo.EmployeeVo">
<!--
id节点:
property:实体类中的oid(就是能够唯一识别一个对象的属性,一般是主键)
column:结果集中的主键字段
result节点:
property:实体类中的属性名
column:结果集中的字段名
-->
<id column="empid" property="empid" />
<result column="empname" property="empname" />
<result column="bsaralry" property="bsaralry" />
<result column="hiredate" property="hiredate" />
<result column="address" property="address" />
<result column="depid" property="depid" />
<!--
association节点:专门处理多对一和一对一关系的节点
property:创建的属性名(即 Depart depart属性名)
javaType:实体类名
-->
<association property="depart" javaType="com.study.model.Depart">
<id property="depid" column="did"></id>
<result property="depname" column="depname"></result>
</association>
</resultMap>
<select id="getEmployeeList" resultMap="BaseResultMap">
select e.*,d.depid as did,depname from employee e inner join depart d on e.depid=d.depid
</select>
</mapper>
2.2.3、一对一:如一个员工对应一个员工档案。基础应用,和上一章举例基本类似
2.3、动态SQL
2.4、通用mapper的用法
2.4.1、在idea里创建mapper通用配置文件(Mybatis-config.xml):settings--->editor---->code style---->file and templates--->根据需要设置各种模板
2.4.2、在idea里创建mapper通用映射配置文件(Mapper.xml);
2.4.3、Mybatis与spring结合练习反向工程生成,并练习多条件分页查询。
(1)练习示意图:
(2)练习完成后的源码(里面有详细说明):
1)创建maven的普通java工程
2)修改配置文件:
aa.把素材的pom.xml自properties内容及其之后复制过去到项目替换对应部分内容
bb.创建main文件下与java同级resources文件;结构如下图
cc.修改配置文件generatorConfig.xml;如下图
dd.修改db.properties文件;如下图
3)其它配置文件及部分修改:
4)测试过程(简化表形式):
综合实例练习源码:https://download.csdn.net/download/preston555/13637472