mybatis 框架
这里写目录标题
一、什么是ORM?
称为对象关系映射,O是对象,R是关系,M是映射。
对象可以理解为java中的Bean(PO),关系指存放关系型数据库表中的数据库或结果数据。
java程序与数据库程序是两个独立的进程,它们各种的任务不同,更大的问题在于Java面向对象的数据结构与关系表这种二维结构的数据差异很大,因为数据结构不同,设计的思维就不同,把两者结合在一起会给设计造成麻烦。
如果能够在对象与关系表之间建立一个桥梁,在Java中我们只需要与对象打交道而不与关系型的数据打交道,会让程序设计变的更加简单,数据结构会更加单一,比如我们从表中取出的数据存放在一个结果集中,必须通过遍历把关系型数据转换为集合对象以及集合中的元素对象。设计类似的功能就相当于是设计者在对象与关系数据之间建立了一个桥梁。另外,还需要在代码中书写SQL命令,这样吧SQL语句与Java代码耦合在一起。
现在有了ORM的框架,比如hibernate,mybatis,springdata等,可以避免在对象与关系数据之间做过多的处理工作,因为框架实现了对象与关系数据之间的映射。
ORM的框架工作在数据访问层,也就是DAO(数据访问对象)层,因此,在项目中使用ORM的框架,可以很好地替换掉原来在DAO层所有的一些繁琐的内容。
二、什么是mybatis 框架
原名为ibatis
,是Apache的项目,转手后名称变为mybatis。它属于半ORM的框架,主要原因在于使用该框架用户需要自己来写SQL语句。虽然要写,但是不用写在代码中,而是写在映射配置文件中。
三、如何使用mybatis框架
mybatis工作在DAO层,只要是项目需要操作数据库,都可以使用它。
1、创建一个 Java Maven 项目
添加依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
2、添加模组
3、向项目中添加配置文件
(1)是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>
<!-- 引用外部的属性文件-->
<properties resource="db.properties"></properties>
<!-- 环境组配置,其中可以配置多个使用环境,每个环境对应于一个数据库-->
<environments default="development">
<environment id="development">
<!--指定使用JDBC的事务处理-->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,它是Mybatis自带的连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 映射配置,指定映射文件的路径 -->
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
4、添加日志依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId> //是日志的具体实现
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId> //是一个日志实现标准(不是具体实现)
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId> //slf4j与log4j的桥接包,底层日志使用log4j。这个包是依赖于上面两个包的,所以,可以只用导入这个包,其它两个会自动导入。
<version>1.7.7</version>
</dependency>
可参考博客:
日志框架:slf4j-log4j12
日志组件slf4j介绍及配置详解
5、添加映射文件 Mapper.xml
6、在mapper 中添加satement
<?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">
<!-- namespace是命名空间,本文件中所命名的语句只在本空间中有效,可以解决不同映射文件中同名语句的冲突
,他可以与接口的全限定名 作关联,从而实现Mapper代理的功能 -->
<mapper namespace="test">
<!--向表中添加 记录-->
<insert id="insert" parameterType="mybatis.book.po.Book">
insert into book (bookname,price)values(#{bookname},#{price})
</insert>
<insert id="insert2" parameterType="mybatis.book.po.Book">
insert into book (bookname,price)values(#{bookname},#{price})
<selectKey keyProperty="isbn" keyColumn="isbn" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<update id="update" parameterType="mybatis.book.po.Book">
update book set price=#{price} where isbn=#{isbn}
</update>
<delete id="delete" parameterType="int">
delete from book where isbn=#{value}
</delete>
<select id="findBookByIsbn" parameterType="int" resultType="mybatis.book.po.Book">
select * from book where isbn=#{value}
</select>
<select id="findBookAll" resultType="mybatis.book.po.Book">
select * from book
</select>
<select id="findBookByBookName" parameterType="string" resultType="mybatis.book.po.Book">
select * from book where bookname like '%${value}%'
</select>
</mapper>
7、写测试代码
mybatis对数据库的操作是基于会话对象,名为Session,它从会话工厂对象中得到
public class MybatisDemo {
SqlSessionFactory factory=null;
@Before
public void init(){
//得到主配置文件的流对象
try {
InputStream ris= Resources.getResourceAsStream("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(ris);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testInsert(){
SqlSession session = factory.openSession();
Book book=new Book(123,"java", 38);
session.insert("insert",book);
session.commit();
session.close();
}
@Test
public void testInsert2(){
SqlSession session = factory.openSession();
Book book=new Book(0,"node", 78);
session.insert("insert2",book);
System.out.println(book);
session.commit();
session.close();
}
@Test
public void testUpdate(){
SqlSession session = factory.openSession();
Book book=new Book(7,"Html", 58);
session.update("update",book);
System.out.println(session);
session.commit();
session.close();
}
@Test
public void testDelete(){
SqlSession session = factory.openSession();
session.delete("delete",11);
System.out.println(session);
session.commit();
session.close();
}
@Test
public void testSelect(){
SqlSession session = factory.openSession();
Book book=session.selectOne("findBookByIsbn",8);
System.out.println(book);
// session.commit();
session.close();
}
@Test
public void testSelectAll(){
SqlSession session = factory.openSession();
List<Book> books = session.selectList("findBookAll", null);
System.out.println(books);
// session.commit();
session.close();
}
@Test
public void testSelectByBookName(){
SqlSession session = factory.openSession();
List<Book> books = session.selectList("findBookByBookName", "java");
System.out.println(books);
// session.commit();
session.close();
}
}
8、在 insert 语句中添加获取新生成的主键值的配置
<insert id="insert2" parameterType="mybatis.book.po.Book">
insert into book (bookname,price)values(#{bookname},#{price})
<selectKey keyProperty="isbn" keyColumn="isbn" order="AFTER" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
9、在select 语句中进行模糊查询
<select id="findBookByBookName" parameterType="string" resultType="mybatis.book.po.Book">
select * from book where bookname like '%${value}%'
</select>
${ }
和 #{ }
的使用区别。
${ value}
表示一个字符串参数,它可以与其它的 串进行拼接,‘%${value}%’
。
#{ }
它主要用来生成preparestatement 的?
的,另外决定了参数的传递位置及内容。
1、#{ }
是占位符, 会对SQL进行预编译,相当于?
; ${ }
是做SQL拼接, 有SQL注入的隐患 。
2、 #{ }
不需要关注数据类型, MyBatis自动实现数据类型转换; ${ }
必须自己判断数据类型。