一、常用标签介绍
1.配置属性
properties(属性)
property
settings(全局配置参数)
setting
typeAliases(类型别名)
typeAliase
package
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
mapper
package
① Properties属性
在使用 properties 标签配置时,我们可以采用两种方式指定属性配置。
第一种:
properties>
property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
property name="jdbc.url" value="jdbc:mysql://localhost:3306/test"/>
property name="jdbc.username" value="root"/>
property name="jdbc.password" value="root"/>
properties>
第二种:
在classpath下创建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
properties url= file:///D:/workspace/day02_test/src/db.properties">properties>
此时我们的 dataSource 标签就变成了引用上面的配置
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>
② typeAliases属性
在前面我们讲的 Mybatis 支持的默认别名,我们也可以采用自定义别名方式来开发
在 mybatis-config.xml 中配置:
typeAliases>
typeAlias alias="user" type="com.tledu.zrz.pojo.User"/>
package name="com.tledu.zrz.pojo"/>
package name="其它包"/>
typeAliases>
③ Mappers属性
Mappers使我们所说的映射器,用于通过mybatis配置文件去找到对应的mapper文件
有三种用法
④Resources
使用相对于类路径的资源
如:
⑤class
使用 mapper 接口类路径
如:
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
⑥Package
注册指定包下的所有 mapper 接口
如:
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
-------------------------------------------------------------------------------------------------------------------------------------
2.Mapper.xml属性
1.#和$区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。
举例:select * from user where username = ' ' or 1=1 # and passord=''
#{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值,#{}括号中可以是 value 或其它名称。
可以自动对值添加 ’ ’ 单引号
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
比如order by id 这种的,以id排序 那么这个id 是没有单引号的,就是简单的SQL拼接,所以我们应该使用${} 而不是#{}
举例: ALTER TABLE (表名) ADD keycode(字段) varchar(500)
-------------------------------------------------------------------------------------------------------------------------------------
2.parameterType 配置参数
我们在上一章节中已经介绍了 SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。
注意事项
基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式
例如 :
java.lang.String
实体类类型,目前我们只能使用全限定类名。
究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。在 mybatis 的官方文档的说明
3.resultType
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
我们在前面的 CRUD 案例中已经对此属性进行过应用了。
需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
例如:我们的实体类此时必须是全限定类名
同时,当是实体类名称时,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装(不区分大小写)
---------------------------------------------------------------------------------------------------------------------------------
4.resultMap
我们在resultType ,提到在声明返回值类型为实体类型之后,实体中的属性必须和查询语句中的属性对应上,但是我们在开发的过程中也难免会遇到无法对应的情况。比如说我们在进行数据库设计的时候,多个单词往往是用_连接,但是在实体类中的属性往往采用小驼峰的方式命名。这就导致字段名无法对应上,这个时候我们就需要配置resultMap来解决这个问题了。
通过resultMap,我们可以指定查询结果字段和实体属性字段的映射关系。
<resultMap id="userResult" type="User">
<id column="id" property="id" />
<result property="nickname" column="nickname" />
<result property="schoolName" column="school_name" />
</resultMap>
三、实现分页查询
分页是展示页面中常见的一种技术,就是把数据在页面分开显示,这样可以提高执行效率和用户的流量
1、分页思想
总条数 totalCount:select count(*) from t_user;
每页条数 pageSize: 3
共有几页 totalPage: totalCount / pageSize + (totalCount % pageSize == 0 ? 0 : 1)
通过分页limit查询参数变化规律 可以 发现
select * from t_user limit 起始值,分页单位
起始值一直在变化 ,而分页单设定好后是不变的
起始值 = (当前页-1)*分页单位
这样我们就可以根据以上规律实现sql的分页查询了
2.在UserMapper.xml中添加分页相关sql
<!-- 获取分页数据 --> <select id="findPageList" resultType="User" parameterType="map"> select * from t_user limit #{pageOffset},#{pageSize} </select> <!-- 获取总条数 --> <select id="getListCount" resultType="int"> select count(*) from t_user; </select>
3.测试
@Test public void test1(){ SqlSession session = MybatisUtil.getSession(); Map<String,Object> map = new HashMap<>(); int cpage = 2; int pageSize = 3; int start = (cpage-1)*pageSize; map.put("start",start); map.put("pageSize",pageSize); List<User> list = session.selectList("User.getList", map); for (User user : list) { System.out.println(user); } session.close(); }
分页插件的使用:
PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。因为是第三方插件,所以需要额外的jar包
配置插件
在mybatis-config.xml中,添加plugins标签配置,表示开启PageHelper插件
<?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>
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 将积极加载改为消息加载即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<typeAliases>
<package name="com.how2java.pojo"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>
<environments default="development"> .....
</environments>
<mappers> ...
</mappers> </configuration>
修改CategoryMapper.xml
limit注释掉,因为分页相关工作,会由PageHelper去做掉,不需要自己去写了
<?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.how2java.pojo"> <select id="listCategory" resultType="Category">
select * from t_category
<!-- <if test="start!=null and count!=null"> -->
<!-- limit #{start},#{count} -->
<!-- </if> --> </select> </mapper>
分页查询测试
查询很有意思,只需要在执行查询所有的调用之前,执行一条语句即可:
PageHelper.offsetPage(0, 5);
public class TestMybatis { public static void main(String[] args) throws IOException, InterruptedException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); PageHelper.offsetPage(0, 5); List<Category> cs = session.selectList("listCategory"); for (Category c : cs) { System.out.println(c.getName()); } session.commit(); session.close(); } }
获取总数
public class TestMybatis {
public static void main(String[] args) throws IOException, InterruptedException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory= newSqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(); PageHelper.offsetPage(0, 5);
List<Category> cs = session.selectList("listCategory");
for (Category c : cs) {
System.out.println(c.getName());
}
PageInfo pageInfo = new PageInfo<>(cs);
System.out.println("总数:"+pageInfo.getTotal());
System.out.println(pageInfo);
session.commit();
session.close(); } }