MyBatis
是一个半自动的映射框架,之所以称为半自动,是因为它需要手工匹配提供的POJO
、SQL
、和映射关系,而Hibernate
只需提供POJO
和映射关系即可。
下载地址:
创建项目,导入jar
包
Mybatis的基本构成
1、SqlSessionFactoryBuilder
(构造器),根据配置信息或代码来生成SqlSessionFactory
(工厂接口)
2、SqlSessionFactory
:来生成SqlSession
3、SqlSession
:执行SQL
并返回结果
4、SQLMapper
:由一个Java
类和XML
(或注解)构成
构建
SqlSessionFactory
主映射文件:
<?
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=
"jdbc.properties"
></
properties
>
<!-- 设置别名 -->
<
typeAliases
>
<!-- 方式一 -->
<!-- <typeAlias type="com.my.entity.User" alias="user"/> -->
<!-- 方式二,常用 可以在实体类上定义
@Alias(
"user")
指定是user别名-->
<
package
name=
"com.my.entity"
/>
</
typeAliases
>
<
environments
default=
"development"
>
<
environment
id=
"development"
>
<
transactionManager
type=
"JDBC"
/>
<
dataSource
type=
"POOLED"
>
<
property
name=
"driver"
value=
"${driver}"
/>
<
property
name=
"url"
value=
"${url}"
/>
<
property
name=
"username"
value=
"${username}"
/>
<
property
name=
"password"
value=
"${password}"
/>
</
dataSource
>
</
environment
>
</
environments
>
<
mappers
>
<
mapper
class=
"com.my.mapper.UserMapper2"
/>
<!-- 注解的
mapper
-->
<
mapper
resource=
"com/my/mapper/UserMapper.xml"
/>
</
mappers
>
</
configuration
>
代码:(创建工厂)
public
void createFactory()
throws IOException{
SqlSessionFactoryBuilder
builder =
new SqlSessionFactoryBuilder();
String
resource =
"mybatis-config.xml";
InputStream
inputStream = Resources.
getResourceAsStream(
resource);
SqlSessionFactory
sessionFactory =
builder.build(
inputStream);
构建SqlSession
SqlSession
sqlSession =
null;
//构造器
try {
sqlSession
=
sqlSessionFactory
.openSession();
sqlSession.commit();
}
catch (Exception
e) {
e.printStackTrace();
}
finally {
if(
sqlSession!=
null){
sqlSession.close();
}
}
SqlSession两个作用
1、获取映射器,
让映射器通过命名空间和方法名称找到对应的SQL
,执行SQL
并返回结果
2、直接通过命名信息去执行SQL
返回结果
映射器
映射器是由Java
接口和XML
文件(或注解)共同组成的。
作用如下:
1)
定义参数类型
2)
描述SQL
语句
3)
定义查询结果和POJO
的映射关系
4)
描述缓存
定义一个接口
public
interface UserMapper {
public User getById(
int
id);
//获取对象
public
int add(User
user);
//添加
public
int update(User
user);
//修改
public
int deleteById(
int
id);
//删除
//模糊查询
public List<User> queryUser(String
username);
//用map的方法传参数
public User queryUserByMap(Map<String, Object>
map);
//采用注解的方式传参数
public User queryAnnotation(
@Param(
"username")String
username,
@Param(
"password")String
password);
}
定义对应的UserMapper映射文件
<?
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.my.mapper.UserMapper"
>
<!-- 抽取公共的
sql
语句 用<include refid=
"user-common"
/>接收-->
<!--role_name as roleName当我们的数据库
表字段
和实体类
类属性
不一样的时候用 as -->
<
sql
id=
"user-common"
>
id,
username,password,role_name as roleName
</
sql
>
</
mapper
>
<
select
id=
"getById"
resultType=
"user"
parameterType=
"int"
>
select
<
include
refid=
"user-common"
/> from user where id = #{id}
</
select
>
<
insert
id=
"add"
parameterType=
"com.my.entity.User"
>
insert into user(
username,password) values(#{
username},#{password})
</
insert
>
<
update
id=
"update"
parameterType=
"com.my.entity.User"
>
update user set
username=#{
username},password=#{password} where id=#{id}
</
update
>
<
delete
id=
"deleteById"
parameterType=
"com.my.entity.User"
>
delete from user where id=#{id}
</
delete
>
<!-- 模糊查询 -->
<
select
id=
"queryUser"
resultType=
"user"
parameterType=
"string"
>
select
<
include
refid=
"user-common"
/> from user
where
username like
concat('%',#{
username},'%')
</
select
>
<!-- 传参的方式一,map的方式 -->
<
select
id=
"queryUserByMap"
resultType=
"user"
parameterType=
"map"
>
select
<
include
refid=
"user-common"
/> from user
where
username=#{
username} and password=#{password}
</
select
>
<!-- 注解的方法传参数 -->
<
select
id=
"queryAnnotation"
resultType=
"user"
>
select
<
include
refid=
"user-common"
/> from user
where
username=#{
username} and password=#{password}
</
select
>
动态SQL
解决大量拼装SQL
的工作
if
需求:
我们现在做用户查询,
有可能带用户名,
有可能不带
where
trim :
替换的作用
choose
、
when
、
otherwise
多个查询条件同时出现的时候,
排优先级
If ..elseif..else
Set
假如一个表有多个字段,但我只需要更新需要更新的字段,减少网络带宽
foreach
案例,我们做批量的删除或更新
方式一,
以整型数组的方式
Int[] id = new int[]{1,2,3,4,5}
Delete from user where id in(s)
方式二:
以集合的方式
方式三:
以map
的方式
首先注意我们mybatis的搭建环境;配置他的主配置文件;
创建工厂获取sqlsessionFacctory,
SqlSession
两个作用
1、获取映射器,
让映射器通过命名空间和方法名称找到对应的SQL
,执行SQL
并返回结果
2、直接通过命名信息去执行SQL
返回结果
映射器定义接口:实现CRUD的方法:
xml的方式:
在接口下创建一个和接口名一样的UserMapper
.xml文件,映射空间为接口类,里面写我们接口的CRUD的方法操作sql语句,写好了映射之后要记得在我们的主配置文件里面配置我们<mappers>
<mapper resource="com/my/mapper/UserMapper.xml" />
他们的
id
都是我们接口里对应的
方法名
,
resultType="user" 是我们的返回的类型,
parameterType="int" 是方法参数的类型,条件的值注意是用
#{id} 来获取,比如:delete from user where id=
#{id}
其中模糊查询的语句为:
select id,username,password,role_name as roleName from user
where username
like concat('%',#{username},'%')
注解的方式:
定义一个接口。
public
interface UserMapper2 {
//注解的形式
@Select(
"select * from user where id=#{id}")
public User getById(
int
id);
}
修改主配置文件的mappers,改为类名
<mapper class="com.my.mapper.UserMapper2"/><!-- 注解的mapper -->
设置别名:如下,设置好别名之后,我们接口的映射文件返回类型就可以改为user
resultType="user"
<
typeAliases
>
<!-- 方式一 -->
<!-- <typeAlias type="com.my.entity.User" alias="user"/> -->
<!-- 方式二,常用 可以在实体类上定义
@Alias(
"user")
指定是user别名-->
<
package
name=
"com.my.entity"
/>
</
typeAliases
>
抽取创建工厂的工具类,避免写重复的代码:
1.自身私有化
2.得到一个工厂对象,单例
3.提供一个得到sqlSession对象的方法
传递多个参数
的方式:
1、采用map
的方式传递
2、采用注解的方式
3、采用javabean
的方式
总结:
同个类里面的属性,就是bean
的方式传递
不是的话,map
和注解选择
少的(小于5个),就选注解,多的话就选map