1. Mybatis简介
1.1. Mybatis是什么
Mybatis是一个java的持久层框架,保存到数据库
持久化:保存到本地文件
1.2. Mybatis的作用
操作数据库
1.3. 为什么要学习mybatis
1、jdbc
2、dbutils
3、mybatis
Mybatis的理念:使用10%代码去操作数据库
解决方案:零实现,就是使用接口来操作数据库,不使用实现类
Mybatis的定位:提高开发效率
1.4. Mybatis参考网址
英文参考手册:http://www.mybatis.org/mybatis-3/
中文参考手册:http://www.mybatis.org/mybatis-3/zh/logging.html
在线的api帮助文档:http://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1
1.5. 配置流程图
2. 入门案例
2.1. 准备条件
1.1.1. 数据库脚本
drop database if exists mybatis_clazz; create database mybatis_clazz; use mybatis_clazz; CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `password` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `tb_user` VALUES ('1', 'zhangsan', '123'); INSERT INTO `tb_user` VALUES ('2', 'lisi', '123456'); INSERT INTO `tb_user` VALUES ('3', '小明', '123456');
|
1.1.2. 相关jar包
1.1.3. Xml约束
dtd 约束xml的内容
Eclipse添加dtd约束文件
2.2. 示例代码
1.1.4. 引入jar包
1.1.5. 配置文件
创建mybatis-config.xml配置文件并引入dtd约束(复制如下代码)
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> |
配置文件内容
<?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> <environments default="development2"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3307/mybatis_clazz" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> </configuration> |
1.1.6. 调用核心api测试
publicstaticvoid main(String[] args) throws IOException { String resource = "mybatis-config.xml"; //1.读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //2.获取到SqlSessionFactoryBuilder SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.获取到SqlSessionFactory(工厂) SqlSessionFactory sqlSessionFactory = builder.build(inputStream); //4.SqlSession 操作数据库的类 SqlSession session = sqlSessionFactory.openSession(); //测试 Connection connection = session.getConnection(); System.out.println(connection); } |
1.1.7. 映射文件
创建映射文件并配置dtd约束
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
映射文件代码
<?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 namespace="mapper.UserMapper"> <!-- 查询所有用户的信息 id:与我们的接口的方法名一致 --> <select id="selectAll" resultType="entity.User"> select * from tb_user </select> </mapper> |
注意事项:
1.每一个映射文件需要配置namesapce属性,建立映射文件与接口关联关系
<mapper namespace="mapper.UserMapper"> |
2.每一个映射文件都需要在核心配置文件(mybatis-config.xml)配置
<!-- 配置映射文件 --> <mappers> <mapper resource="mapper/xml/UserMapper.xml"/> </mappers> |
1.1.8. 测试代码
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession; import org.junit.Test;
import entity.User; import mapper.UserMapper; import utils.MyBatisUtil;
public class UserMapperTest {
@Test public void testSelectAll(){ //获取到mybatis操作数据库的对象SqlSession SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> userList = userMapper.selectAll(); System.out.println(userList);
}
}
|
1.1.9. 增删查改代码
核心配置文件
<?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> <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:3307/mybatis_clazz" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 配置映射文件 --> <mappers> <mapper resource="mapper/xml/UserMapper.xml"/> </mappers> </configuration>
|
映射文件代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd"> <!-- namespace:用来配置映射文件与接口的关联 --> <mapper namespace="mapper.UserMapper"> <!-- 查询所有用户的信息 id:与我们的接口的方法名一致 --> <select id="selectAll" resultType="entity.User"> select * from tb_user </select>
<!-- 插入数据 parameterType:参数类型() --> <insert id="insertUser" parameterType="entity.User"> insert into tb_user(username,password) values (#{username},#{password}) </insert>
<!-- 删除数据 --> <delete id="deleteById"> delete from tb_user where id=#{id} </delete>
<!-- 修改用户数据--> <update id="updateUser" parameterType="entity.User"> update tb_user set username=#{username},password=#{password} where id=#{id} </update>
</mapper> |
接口代码
package mapper;
import java.util.List;
import entity.User;
public interface UserMapper { //查询所有 public List<User> selectAll();
//插入数据 public int insertUser(User user);
//修改数据 public int updateUser(User user);
//删除数据 public int deleteById(int id);
}
|
测试代码
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession; import org.junit.Test;
import entity.User; import mapper.UserMapper; import utils.MyBatisUtil;
public class UserMapperTest {
//测试查询所有用户 @Test public void testSelectAll(){ //获取到mybatis操作数据库的对象SqlSession SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> userList = userMapper.selectAll(); System.out.println(userList);
} //测试插入数据 @Test public void testInsertUser(){ SqlSession session = MyBatisUtil.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User("黄忠","ak47"); int row = userMapper.insertUser(user); //提交事务 session.commit(); System.out.println("影响行数为:"+row); }
//测试删除 @Test public void testDeleteById(){ SqlSession session = MyBatisUtil.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); int row = userMapper.deleteById(5); //提交事务 session.commit(); System.out.println("影响行数为:"+row); }
//测试修改 @Test public void testUpdateUser(){ SqlSession session = MyBatisUtil.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User("黄忠","加特林"); user.setId(6); int row = userMapper.updateUser(user); //提交事务 session.commit(); System.out.println("影响行数为:"+row); }
}
|
3. 三种操作方式(CRUD)
3.1. 使用dao的方式操作数据库(过去)
Xml代码
<mapper namespace="test"> <!-- 查询所有用户信息 --> <select id="findByAll" resultType="com.ys.entity.User"> select * from tb_user </select>
<!--通过id查询用户数据 --> <select id="findById" parameterType="java.lang.Integer" resultType="com.ys.entity.User"> select * from tb_user where id=#{id} </select> </mapper> |
测试代码
3.2. 使用xml和接口操作数据库(Mapper代理的方式)
3.3. 使用注解和接口操作数据库
接口代码
package com.ys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update;
import com.ys.entity.User;
public interface UserMapper {
//查询所有用户数据 @Select("select * from tb_user") public List<User> findByAll();
//通过id查询用户数据 @Select("select * from tb_user where id=#{id}") public User findById(int id);
//插入用户数据 @Insert("insert into tb_user(username,password) values (#{username},#{password})") public int insertUser(User user);
//更新用户数据 @Update("update tb_user set username=#{username},password=#{password} where id=#{id}") public int updateUser(User user);
//根据id删除用户数据 @Delete("delete from tb_user where id=#{id}") public int deleteById(int id);
}
|
测试代码
package com.ys.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession; import org.junit.Test;
import com.ys.entity.User; import com.ys.mapper.UserMapper; import com.ys.util.MybatisUtil;
public class UserMapperTest {
@Test public void testFindByAll(){ SqlSession session = MybatisUtil.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); List<User> userList = mapper.findByAll(); System.out.println(userList); }
//测试插入用户数据 @Test public void testInsertUser(){ User user = new User(123,"小欣欣","2345678"); SqlSession session = MybatisUtil.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); int row = mapper.insertUser(user); session.commit(); session.close(); System.out.println("影响行数为:"+row); } }
|
4. 核心API
4.1. Resources
读取核心配置文件
getResourceAsStream(“配置文件的路径”);
4.2. SqlSessionFactoryBuilder
用来构建SqlSessionFactory构建类
用完就扔
4.3. SqlSessionFactory
创建与数据库的会话的工厂,在一个应用程序中只有一个实例(单例模式)
4.4. SqlSession
数据库的一个会话,用来操作数据库
线程不安全的,在使用的时候,每一个方法对应一个会话(SqlSession)
5. Log4j 日志文件
5.1. 引入jar包
mybatis-3.3.0\lib\log4j-1.2.17.jar
5.2. 在classpath目录下新建log4j.properties文件
Log4j.properties的内容
log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%-4r%-5p[%t]%37c%3x-%m%n |
6. 核心配置文件的说明
核心配置文件指的就是mybatis-config.xml文件
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
就是用来映射java数据类型和数据库的字段类型
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
type : JDBC/MANAGED
dataSource(数据源)
指定数据源的类型
POOLED/UNPOOLED/JNDI
mappers(映射器)
mapper
Resource: xml映射文件
Class : 接口的全限定名
注意事项:
1. 接口与映射文件同名,放在同一个目录下
2. 注解开发mapper时使用
通过包扫描的方式:
<package name=”需要扫描的包”/>
注意事项:
1.接口与映射文件同名,放在同一个目录下
6.1. Properties属性配置文件
可以把一些通用的属性值配置在属性文件中,加载到mybatis运行环境内
database.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3307/mybatis_clazz jdbc.username=root jdbc.password=root |
引入
使用
<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> |
6.2. Settings配置全局参数
mybatis运行时可以调整一些全局参数
Mybatis启动可以配置的设置
设置参数 | 描述 | 有效值 | 默认值 |
cacheEnabled | 该配置影响的所有映射器中配置的缓存的全局开关。 | true | false | TRUE |
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true | false | FALSE |
aggressiveLazyLoading | 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). | true | false | false (true in ≤3.4.1) |
multipleResultSetsEnabled | 是否允许单一语句返回多结果集(需要兼容驱动)。 | true | false | TRUE |
useColumnLabel | 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。 | true | false | TRUE |
useGeneratedKeys | 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 | true | false | FALSE |
autoMappingBehavior | 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定发现自动映射目标未知列(或者未知属性类型)的行为。 | NONE, WARNING, FAILING | NONE |
NONE: 不做任何反应 | |||
WARNING: 输出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为 WARN) | |||
FAILING: 映射失败 (抛出 SqlSessionException) | |||
defaultExecutorType | 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置超时时间,它决定驱动等待数据库响应的秒数。 | 任意正整数 | Not Set (null) |
defaultFetchSize | 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖。 | 任意正整数 | Not Set (null) |
safeRowBoundsEnabled | 允许在嵌套语句中使用分页(RowBounds)。 If allow, set the false. | true | false | FALSE |
safeResultHandlerEnabled | 允许在嵌套语句中使用分页(ResultHandler)。 If allow, set the false. | true | false | TRUE |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 | true | false | FALSE |
localCacheScope | MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定动态 SQL 生成的默认语言。 | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
callSettersOnNulls | 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean等)是不能设置成 null 的。 | true | false | FALSE |
returnInstanceForEmptyRow | 当返回行的所有列都是空时,MyBatis默认返回null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。(从3.4.2开始) | true | false | FALSE |
logPrefix | 指定 MyBatis 增加到日志名称的前缀。 | Any String | Not set |
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | 指定VFS的实现 | 自定义VFS的实现的类全限定名,以逗号分隔。 | Not set |
useActualParamName | 允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始) | true | false | TRUE |
configurationFactory | Specifies the class that provides an instance of Configuration. The returned Configuration instance is used to load lazy properties of deserialized objects. This class must have a method with a signature static Configuration getConfiguration(). (Since: 3.2.3) | A type alias or fully qualified class name. | Not set |
示例代码
6.3. 别名
就是配置映射文件里的类名使用指定的名字来代替全限定名。
可以将parameterType、resultType中指定的类型通过别名引用
1.1.10. 自定义别名
定义单个别名:
批量定义别名:
1.1.11. 内置别名
内置的别名就是,Mybatis框架默认已经设置的别名.
别名 | 映射的类型 |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
6.4. mappers的配置
7. 其他知识点
7.1. #{} 和 ${}的区别
#{} 是占位符,像我们PreparedStatement?,会进行预编译
${} 直接拼接sql语句,不对sql进行预编译,可能出现sql注入问题
7.2. 模糊查询代码
<select id="findUserListLike02" resultType="User" parameterType="String"> select id,username,password from tb_user where username like concat('%',#{value},'%') </select>
|
7.3. 插入返回主键
8. Mapping映射文件
8.1. parameterType
配置输入参数的类型,使用全限定名或者使用别名
注意事项:
传入的参数要么没有,要么只有一个
8.2. resultType
配置输出参数的类型,使用全限定名或者使用别名
注意事项:
配置的是单条数据的类型
8.3. resultMap
实体的属性名和数据库的字段不匹配时使用resultMap
9. 动态SQL
不管是使用什么标签的组成,重点在最后拼接出来的SQL.重点查看拼接的结果.
9.1. 什么是动态SQL
根据条件组合成一条SQL语句,这种情况我们称之为动态SQL.
9.2. 动态SQL的作用
作用就是提高SQ语句的重用性,从而减少编写代码.
9.3. 动态sql的使用
在动态sql标签中使用参数,不使用占位符
1.1.12. <sql>片段
定义一个共用的SQL语句块
需求:定义公共的查询sql片段
定义
使用
通过include标签引入sql片段
1.1.13. <if> <set>标签的使用
set标签会根据情况自动忽略最后一个逗号
需求:实现一个这个样的update语句,如果参数值为空的时候,不修改.如果参数不为空的值才修改
分析: <if> <set>
If标签用来判断传入参数的属性是否为空
Set标签
1、自动给我们sql 加上set 关键字
2、把最后一个set语句的逗号删除
使用
1.1.14. <choose> <when><otherwise>标签的使用
类似与 if (条件1){ //如果条件1成立,条件2就不会执行了 }else if(条件2) //如果条件1不成立,条件2成立 else{ //条件1,条件2都不成立 }
|
需求:查询一个的信息如果学生的名字不为空,那么就使用学生的名字查询,如果学生的名字为空,性别不为空,那么使用性别查询,如果学生的名字和性别都为空,那么查询年龄大于18的学生
分析: <choose> <when> <otherwise> <where>
1.1.15. <where>标签的使用
where标签在多个条件拼接的时候使用
需求:查询一个学生的信息如果学生的名字不为空,那么就使用学生的名字查询,如果性别也不为空,那么使用性别+名字查询,如果学生年龄也不为空,那么使用名字+性别+年龄,如果名字性别年龄都为空就全表查询
where标签:
1.、给sql语句加上where关键字
2、删掉第一个and,or 关键字
1.1.16. <foreach>标签
在statement通过foreach遍历parameterType中的集合类型。
需求:批量增加,传入一个集合的学生,将多个学生同时插入到数据库
批量删除
需求:通过学生id进行批量删除
集合实现
Mapper.xml代码
Mapper.java代码
数组实现
Mapper.xml
Mapper.java
批量增加
需求:批量插入学生信息
实现代码
Mapper.xml
Mapper.java
注意事项
1、传入参数为集合时,collection属性的值为:list/collection
2、传入参数为数组时,collection属性的值为:array
3、无论传入的参数时数组还是集合,parameterType的参数可以为:collection/list
10.缓存
10.1. 什么是缓存
缓存就是将数据放在内存的缓冲区或文件上.查询时,如果数据已经存在,就不会再去查询数据库.
10.2. 缓存的作用
将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
10.3. 缓存的分类
mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的。
10.4. 一级缓存
一级缓存默认是打开的一级缓存就是会话(Session)级别的缓存,就是说,同一个会话数据会缓存在缓冲区,只要会话(Session)不关闭,不管查询N次数据库,其实都是只查询了一次.
关闭一级缓存三种方式
1.通过session.clearCache();
2.操作数据库(增删改) commit()操作
3.通过关闭session.close();
10.5. 二级缓存
Mybatis里面,二级缓存就是文件级别的缓存.就是将每一个mapper映射文件查询的结果缓存在缓存区.即使关闭了会话(session),缓存也还在.
默认情况:只要发生了增,删,改,才会清除缓存.
1.1.17. 配置二级缓存的步骤
1.必须将缓存的实体类加上序列化接口
import java.io.Serializable; |
2.映射文件配置缓存的支持
3.配置启动二级缓存,新版本已经是true(可以不配)
1.1.18. 禁用二级缓存
对于查询频率较高的sql,需要禁用二级缓存。
useCache="false"
1.1.19. 刷新二级缓存
增,删,改操作(commit操作)刷新缓存
在insert/delete/update设置 flushCache="false"
1.1.20. 二级缓存应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
10.6. Mybatis整合第三方缓存框架ehcache
配置
1.引入ehcache的jar包
2.配置mapper里的cache标签
注意事项:
Ehcache需要使用slf4j的日志支持
11.高级查询
11.1. 高级查询是什么
高级查询就是在Mybatis的映射文件配置,一对一,一对多,多对多这几种表关联关系的配置
11.2. 配置支持驼峰命名法
骆驼命名法就是将字段user_name 能够使用实体类的 userName属性接收
配置信息
<!-- 配置全局的参数 --> <settings> <!-- 配置支持驼峰命名法 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 配置输出日志 --> <setting name="logImpl" value="LOG4J"/> </settings> |
11.3. 数据库关系图
11.4. 一对一
需求:一个学生对应一个地址
在实体类加上关系
编写sql
编写mapper.xml
第一种:
第二种:
第三种(延迟加载的时候使用):
11.5. 一对多
需求:一个学生对应多个课程
在实体类上加上一对多关系
编写sql
编写mapper.xml
第一种:
第二种:(延迟加载的时候使用)
12.延迟加载
按需加载
12.1. 延迟加载的意义
在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。
如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。
mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载
12.2. 配置延迟加载
设置项 | 描述 | 允许值 | 默认值 |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | true | false | false |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true | false | true |
<!-- 全局配置参数 --> <settings> <!-- 延迟加载总开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 设置按需加载 --> <setting name="aggressiveLazyLoading" value="false" /> </settings> |
注意事项:
Mybatis的延迟加载只有使用resultMap 映射一对一,一对多时,
association和collection 中必须使用select属性
13.Mybaits注解使用详解
13.1. @Param使用
绑定多个参数的时候使用
原理:把参数封装到Map里,注解中的参数就是map的key
需求:实现分页查询
Mapper.java
Mapper.xml
13.2. 简单的增删改查注解
@Select
@Update
@Delete
@Insert
13.3. 结果集映射的注解
xml ----> resultMap
Annotation ---> @Results
1.1.21. 映射结果集
1.1.22. 一对一查询
1.1.23. 一对多查询
13.4. 动态sql的注解
1.1.24. @SelectProvider
Mapper.java
Provider.java
1.1.25. @UpdateProvider
Mapper.java
Provider.java
1.1.26. @DeleteProvider
Mapper.java
Provider.java
1.1.27. @InsertProvider
Mapper.java
Provider.java
14.逆向工程
mybatis官方为了提高开发效率,提高自动对单表生成sql,包括 :mapper.xml、mapper.java、表名.java(实体类)
1.第一步打开eclipse的插件市场
2、搜索mybaits-generator插件,并安装
3.耐心等待...
4.新建工程加入jar包
generatorConfig.xml代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="context1"> <!-- 取消注释 --> <!-- org.mybatis.generator.config.PropertyRegistry --> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 数据库连接 --> <jdbcConnection connectionURL="jdbc:mysql://localhost:3307/mybatis_clazz_day03" driverClass="com.mysql.jdbc.Driver" password="root" userId="root" /> <!-- 实体类的目录 --> <javaModelGenerator targetPackage="com.ysjt.entity" targetProject="mybatis_demo20_day05_generator" /> <!-- 映射文件的目录 --> <sqlMapGenerator targetPackage="com.ysjt.mapper.xml" targetProject="mybatis_demo20_day05_generator"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 映射接口的目录 type:表示生成策略, XMLMAPPER 配置xml ANNOTATEDMAPPER 配置注解 targetPackage:存放的包 targetProject:项目名 --> <javaClientGenerator targetPackage="com.ysjt.mapper" targetProject="mybatis_demo20_day05_generator" type="ANNOTATEDMAPPER" /> <table tableName="student" enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"></table> <table tableName="course" enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"></table> <table tableName="teacher" enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"></table> <table tableName="address" enableCountByExample="false" enableSelectByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"></table> </context> </generatorConfiguration> |
选中generatorConfig.xml右键
15.整理知识点
15.1. 使用的settings
<!-- 配置全局的参数 --> <settings> <!-- 配置全局缓存开关 --> <setting name="cacheEnabled" value="true"/> <!-- 延迟加载总开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 设置按需加载 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 配置驼峰命名 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 配置输出日志 --> <setting name="logImpl" value="LOG4J"/> </settings> |
15.2. jdbcType的属性