1.Mybatis简介(Mybatis官方网址:http://www.mybatis.org/mybatis-3/zh/)
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github,ibatis和MyBatis区别 2.3.5之前是ibatis之后是MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
Hibernate与MyBatis
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。程序员往往只需要定义好了POJO到数据库表的映射关系,即可提供Hibernate提供的方法完成持久层操作。程序员甚至不需要对SQL的熟练掌握,Hibernate/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
iBATIS的着力点,则在于POJO与SQL之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。相对Hibernate"O/R"而言,iBATIS是一种“Sql Mapping”的ORM实现。
简单例子,快速入门
我用的是idea开发,下面详细介绍每一步
1.首先创建一个web项目,或者就maven项目也行
2.配置mybatis需要的依赖,要使用MyBatis,只需将mybatis -x.x.x.jar文件置于classpath中即可,如果使用maven来构建项目,则需将下面的dependcy代码置于pom.xnl文件中:
<!--mybatis的核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!--配置mysqljar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
3.编写一个jdbc.properties文件配置数据库
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
4.添加mybatis配置文件mybatis.cfg.xml
<?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>
<!-- 是mybatis的核心配置文件 数据库的连接信息(连接池) -->
<properties resource="jdbc.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driverClass}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 映射sql语句的地址-->
<mappers>
<!--映射文件方式一,一个一个的配置xml-->
<mapper resource="mapper/demo01/FoodMapper.xml"/>
<!-- 映射文件方式二,自动扫描包内的Mapper接口与配置文件 -->
<!--<package name="mapper/demo01"/>-->
</mappers>
</configuration>
5.编写一个实体类 对应数据库字段
package cn.et.demo01.model;
public class Food {
private String id;
private String name;
private String price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
6.创建一个接口类
package cn.et.demo01.mapper;
import cn.et.demo01.model.Food;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface FoodMapper {
/**
* 添加
* @param food
* @return
*/
int insertFood(@Param("food") Food food);
/**
* 删除
* @param id
* @return
*/
int deleteFood(@Param("id") String id);
/**
* 修改
* @param food
* @return
*/
int updateFood(@Param("food") Food food);
/**
* 查询所有的
* @return
*/
List<Food> foodList();
/**
* 根据条件查询
* @param food
* @return
*/
List<Food> selectFood(@Param("food") Food food);
}
7.创建一个写sql语句的xml文件
<?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="cn.et.demo01.mapper.FoodMapper">
<!--重点:-->
<!--使用#{键} 方式 实际上 是使用占位符 ?来 替代 默认情况下可以通过 #{0} #{1} 的方式取值,也可以通过 #{param1} #{param2}来取值-->
<!--使用${键} 方式 实际上 是使用值 直接替换对应的键 注意 如果是字符串 手工添加 ' '-->
<!-- 增加 -->
<insert id="insertFood">
insert into food values(#{food.id},#{food.name},#{food.price})
</insert>
<!--删除-->
<delete id="deleteFood">
delete from food where id=#{id}
</delete>
<!--修改-->
<update id="updateFood">
update food set
<trim suffixOverrides=",">
<if test="food.name !=null and food.name !=''">
name = #{food.name},
</if>
<if test="food.price != null and food.price !=''">
price = #{food.price},
</if>
</trim>
where id=#{food.id}
</update>
<!--查询所有的数据-->
<select id="foodList" resultType="cn.et.demo01.model.Food">
select * from food
</select>
<!-- 根据条件查询 -->
<select id="selectFood" resultType="cn.et.demo01.model.Food">
SELECT * FROM food
<trim prefix="where" prefixOverrides="and">
<if test="food.name !=null and food.name !=''">
and name LIKE concat('%','${food.name}','%')
</if>
<if test="food.price != null and food.price !=''">
and price LIKE concat('%','${food.price}','%')
</if>
</trim>
</select>
</mapper>
8.写一个工具类
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获取。而SqlSessionFactoryBuilder则可以从核心配置文件或者预先定制的Configuration的实例构建出该实例。这里则演示通过配置文件获取。
package cn.et.tools;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class DBTools {
//封装一个工厂类
public static SqlSession getSession() throws IOException {
//读取连接池的
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//session操作的是 指向sql语句的一个唯一标示符
SqlSession session = sqlSessionFactory.openSession();
return session;
}
}
9.写一个测试的类,开始测试
package cn.et.demo01.controller;
import cn.et.demo01.mapper.FoodMapper;
import cn.et.demo01.model.Food;
import cn.et.tools.DBTools;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
public class foodTest {
public static void main(String[] args) throws IOException{
// List<Food> foods = foodList(); //查询所有的数据
// List<Food> foods = selectFood(); //根据条件查询数据
// List<Food> foods = updateFood(); //修改数据
List<Food> foods = insertFood(); //添加数据
for (Food food1 : foods){
System.out.println(food1.getId()+","+food1.getName()+","+food1.getPrice());
}
}
/**
* 添加
* @return
* @throws IOException
*/
public static List insertFood() throws IOException {
SqlSession sqlSession = DBTools.getSession();
FoodMapper mapper = sqlSession.getMapper(FoodMapper.class);
Food food = new Food();
food.setId(String.valueOf(UUID.randomUUID()));
food.setName("7");
food.setPrice("7");
mapper.insertFood(food);
sqlSession.commit();
List<Food> foods = foodList();
return foods;
}
/**
* 删除
* @return
* @throws IOException
*/
public static List deleteFood() throws IOException{
SqlSession sqlSession = DBTools.getSession();
FoodMapper mapper = sqlSession.getMapper(FoodMapper.class);
mapper.deleteFood("7");
sqlSession.commit();
List<Food> foods = foodList();
return foods;
}
/**
* 修改
* @return
* @throws IOException
*/
public static List updateFood() throws IOException{
SqlSession sqlSession = DBTools.getSession();
FoodMapper mapper = sqlSession.getMapper(FoodMapper.class);
Food food = new Food();
food.setId("1");
food.setName("11");
food.setPrice("11");
mapper.updateFood(food);
sqlSession.commit();
List<Food> list = mapper.foodList();
return list;
}
/**
* 查询所有数据
* @return
* @throws IOException
*/
public static List<Food> foodList() throws IOException {
FoodMapper mapper =DBTools.getSession().getMapper(FoodMapper.class);
List<Food> list = mapper.foodList();
return list;
}
/**
* 根据条件查询
* @return
* @throws IOException
*/
public static List<Food> selectFood() throws IOException {
FoodMapper mapper =DBTools.getSession().getMapper(FoodMapper.class);
Food food =new Food();
food.setPrice("4");
List<Food> list = mapper.selectFood(food);
return list;
}
}
注意:如果给xml文件放在java目录下,没有放在resources目录下,一定要在pom.xml中添加一个配置文件,因为idea不会扫码java目录下的xml文件,我是过来人,希望大伙们别踩这个坑了。
运行效果如下:
用mybatis实现的一个简单例子ok。。。。