一、常用标签介绍
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,我们可以指定查询结果字段和实体属性字段的映射关系。
三、实现分页查询
分页是展示页面中常见的一种技术,就是把数据在页面分开显示,这样可以提高执行效率和用户的流量
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 * from t_user limit #{pageOffset},#{pageSize}
3.测试
@Test public void test1(){ SqlSession session = MybatisUtil.getSession(); Map
分页插件的使用:
PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。因为是第三方插件,所以需要额外的jar包
配置插件
在mybatis-config.xml中,添加plugins标签配置,表示开启PageHelper插件
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
.....
...
修改CategoryMapper.xml
limit注释掉,因为分页相关工作,会由PageHelper去做掉,不需要自己去写了
select * from t_category
分页查询测试
查询很有意思,只需要在执行查询所有的调用之前,执行一条语句即可:
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
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
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(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)