SqlMapConfig.xml下的配置:
配置内容和顺序:
- properties(属性)
- property
- setting(全局参数设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境信息集合)
- environment(单个环境信息)
- transactionManager(事务)
- dataSource(数据源)
- environment(单个环境信息)
- mappers(映射器)
properties:属性
- 可用于加载配置文件
- 属性:
- resource:配置文件地址
- 属性:
- 可修改某个配置属性
- property
- name:属性名称
- value:属性值
- property
- 加载的顺序
- 先加载properties中property标签声明的属性
- 再加载properties标签引入的配置文件中的属性,覆盖与property标签中相同的属性
- parameterType的值会和properties的属性值发生冲突(最后读取parameterType传递的属性?)
- 建议:如果引入配置文件,就尽量不要再property中声明属性
typeAliases:类型别名
- 在SqlMapConfig的xml中可以为某个类的全限定名设置一个别名,在设置完之后可以使用别名而不使用全限定名称。
- 此处的别名可按单个类进行定义,也可按一个包进行定义,按包定义后,默认的别名是类名,首字母大小写均可
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 |
mappers:映射
- 属性:
- resource:使用相对于类路径的资源
- url:使用完全限定路径
- class:使用mapper接口的全限定名。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
- 标签:
- package:注册指定包下的所有映射文件。注意:此种方法要求mapper接口和mapper映射文件要名称相同,且放到同一个目录下
- 完成mapper文件的编写后,必须要在SqlMapConfig.xml下进行加载
Mapper代理:
在使用MyBatis的命名sql时 除了用字符串调用指定名称的sql外,还可以通过mapper代理的方式来调用sql,但是需要按照规范进行开发:
- mapper接口的全限定名要和mapper映射文件的命名空间一致
- mapper接口的方法名要和mapper映射文件的statement的id一致
- mapper接口的传入参数要和mapper映射文件的statement中的parameterType的值一致,且它的参数是一个
- mapper接口的方法返回值要和mapper映射文件的statement中的resultType的值一致(如果返回的是集合 则泛型要一致)
注意:Mapper代理使用的是jdk的代理策略
映射文件下的配置
基本语句
select
- parameterType: 传入参数 可以为基本类型也可以为Bean类型
parameterMap: 传入映射参数,过时了 官方文档都表示将来可能删除- resultType: 传出参数 可以为基本类型
- resultMap: 传出结果映射,当查询结果有多个对象时使用,可以将查询结果封装为对象,需要先声明一个resultMap的配置
insert
- selectKey标签:查询主键,在标签内需要输入查询主键的sql。(用处:可以编写在insert语句发生后回传主键的sql,也可以编写在insert语句发生前传入主键的sql)
- 属性:
- order:相对于insert语句来说,指定查询主键的sql和insert语句的执行顺序
- resultType:该标签下sql的返回类型
- 属性:
#{}和${}区别
- #{}表示占位符?,#{}接收简单类型时,大括号内的变量可以是任意值
- ${}表示拼接符,${}接收简单类型时,大括号内的变量必须是value,且传入的值会原样输出,但是存在sql注入风险
动态SQL
标签
sql
表示sql片段。可以让代码有更高的复用性,需要先定义后使用。在需要使用时 引用以下代码:
<include refid="sql片段id"></include>
foreach
可以循环传入参数值(传入值应为一个集合)
where
默认去掉后面第一个AND,如果没有参数会自动删除WHERE关键字
if
可以对输入的参数进行判断
实际运行Demo
主运行程序
public static void main(String[] args) {
//获取配置文件的路径
String resource="SqlMapConfig.xml";
//加载配置文件
InputStream inputStream = Resource.getResourceAsStream(resource);
//创建session工厂 工厂建议只创建一次
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().builder(inputStream);
//打开session
SqlSession session = sqlSessionFactory.openSession();
//通过Mapper代理方式,根据用户id查询用户信息
Mapper userMapper = session.getMapper(User.class);
User userByMapper = userMapper.findUserById(1);
//通过字符串调用指定sql语句的方式
User userByStr = session.selectOne("com.mybatis.mapper.UserMapper.findUserById", "1");
System.out.println(userByMapper);
//关闭session
session.close();
}
SqlMapConfig.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 alias="User" type="com.mybatis.domain.User"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/mapper/UserMapper.xml" />
</mappers>
</configuration>
db.properties配置文件
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/ee19_crmdb
db.username=root
db.password=8469
UserMapper.xml配置文件 (需与UserMapper.java放在同一包下)
<?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.mybatis.mapper.UserMapper">
<select id="findUserById" parameterType="string"
resultType="com.mybatis.domain.User">
select * from user where id = #{id}
</select>
<select id="findUsersByCondition" parameterType="User"
resultType="User">
select * from user
<where>
<if test="user != null">
<if test="username != null and username != ''">
AND username LIKE '%${username}%'
</if>
<if test="sex != null and sex != ''">
AND sex = #{sex}
</if>
</if>
</where>
</select>
<insert id="insertUser" parameterType="User">
<!-- 如果没有这段代码 则不会将id设置给插入的user对象 -->
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT
LAST_INSERT_ID()
</selectKey>
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
MyBatis与Hibernate对较
Mybatis技术特点:
- 通过直接编写SQL语句,可以直接对SQL进行性能的优化;
- 学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;
- 由于直接编写SQL语句,所以灵活多变,代码维护性更好。
- 不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。
Hibernate技术特点:
- 标准的orm框架,程序员不需要编写SQL语句。
- 具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。
- 学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。
- 程序员不能自主的去进行SQL性能优化。