目录
MyBatis
基本概念
-
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射;底层还是JDBC
-
实现:
-
在pom文件中引入mybatis依赖,mysql驱动;在build加入资源插件
-
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> <build> <!--资源插件,处理src/main/java目录的xml--> <resources> <resource> <directory>src/main/java</directory> <!--所在的目录--> <includes><!--包括properties和xml都会被扫描--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> <!--所在的目录--> <includes><!--包括properties和xml都会被扫描--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build>
-
创建配置xml:一个放在resource中定义创建连接实例的数据源对象和指定其他mapper文件位置;还可以设置日志功能
-
<?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><!--点击查看标签顺序,mybatis是由顺序的--> <!--设置外部文件--> <properties resource="jdbc.properties"/> <!--设置日志--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <!--别名两种方式--> <typeAliases> <!--自定义,优点: 自定义名字 缺点: 需要一个一个定义--> <typeAlias type="com.yang.bean.User" alias="user"/> <!--自定义别名,有点: 直接把一个包中的类都起别名,类名是别名不区分大小写; 缺点: 不能自定义名字,多个包有重复类名会报错--> <package name="com.yang.bean"/> </typeAliases> <!--配置插件--> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins> <!--default必须是某一个environment的id值表示mybatis默认连接数据库--> <environments default="development"> <!--表示一个数据库连接信息--> <environment id="development"> <!--事务管理器类型 type有两种 JDBC表示Connection对象,mybatis自己完成事务管理;MANAGE表示交给容器处理--> <transactionManager type="JDBC"/> <!--配置数据源 type有三种polled连接池技术;unpolled不使用连接池;JNDIJava的命名和目录服务(淘汰了)--> <dataSource type="POOLED"> <property name="driver" value="${prop.driverClassName}"/> <property name="url" value="${prop.url}"/> <property name="username" value="${prop.username}"/> <property name="password" value="${prop.password}"/> </dataSource> </environment> </environments> <!--指定其他mapper文件的位置--> <mappers> <!--<mapper resource="mapper/UserDao.xml"/> <mapper resource="mapper/AccountMapper.xml"/>--> <!--使用package时要保证dao和mapper在同一目录,可以在resources下面建一个一模一样的目录使用package--> <package name="com.yang.dao"/> </mappers> </configuration>
-
mapper文件:定义和dao接口在同一目录,一个表一个
-
执行语句
-
mybatis的核心类是SqlSessionFactory
-
使用SqlSession的方法执行语句
事务的提交
自动提交
-
在获取SQLSession时openSession(true);即可自动提价事务
手动提交
-
SQLSession对象默认是手动提交事务;即在执行完insert,update,delete后要commit
重要对象
-
Resource:读取配置文件的对象
-
SqlSessionFactoryBuild:负责创建SqlSessionFactory对象
-
SqlSessionFactory对象:重要对象
-
是重量级对象,加载时间长,创建时要消耗大量时间与资源,有一个即可
-
openSession是重要的方法,参数为TRUE表示自动提交事务,不填或FALSE为手动提交事务
-
-
sqlSession对象
-
通过SqlSessionFactory获得,本身是一个接口;DefaultSqlSession实现类
-
提供了大量的执行方法
-
是线程不安全的;所以要在方法内部创建执行和关闭
-
dao代理
-
mybatis创建Dao接口的实现类,完成sql语句的执行;mybatis会创建一个对象代替开发者的dao实现类;
-
使用代理的要求
-
mapper文件中的namespace必须是dao接口的全限定名称
-
mapper文件中的id必须是dao接口中的方法名称
-
-
实现方式:sqlSession对象的方法--->getMapper(dao.class);等同于dao = new daoImpl
参数
基本概念
-
通过Java程序把数据传入到mapper文件中的SQL语句,参数主要是指dao接口的形参
-
parameterType
-
表示参数类型,指定dao方法的形参数据类型,是给mybatis给SQL语句赋值时使用
-
可以使用类型的全限定名称也可以是别名
-
mybatis通过反射可以拿到参数类型,可以不写
-
简单类型参数
-
单个简单参数:Java基本类型和String都是简单类型;使用#{}获取
-
多个简单参数:要使用@Param参数在dao接口中命名形参
-
也可以按位置,在dao中的从左到右的位置,在mapper中使用#{arg0},#{arg1}....不推荐
-
还可以通过map传,在mapper中#{key}
-
-
使用Java对象:dao接口中的参数是一个对象即可,什么对象都行有属性有getset方法就行;在mapper文件中#{属性名},会通过{}中的属性名去找形参对象中的对应的get方法拿到值;也可以设置JavaType和jdbcType,mybatis会自动检测不用写
占位符#和$
$和#区别
-
占位符#的语法:#{字符}
-
mybatis处理时,会替换,会使用jdbc的PrepaerStatment对象来处理
-
执行SQL语句效率高;会进行预编译,能有效避免sql注入;常作为列的值使用;值和数据类型有关
-
-
${}的语法${字符}
-
会进行拼接,相当于string中的+;使用的是Statement对象执行语句
-
执行SQL语句效率低;存在sql注入风险;数据时原样使用不会区分数据类型;
-
${}常用作表面,列名来使用,在保证数据安全情况使用
-
封装返回结果
resultType
-
属性:在执行select时使用,表示结果类型,执行SQL后得到Java对象的类型,值有两种:Java类型的全限定名称,和别名
-
mybatis会调用该名称的无参构造器,创建对象,同名的列赋值给同名属性;如果dao返回值是list集合,mybatis会把对象放入list集合
-
自定义别名:在mybatis配置文件中添加typeAliases标签;但不推荐,最好还是写全限定名
-
返回类型也可以是个map,如果是map只能是一行记录否则报错;一般都是使用对象为返回值类型,接受时用对象或list集合;单个的话就用简单类型
resultMap
-
结果映射,自定义列名和Java对象属性的对应关系,常用于列名和属性名不同情况下
①先定义resultMap标签,指定列名与属性名对应关系
②在select标签中使用resultMap属性,指定第一步中第一的resultMap中的id值
③可以多次复用,灵活多变
比较
-
resultType和resultMap二选一;不能同时使用
-
当有列名与属性名不同问题时,resultType使用别名解决;resultMap使用标签解决;resultMap更加灵活一些
<?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.yang.dao.UserDao"><!--根标签,namespace必须有值不能为空;参与识别SQL语句;一般使用Dao的全类名-->
<!--可以写crud标签;id和dao的方法名保持一致;result返回类型;parameter请求类型
/*#{}占位符,可以随便写*/
-->
<select id="selectUserById" resultType="com.yang.bean.User" parameterType="int">
select * from User where id = #{idsss}
</select>
<select id="selectUserByIdOrName" resultType="com.yang.bean.User" >
select * from User where id = #{id} or username = #{username}
</select>
<!--查询返回是集合,返回类型仍然是泛型中的那个对象-->
<select id="selectUsers" resultType="com.yang.bean.User" >
select * from User
</select>
<insert id="insertUser" >
insert INTO user (username,password,email) VALUES(#{username},#{password},#{email})
</insert>
<!--使用resultMap返回值 id是别名; type是bean的全限定名称-->
<resultMap id="userVo" type="com.yang.bean.UserVo">
<!--主键要使用id标签 column是列名; property是属性名-->
<id column="id" property="idVO"/>
<!--非主键列使用result标签; 当Vo的属性名和列名相同时不需要指定-->
<result column="username" property="usernameVO"/>
<result column="password" property="passwordVO"/>
<result column="email" property="emailVO"/>
</resultMap>
<select id="selectUserVo" resultMap="userVo">
select * from User where id = #{id}
</select>
<!--模糊查询-->
<select id="selectUserLike" resultMap="userVo">
select * from User where username like #{username}
</select>
</mapper>
模糊查询
两种方式:
-
字符串中写好 "%张%";mapper文件where name like#{} ---->推荐,灵活
-
在mapper文件中写好 where name like "%"空格#{}空格"%";Java传入"张"
动态SQL
基本概念
-
同一个dao的方法,根据不同的条件可以表示不同的sql语句,主要是where部分有变化,使用mybatis提供的标签,实现sql的能力;多用于多条件的查询中
-
主要有if,where,foreach,sql代码片段;其中使用到><等符号时要使用实体符号,否则会报错
-
使用动态sql时,dao传入的参数是Java对象
动态sql-if
-
语法:在主sql后面添加if标签 当if标签中的test属性内容为真时会执行if标签中的sql代码段
-
一般配合where标签使用
动态sql-where
-
使用if标签时,任意引起语法错误,使用where标签解决if产生的语法错误
-
使用时where标签中一个或多个if标签;当有一个if标签判断条件为true,where标签会转为WHERE关键字附加到sql语句后,如果一个if都不为真,忽略where和里面的if
-
where标签会将紧跟这where的or或and去掉,以保证语法的正确性
动态sql-foreach
-
可以循环数组,list集合,一般用在in语句中;<foreach/>标签
-
遍历查询简单类型集合
-
collection 是类型list或者array; open和close是开始结束符号; separate是分隔符; item是值
-
在<foreach>标签中#{}来接受参数
-
-
遍历查询对象类型集合
-
在属性item中取到的是一个对象,所以在<foreach>标签中使用#{对象.属性}的形式获取参数
-
动态sql-代码片段
-
使用的是sql标签和include标签;sql标签中可以是表名,字段,where条件等;可以在其他地方复用
-
sql标签通过id属性定义唯一标识;在其他位置使用include标签引用某个代码片段
<?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.yang.dao.AccountDao">
<!--定义代码片段-->
<sql id="selectAccount">
select * from t_account
</sql>
<select id="selectIf" resultType="com.yang.bean.Account">
select * from t_account where 1=1
<if test="username != null and username != ''">
and username = #{username}
</if>
</select>
<select id="selectWhere" resultType="com.yang.bean.Account">
<include refid="selectAccount"/>
<where>
<if test="username != null and username != ''">
and username = #{username}
</if>
</where>
</select>
<select id="selectForEach" resultType="com.yang.bean.Account">
select * from t_account
<if test="list != null and list.size>0" >
where id in
<foreach collection="list" open="(" close=")" separator="," item="ids" >
#{ids}
</foreach>
</if>
</select>
<select id="selectForEach2" resultType="com.yang.bean.Account">
select * from t_account
<if test="list != null and list.size>0" >
where id in
<foreach collection="list" open="(" close=")" separator="," item="acc" >
#{acc.id}
</foreach>
</if>
</select>
</mapper>
MyBatis配置文件
基本概念
-
有两大类配置文件:1.mybatis主配置文件;2.mapper文件
-
mybatis主配置文件,配置全局设置,例如日志,数据源,其他mapper位置等
-
mapper文件:主要写sql语句;一张表一个mapper文件
-
主配置文件
-
主配置文件中的标签是由顺序的点击configuration查看顺序
-
properties:引用外部文件
-
setting:是mybatis的全局设置,影响整个mybatis的运行;一般使用默认值即可
-
typeAliases:别名的设置
-
environments:环境标签,可以配置多个environment
-
mappers:指定其他mapper文件;resource和package
-
package要求dao和mapper文件在同一目录;并且文件名要一致
-
注意在使用package时,当把mapper文件放在resources目录下面时,要注意创建包时的方式,可以copy两个文件的真实路径比对一下
-
扩展功能
-
PageHelper:用来简化分页查询的;会在sql后面加入分页语句
-
步骤:
-
加入maven依赖pagehelper
-
在mybatis配置文件加入插件<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
-
在select语句之前调用PageHelper.statPage(页码,每页显示数量)
-