1. Mybatis是什么;(了解)
2. Mybatis简单认识;(了解)
3. Mybatis crud;(掌握)
4. Mybatis crud-工具类(掌握)
5. Mybatis使用细节(掌握)
6. Mybatis批量操作(掌握)
7. MyBatis动态SQL(掌握)
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:配置(xml的一个根)-->
<configuration>
<!--引入jdbc.properties配置-->
<properties resource="jdbc.properties"/>
<!--自定义别名-->
<typeAliases>
<!-- type:类型 alias:别名-->
<!--<typeAlias type="cn.itsource.domain.Product" alias="Product" />-->
<!--为这个包下面的所有类取别名(就是类名)-->
<!-- <typeAlias type="cn.itsource.domain.Product" alias="product"/>-->
<package name="cn.itsource.domain"/>
<package name="cn.itsource.query"/>
</typeAliases>
<!--环境,有多个环境-->
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mybatis" />
<property name="username" value="root" />
<property name="password" value="19970324" />
</dataSource>
</environment>
</environments>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mappers>
<!--引入(找到)写SQL的XML-->
<mapper resource="cn/itsource/dao/ProductMapper.xml"/>
<mapper resource="cn/itsource/dao/EmployeeMapper.xml"/>
</mappers>
</configuration>
jdbc配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=*******
Mybatis crud;(掌握)
package cn.itsource.dao.impl;
import cn.itsource.dao.IProductDao;
import cn.itsource.domain.Product;
import cn.itsource.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class ProductDaoImpl implements IProductDao {
private final String NAMESPACE = "cn.itsource.dao.ProductMapper.";
@Override
public void save(Product product) {
SqlSession session =null;
//获取session
try {
session= MyBatisUtil.openSession();
//调用添加方法
session.insert(NAMESPACE+"save",product);
//提交事务
session.commit();
} catch (Exception e) {
//回滚事务
session.rollback();
e.printStackTrace();
} finally {
//关闭
session.close();
}
}
@Override
public void update(Product product) {
SqlSession session =null;
//获取session
try {
session= MyBatisUtil.openSession();
//调用添加方法
session.update(NAMESPACE+"update",product);
//提交事务
session.commit();
} catch (Exception e) {
//回滚事务
session.rollback();
e.printStackTrace();
} finally {
//关闭
session.close();
}
}
@Override
public void delete(Long id) {
SqlSession session =null;
try {
session=MyBatisUtil.openSession();
session.delete(NAMESPACE+"delete",id);
session.commit();
} catch (Exception e) {
//事务回滚
session.rollback();
e.printStackTrace();
} finally {
//关闭事务
session.close();
}
}
@Override
public Product getOne(Long id) {
SqlSession session =null;
try {
session =MyBatisUtil.openSession();
return session.selectOne(NAMESPACE+"getOne",id);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
@Override
public List<Product> getAll() {
SqlSession session = null;
try {
session = MyBatisUtil.openSession();
return session.selectList(NAMESPACE+"getAll");
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
}
Mybatis crud-工具类(掌握)
//mybatis工具类
public class MyBatisUtil {
//定义一个SqlSessionFactory对象
private static SqlSessionFactory factory =null;
/**
* SqlSessionFactoryBuilder:唯一的作用就是创建SqlSessionFactory
* 一旦用完就可以把它把抛弃了
* 1.类加载的时候就会执行
* 2.只会执行一次
*/
//静态代码块,
static {
try {
factory= new SqlSessionFactoryBuilder().build(
Resources.getResourceAsReader("mybatis-config.xml")
);
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession openSession(){
return factory.openSession();
}
}
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:根(每个xml都得有,不用管它的含义)
namespace:命名空间(随便取个名称)
-->
<mapper namespace="cn.itsource.dao.ProductMapper">
<!--
根据查询条件获取数据
There is no getter for property named 'id' in 'class java.lang.Long'
#与$的区别:
获取值的区别:
$:拿到的是传过来的对象的某一个属性
#:即可以单独拿对象,可以拿到传过来的对象的属性
对SQL的影响
#是使用预编译的方案(防sql注入,安全性更高,性能也会更强一些)
结论:能用#都使用#(优先使用#)
-->
<select id="queryOne" parameterType="ProductQuery" resultType="product">
select * from product where productName = #{productName}
</select>
<!--
select:代表这是一个查询语句
id:代表这个查询语句的唯一命名
以后你要找到这条SQL: namespace+id
例:cn.itsource.dao.ProductMapper.getOne
parameterType:参数类型
long -> Long _long -> long
resultType:返回的每一条结果的类型
注:返回类型的全限定名
-->
<select id="getOne" parameterType="long" resultType="product">
select * from product where id = #{id}
</select>
<!--resultType:返回的每一条结果的类型-->
<select id="getAll" resultType="product" >
select * from product
</select>
<!--
添加一条数据
useGeneratedKeys:是否要主键
keyColumn="id":在数据库中名称叫id
keyProperty="id":在类中也叫id
主键会放到你传过来的对象中
-->
<insert id="save" parameterType="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>
<!--修改功能-->
<update id="update" parameterType="product">
update product set
productName=#{productName},
dir_id=#{dir_id},
salePrice=#{salePrice},
supplier=#{supplier},
brand=#{brand},
cutoff=#{cutoff},
costPrice=#{costPrice}
where id=#{id}
</update>
<!-- 删除功能 -->
<delete id="delete" parameterType="long">
delete from product where id=#{id}
</delete>
</mapper>
Mybatis批量操作(掌握)
<!--
批量添加
insert into employee (name,age,sex) values
("小小良",45,false),("大二良",45,true)
foreach:循环
collection:遍历的集合
item:每次遍历拿到的对象
separator:分隔符(每个值都使用,隔开)
-->
<insert id="batchSave" parameterType="list">
insert into employee (name,age,sex) values
<foreach collection="list" item="e" separator=",">
(#{e.name},#{e.age},#{e.sex})
</foreach>
</insert>
<!--
批量删除:DELETE FROM employee WHERE id in (?,?,?,...)
传 : List<Long> ids
foreach:循环
collection:遍历的集合
item:每次遍历拿到的对象
separator:分隔符(每个值都使用,隔开)
open:以什么开头
close:以什么结尾
index:遍历的索引
-->
<delete id="batchDelete" parameterType="list">
delete from employee where id in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<!--
动态修改:只修改有值的数据
-->
<update id="dynamicUpdate" parameterType="employee">
update employee
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="sex!=null">
sex=#{sex},
</if>
</set>
where id=#{id}
</update>
MyBatis动态SQL(掌握)
<!--
动态修改:只修改有值的数据
-->
<update id="dynamicUpdate" parameterType="employee">
update employee
<set>
<if test="name!=null">
name=#{name}
</if>
<if test="age!=null">
age=#{age}
</if>
</set>
where id=#{id}
</update>