介绍
mybatis是一个持久层的框架,是一个轻量级的ORM框架;可以自定义sql,增加了sql的灵活性,也方便优化,这也就是和hibernate最大的不同,在3.0版本之前是叫ibatis。
入门
1、导包( com.mysql-5.1.20.jar,mybatis-3.4.6.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>
<typeAliases>
<typeAlias alias="Student" type="com.hsia.mybaits.bean.UserBean" />
<typeAlias alias="Blog" type="com.hsia.mybaits.bean.BlogBean" />
</typeAliases>
<!-- 配置数据源以及数据库初始化参数 -->
<environments default="mybatis">
<environment id="mybatis">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 配置映射资源文件 -->
<mappers>
<!-- <mapper resource="com/hsia/mybaits/test/OperateMapper.xml" /> -->
<mapper resource="com/hsia/mybaits/test/blog.xml" />
</mappers>
</configuration>
3、写一个映射文件,一般以mapper结尾
<?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="Author">
<!-- 配置信息 -->
<select id="selectHello" parameterType="int" resultType="Student">
select * from user where id = #{id}
</select>
</mapper>
4、编写测试类
public class Operate {
public static SqlSession getSqlSession() throws IOException {
// 加载资源配置文件
Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
// 初始化SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 获取SqlSession对象
SqlSession session=sqlSessionFactory.openSession(true);//设置了true就不用commit了
return session;
}
@Test
public void test() throws IOException {
UserBean hello = getConfiguration().selectOne("selectHello",2);
// 获取结果
System.out.println("编号:"+hello.getId());
System.out.println("名字:"+hello.getName());
}
#{}和 ${}的区别
select * from user where name = #{name};
解析后
select * from user where name = ?
//相当于#是一个参数标记符,能防止sql注入
select * from user where name = ${name};
解析后
select * from user where name = "name";
//$会把传入的参数当成一个字符串填充到sql中 ,不能防止sql注入,解析数据库关键字,一般用于传入数据库对象比如表名。
sql的实现方式
1、接口
package org.source.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.hsia.dataSource.bean.ComputerBean;
public interface SqlMapper {
public void addField(@Param("map") Map<String, Object> objectMap) ;
public void addData(@Param("map") Map<String, Object> dataMap);
public List<Object> queryObject();
public void deleteDataDriver(String id);
public void deleteData(String id);
public List<Map<Object, Object>> selectEvery(@Param("ComputerBean")String ComputerBean);
public List<Map<Object,Object>> selectda();
public List<ComputerBean> selectdri();
public void update(@Param("id")String id,@Param("newName")String newName);
public List<Map<Object,Object>> selectdatadriv();
}
2、注解
package com.hsia.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
public interface IAnnotation {//使用注解方式和接口方式调用的时候都是一样的,只要获取该接口的class对象,然后调用要执行的方法
@Insert("insert into user(name, age) values(#{},#{})")
public void add();
@Delete("delete from user where id=#{}")
public void delete();
@Select("select * from data")
public void query();
@Update("update data set name=#{} where id=#{}")
public void update();
}
动态sql
if
<select id="findBlogIfNotNull" resultMap="blogResult">
select * from blog where
<if test="blogName!=null">
blog_name=#{blogName}
</if><!-- if条件语句 -->
</select>
where
<select id="findBlogWhereNotNull" resultMap="blogResult">
select * from blog
<where>
<if test="blogName!=null">
blog_name=#{blogName}
</if>
<if test="title!=null">
and title=#{title}
</if>
</where><!-- 当多个if条件的时候where标签的使用 -->
</select>
foreach
<select id="selectEachBlog" resultType="Post">
select * from t_post where blog_id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
缓存
一级缓存是基于sqlsession级别的默认开启,第一次查询一级缓存中不存在然后就去数据库查找,再把结果保存在sqlsession中,下次再有等同条件就直接去缓存中查询;如果有做更新的话那么sqlsession的缓存就会被清空。
二级缓存是基于namespace的,同一个namespace下二级缓存共享,默认不开启。