mybatis简介
MyBatis是一个ORM的数据库持久化框架,主要用来操作数据库,ORM:对象关系映射
操作数据库:
jdbc:执行效率高,开发效率低,自己手动写sql,重复代码多,所以性能高,开发效率低
jpa:是对jdbc的封装,开发效率高,执行效率低,直接调用api就可以完成对应的crud操作,故而开发效率高,但是sql语句不是自己写的,我们不能很好的控制,所以执行效率低
mybatis:是两者特点的结合,开发效率比jdbc高,执行效率比jpa高,消除了重复代码,是自己手动写sql语句
使用步骤
1.导入对应的jar包
2.编写mybatis的核心配置文件
<?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>
<!--引入jdbc.propeties文件-->
<properties resource="jdbc.properties" />
<!-- 环境们 (很多环境的意思)
default:默认使用哪一个环境(必需对应一个环境的id)
-->
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 导入properties文件后,value值可以简写-->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mydb" />
<property name="username" value="root" />
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mappers>
<mapper resource="cn/itsource/domain/ProductMapper.xml" />
</mappers>
</configuration>
3.准备映射文件
一般情况下是和它对应的domain实体类在同一个层级
这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)
namespace的名称为了确定唯一性,请大家根据我的要求取名
记住一定要在mybatis-config.xml中引入
除了MyBatis支持的类型,其它的类型都通通使用全限定(全限定名可以设置别名)
<?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的主要功能就是写sql
mapper:根
namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加
namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
-->
<mapper namespace="cn.itsource.mybatis.day1._1_hello.ProductMapper">
<!--
select : 这里面写查询语句
id:用来确定这条sql语句的唯一
以后我们确定唯一,也就是找sql语句 : namespace +.+ id
例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
parameterType : 传入的参数类型 long:大Long _long:小long (具体的对应请参见文档)
resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名
-->
<select id="get" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id = #{id}
</select>
</mapper>
4.编写domain,dao层,测试
使用细节
添加时拿到返回的主键
<!--
parameterType:需要传入我们的对象
useGeneratedKeys: 是否需要主键
keyColumn:主键所在的列
keyProperty:对象中的属性(代表主键的那个属性)
-->
<insert id="save" parameterType="cn.itsource.domain.Product"
useGeneratedKeys="true"
keyColumn="id"
keyProperty="id"
>
insert into product (productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)
values (#{productName},#{dir_id},#{salePrice},#{supplier},#{brand},#{cutoff},#{costPrice})
</insert>
查看mybatis运行日志
在使用MyBatis的很多时候,我们需要把日志打印出来,帮助我们进行分析与排错
MyBatis中打印日志使用的是Log4j
log4j.properties(日志文件:)
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.com.lzj=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
com.lzj:一定要根据自己的包名情况进行修改
取别名
内置别名
自定义别名
在mybatis-config.xml中配置
<typeAliases>
<!-- 单个配置:练习 -->
<typeAlias type="cn.itsource.mybatis.a_crud.Dept" alias="Dept" />
<!-- 包的配置:项目,添加了包之后,类名就是别名 -->
<package name="cn.itsource.mybatis.a_crud" />
</typeAliases>
动态sql
批量删除
<!-- delete from product where id in ( ? , ? ) 批量删除:
collection="list":传入的list,相当于map的key,通过list得到传入的整个集合的值;
index="index" :每次循环的索引
item="id" :每次循环的这个值
open="(" :以什么开始
separator=",":分隔符
close=")":以什么结束
-->
<delete id="deleteBatch" parameterType="java.util.List">
delete from product where id
in
<foreach collection="list" index="index" item="id" open="("
separator="," close=")">
#{id}
</foreach>
</delete>
批量插入
<!-- 批量插入:
insert into product(productName,salePrice,costPrice,cutoff,supplier,brand,dir_id)
values (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?)
parameterType:传入参数是:java.util.List的类型的;
对传入的list进行foreach循环:取出值填入插入的values中:
collection="list":这个不能修改,表示传入的一个list类似于一个key是list,得到传入的list集合
index="index":每一次遍历的序号
item="item":每次遍历的这个对象别名,可以修改
separator=",":每遍历一次后的分隔符
-->
<insert id="insertBatch" parameterType="java.util.List">
insert into
product(productName,salePrice,costPrice,cutoff,supplier,brand,dir_id)
values
<foreach collection="list" index="index" item="item"
separator=",">
(#{item.productName},#{item.salePrice},#{item.costPrice},#{item.cutoff},#{item.supplier},#{item.brand},#{item.dir_id})
</foreach>
</insert>