mybatis总结

介绍

    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下二级缓存共享,默认不开启。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值