MyBatis学习笔记—2
1、使用Mapper的接口编写MyBatis项目
1.1 Mapper接口
MyBatis
框架抛开了 Dao
的实现类,直接定位到映射文件 mapper
中的相应 SQL
语句,对DB
进行操作。这种对 Dao
的实现方式称为 Mapper
接口的动态代理方式。
Mapper
动态代理方式无需程序员实现 Dao
接口。接口是由 MyBatis
结合映射文件自动生成的动态代理实现的。
2、Mapper实现步骤
2.1 编写接口
package com.xaf.mapper;
import com.xaf.pojo.Team;
import java.util.List;
public interface TeamMapper {
List<Team> queryAll();
Team queryById(int teamId);
int add(Team team);
int update(Team team);
int del(int teamId);
}
当然,我们需要创建相应的xml文件
<?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="com.xaf.mapper.TeamMapper">
<!--省略内容,复制Team.xml中的内容即可-->
</mapper>
在mybatis.xml
配置文件中注册映射文件
<mappers>
<!--省略其他-->
<mapper resource="com/xaf/mapper/TeamMapper.xml"/>
</mappers>
2.2 getMapper方法获取代理对象
只需调用 SqlSession
的 getMapper()
方法,即可获取指定接口的实现类对象。
package com.xaf.test;
import com.xaf.dao.TeamDao;
import com.xaf.dao.TeamDaoImpl;
import com.xaf.mapper.TeamMapper;
import com.xaf.pojo.Team;
import com.xaf.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.Date;
import java.util.List;
/**
* ClassName: TeamDaoTest
* TeamMapper的测试类
* @version 1.0
*/
public class TeamMapperTest {
private SqlSession sqlSession=MybatisUtil.getSqlSession();
@Test
public void test01(){
TeamMapper teamDao= sqlSession.getMapper(TeamMapper.class);
//添加
Team team=new Team();
team.setTeamName("勇士");
team.setLocation("金州");
team.setCreateTime(new Date());
int num=teamDao.add(team);
sqlSession.commit();//必须提交才能让增删改生效
System.out.println(num);
//更新
Team team1 = teamDao.queryById(1001);
team1.setTeamName("XiaoAiFu的球队");
num = teamDao.update(team1);
sqlSession.commit();//必须提交才能让增删改生效
System.out.println(num);
//删除
num=teamDao.del(1001);
sqlSession.commit();//必须提交才能让增删改生效
System.out.println(num);
//查询所有
List<Team> teams = teamDao.queryAll();
teams.forEach(t-> System.out.println(t));
}
}
当然,如上的操作只是让大家了解怎么使用Mapper
动态代理自己的项目,不需要大家跟着复制粘贴。
3、#{} 和 ${}的区别
3.1 #{}
#{}
:表示一个占位符,通知Mybatis
使用实际的参数值代替。并使用 PrepareStatement
对象执行 sql
语句, #{…}
代替sql
语句的“?”
。这个是Mybatis
中的首选做法,安全迅速。
<select id="queryById" parameterType="int" resultType="com.kkb.pojo.Team">
select * from team where teamId=#{id}
</select>
<!--Mybatis执行的时候是:
String sql="select * from team where teamId=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1001);
where teamId=? 实际就是 where teamId=#{id}
ps.setInt(1,1001) 中的1001会替换#{id}
-->
3.2 ${}
:
表
示
字
符
串
原
样
替
换
,
通
知
‘
M
y
b
a
t
i
s
‘
使
用
‘
{}:表示字符串原样替换,通知`Mybatis` 使用`
:表示字符串原样替换,通知‘Mybatis‘使用‘包含的“字符串”替换所在位置。使用
Statement或者
PreparedStatement把
sql语句和
${}`的内容连接起来。一般用在替换表名,列名,不同列排序等操作。
举例一:
TeamMapper接口添加如下内容:
List<Team> queryByName(String teamName);
List<Team> queryByLocation(String location);
TeamMapper.xml配置文件中添加如下:
<select id="queryByName" resultType="com.xaf.pojo.Team">
select * from team where teamName=#{teamName}
</select>
<select id="queryByLocation" resultType="com.xaf.pojo.Team">
select * from team where location=#{location}
</select>
举例二:
TeamMapper接口添加如下内容:
List<Team> queryByFiled(@Param("column") String column,@Param("columnValue") String columnValue);
TeamMapper.xml配置文件中添加如下:
<select id="queryByFiled" resultType="com.xaf.pojo.Team">
select * from team where ${column}=#{columnValue}
</select>
这就是以上配置的区别。前者是作为占位符使用居多;后者一般会事先告知程序替换字符串后并将字符串原样替换。
4、Mybatis的全局配置文件
Mybatis配置文件包含了会影响Mybatis行为的设置和属性信息。其配置文件顶层结构如下:
configuration(配置)
properties--属性:加载外部的配置文件,例如加载数据库的连接信息
Settings--全局配置参数:例如日志配置
typeAliases--类型别名
typeHandlers----类型处理器
objectFactory-----对象工厂
Plugins------插件:例如分页插件
Environments----环境集合属性对象
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
Mappers---映射器:注册映射文件用
4.1 属性(properties)
属性可以在外部进行配置,并可以进行动态替换。我们既可以在 properties
元素的子元素中设置(例如DataSource节点中的properties节点),也可以在 Java 属性文件中配置这些属性。
数据源中有连接数据库的四个参数数据,我们一般都是放在专门的属性文件中,mybatis
的全局配置文件直接从属性文件中读取数据即可。
1、在 resources 目录创建 jdbc.properties 文件,文件名称可以自定义。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=root
2、mybatis的全局配置文件引入属性文件
<properties resource="jdbc.properties"/>
3、使用属性文件中的值
<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>
4.2 设置Settings
MyBatis
中极为重要的调整设置,它们会改变 MyBatis
的运行时行为.例如我们配置的日志就是应用之一。
<!--配置日志-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4.3 类型别名typeAliases
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
4.3.1 Mybatis中已经支持的别名
4.3.2 自定义别名
<!--自定义类型别名-->
<typeAliases>
<!--对单个的实体类定义别名-->
<typeAlias type="com.kkb.pojo.Team" alias="Team"/>
<!--推荐写法:批量定义别名:扫描指定包下的所有类,同时别名定义为类名,别名的首字母大小写都可以-->
<package name="com.kkb.pojo"/>
</typeAliases>
4.4 映射器Mappers
配置的方式:
4.4.1 使用相对于类路径的资源引用
语法:<mapper resource=""/>
使用相对于类路径的资源,从 classpath 路径查找文件
例如:<mapper resource="com/kkb/mapper/TeamMapper.xml" />
4.4.2 使用映射器接口实现类的完全限定类名
语法:<mapper class=""/>
使用的mapper接口的完全限定名
要求:接口和映射文件同包同名
例如<mapper class="com.kkb.mapper.GameRecordMapper"/>
4.4.3 将包内的映射器接口实现全部注册为映射器–推荐
语法:<package name=""/>
指定包下的所有Mapper接口
如:<package name="com.kkb.mapper"/>
注意:此种方法要求 Mapper接口名称和 mapper 映射文件名称相同,且在同一个目录中。
4.5 dataSource标签
Mybatis
中访问数据库支持连接池技术,而且是采用的自己的连接池技术。在 Mybatis
的 mybatis.xml
配置文件中,通过来实现 Mybatis
中连接池的配置。MyBatis
在初始化时,根据的 type
属性来创建相应类型的的数据源 DataSource
。
UNPOOLED: 不使用连接池的数据源
POOLED:使用连接池的数据源
JNDI:使用JNDI实现的数据源
前两个数据源都实现javax.sql.DataSource接口
4.6 事务
4.6.1 默认手动配置
Mybatis
框架是对 JDBC
的封装,所以 Mybatis
框架的事务控制方式,本身也是用 JDBC
的 Connection
对象的 commit(), rollback() .Connection
对象的 setAutoCommit()
方法来 设置事务提交方式的。自动提交和手工提交。
<transactionManager type="JDBC"/>
该标签用于指定 MyBatis所使用的事务管理器。MyBatis 支持两种事务管理器类型:JDBC
与 MANAGED
。
以上就是对MyBatis
的进一步介绍,谢谢大家阅读。