- 定义
开源的持久层框架,底层仍然是jdbc
jdbc 优点:速度最快 缺点:繁琐
hibernate 优点:不用写sql,代码简洁
缺点:速度慢,需要优化繁杂的sql
mybatis 优点:代码简洁,易掌握 性能速中 需要写sql
- 步骤
step1.导包。 mybatis,ojdbc
step2 添加配置文件
step3 实体类
注: 属性必须和表中字段一致,不一致需要额外配置
step4 添加映射文件
主要是sql语句
step5 调用mybatis提供的api访问数据库
注:SqlSession提供的方法
基本原理
查询时
- 返回map类型的结果
mybatis会将查询结果分两步处理:
step1. 将记录中的数据添加到一个对应的Map对象里面
(以字段名作为key,以字段值作为value)。
step2. 再将Map对象中的数据添加到对应的实体对象里面。
解决字段名与实体类属性名不一致的情况
方式一 使用别名,比如
SELECT id empId,name ename……
方式二 使用resultMap。
<!-- 解决实体类和数据库表的字段的名称不一致的情况 -->
<select id = "findAll2" resultMap="bookResultMap">
SELECT * FROM books
</select>
<!-- 对实体类和表的字段不一致的进行设置,字段一致的不需要设置 -->
<resultMap type = "entity.Book" id = "bookResultMap">
<result property = "bId" column="id"/>
</resultMap>
Mapper映射器
定义: 符合映射文件要求的接口
要求如下
方法名要与 sqlId 一致
方法的返回值要与resultType一致
方法的参数类型要与parameterType一致。
映射文件的namespace必须等于接口的完整的名字
注 mybatis会生成符合该接口(mapper映射器)要求的对象。
如何使用mapper映射器?
step1.按照要求写好接口。
step2.调用SqlSession提供的getMapper方法来获得接口实现。
测试代码
public class Test1 {
private SqlSession session;
@Before
public void init() {
String config = "SqlMapConfig.xml";
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(Test.class.getClassLoader().getResourceAsStream(config));
session = ssf.openSession();
}
@Test
public void t8() {
BookDao dao = session.getMapper(BookDao.class);
Book b = new Book();
b.setbId(12);
b.setName("葵花宝典");
b.setNum(50);
b.setInfor("欲练此功,必先自宫");
dao.updateById(b);
session.commit();
session.close();
}
定义的Mapper接口
public interface BookDao {
/**
* 增,删,改,查
*/
public List<Book> findAll2();
public void save(Book b);
public void deleteByName(String name);
public void updateById(Book b);
}
mybatis配置文件 (sqlMapconfig.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</dataSource>
</environment>
</environments>
<!-- 指定映射文件的位置 -->
<mappers>
<mapper resource="entity/BookMapper.xml" />
</mappers>
</configuration>
配置文件中(bookMapper.xml)
<mapper namespace="dao.BookDao">
<select id = "findAll" resultType = "entity.Book">
SELECT * FROM books
</select>
<!-- 解决实体类和数据库表的字段的名称不一致的情况 -->
<select id = "findAll2" resultMap="bookResultMap">
SELECT * FROM books
</select>
<!-- 对实体类和表的字段不一致的进行设置,字段一致的不需要设置 -->
<resultMap type = "entity.Book" id = "bookResultMap">
<result property = "bId" column="id"/>
</resultMap>
<!-- 增加 -->
<insert id = "save" parameterType ="entity.Book">
INSERT INTO books(id,name,num,infor) VALUES(book_seq.nextval,#{name},#{num},#{infor})
</insert>
<delete id = "deleteByName" parameterType="string">
DELETE FROM books WHERE name = #{n}
</delete>
<update id = "updateById" parameterType="entity.Book">
UPDATE books SET name = #{name},num = #{num},infor=#{infor}
WHERE id = #{bId}
</update>
</mapper>
总结: 在 sqlMapconfig.xml 指定 bookMapper.xml文件的位置。
在调用 SqlSession 提供的api进行相应的数据库操作
一般情况下,一张表,对应一个实体类,并为这个实体类配置一个xxx.xml文件。