在Maven框架下,pom.xml导入mybatis依赖
org.mybatis
mybatis
3.5.5
还有其余junit/mysql/logback/lombok 等jar包
在JDK1.8下需要配置
属性配置
maven.compiler.source maven
编译源码环境
是jdk8
maven.compiler.target maven
目标代码运行环境jdk8
当前模块中 源码的编码集utf-8
-->
8
8
UTF-8
在java源代码文件夹的resouces文件夹中创建mybatis-config.xml 作为中心配置文件
配置文件组成部分
1.起别名 每次复制之后要进行检查
2.连接池 四个信息 dataSource 每次复制之后要进行检查
3.映射文件 关注包
-->
environments环境们
default选择哪一个环境
environment环境 id代表不同的环境id
-->
transactionManager 事务管理器
当前框架中的事务管理 谁来管理
type="JDBC" 使用JDBC中的事务管理操作(推荐)
MANAGED 自己管理事务
-->
mybatis自带连接池
type="POOLED" 你用连接
type="UNPOOLED" 不用连接池
type="JNDI" 连接池是一个服务器 以客户端身份连接 已过时。
-->
driver 驱动 连接那种数据库就写哪种数据库的驱动
url连接哪个数据库
-->
映射文件
咱们的sql在mybatis都是写在 XxxMapper.xml中的
mappers
里面的mapper就代表着 找到 咱们 的sql文件
-->
//代表扫描这个包下的所有文件
创建Brand类与tb_brand表
根据ORM思想,数据库的一张表对应java中的一个类.表中的一条数据,对应这个类的一个对象.表中的一个字段,对应对象的一个属性.
根据代理模式要求,创建BrandMapper接口与BrandMapper.xml 映射sql配置文件
[if !supportLists]1. [endif]接口在源代码中的路径与xml在资源文件中的路径一致,这样编译后他们才会在同一文件夹下
com.xxx.mapper.BrandMapper.java
com\xxx\mapper\BrandMapper.xml在win下用\代替.
[if !vml]
[endif]
[if !supportLists]2. [endif]BrandMapper.xml的名称空间需要是接口的全限定类名
[if !supportLists]3. [endif]接口中的方法名需要与映射配置文件中的sql标签的id 一致.
并且方法的返回值与标签的resultType的属性值一致.因为在核心配置文件中起了别名,所以返回值类型可以简写为brand
接口中:
[if !vml]
[endif]
映射文件中:
[if !vml]
[endif]
测试类编写
测试要在test文件夹中编写,因为junit的依赖添加了范围
[if !vml]
[endif]
@Test
public void queryBrandById() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
//
使用框架,我们只需要创建接口,框架会自动实现接口并提供给我们一个接口实现类对象mapper,通过mapper我们去调用接口中被实现的方法
BrandMapper mapper =sqlSession.getMapper(BrandMapper.class);
Brand brand =mapper.queryBrandById(2);
System.out.println(brand);
//
增删改操作需要用sqlSession的commit来提交.
sqlSession.close();
}
关于接口中的方法的参数定义与使用
1.如果是基本数据类型 或String类型作为参数,那么方法中参数可以不用起别名
BrandqueryBrandById(Integer id);
使用时直接${参数名}
select * from tb_brand where id =#{id};
2.参数如果是一个对象 使用时可以直接用属性名
voidupdateBrand(Brand brand);
使用update语句时结合
传入的对象什么属性不为null.就会把这些属性取出使用作为update的值
[if !vml]
[endif]
3.参数如果是一个map集合,使用时需要使用map的key
List queryByCondition2(Map map);
select * from tb_brand where status = #{status}
and companyName like #{companyName}
and brandName like #{brandName};
[if !supportLists]4. [endif]如果传入的是集合.数组.而且我们需要遍历?
void deleteBrandsByIdArr(Integer[] ids);
delete from tb_brand
where id in
open="(" close=")" item="id"
separator=",">
#{id}
[if !supportLists]5. [endif]如果传入多个参数,需要在参数前加@Param(“别名”) 使用时引用${别名}
ListqueryByCondition(@Param("status")Integer status,@Param("brandName")StringbrandName,
@Param("companyName")StringcompanyName);
insert intotb_brand(brandName, companyName, ordered, description, status)
values(#{brandName},#{companyName},#{ordered},#{description},#{status});
[if !supportLists]6. [endif]如果插入数据时 ,需要回显主键 则需要在insert标签中加入属性
useGeneratedKeys="true"keyProperty="id"
如何解决类中属性名与表中字段名不匹配的问题
mybaits自动将数据库查到的数据进行封装成javabean,基于类中属性名与表中字段名完全一致的情况,这是自动映射
[if !supportLists]1. [endif]若出现不一致情况,我们可以通过给数据库sql语句起别名的方法进行解决
[if !supportLists]2. [endif]还可以通过手动映射进行解决
[if !supportLists]1) [endif]sql配置文件中,将select标签属性改完resultMap= “xxx”
[if !supportLists]2) [endif]增加<resultMap>标签,id=”xxx”;type=”全类名”
包裹<result property = “xxx” column= “xxx”>进行关系匹配