1.MyBatis是持久化层框架(SQL映射框架)-操作数据库
实质就是将JDBC的一系列操作进行封装,并且将SQL语句部分转换成配置文件(更好的实现了Java文件和数据库操作解耦)
2.用MyBatis实现操作数据库步骤:
1>导包:①mybatis-3.4.1.jar ② mysql-connector-java-5.1.37-bin.jar ③log4j.jar
2>创建全局配置文件:
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/tx"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
3>编写每一个方法如何向数据库发送sql语句,如何执行的配置文件。(本来应该是实现Dao接口的实现类,在此xml配置文件相当于实现Dao接口的接口类)
指定该配置文件实现的是哪个接口,每个方法如何实现
<?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:写接口的全类名,告诉MyBatis该配置文件是实现哪个Dao接口的 -->
<mapper namespace="com.cuco.dao.BookDao">
<!-- select标签:定义一个查询操作 id:相对于配置是对于某个方法的实现 resultType:指定方法运行后的返回值类型 -->
<!-- #{是姓名}表示的是取方法中参数传递过来的值 -->
<select id="getById" resultType="com.cuco.bean.Book">
select * from book where isbn = #{isbn}
</select>
</mapper>
4>上面的针对每个Dao接口的实现类配置文件,MyBatis默认不知道,因此需要在全局配置文件中注册
<!-- 引入自己编写的每一个接口的实现文件 -->
<mappers>
<!-- resource:表示从类路径下找资源 -->
<mapper resource="BookDao.xml"/>
</mappers>
Test测试:
public class MyBatisTest {
@Test
public void test() throws IOException {
//根据全局配置文件创建出一个SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取和数据库的一次会话(相当于getConnection,获取连接)
SqlSession openSession = sqlSessionFactory.openSession();
//使用SqlSession操作数据库
BookDao bookDao = openSession.getMapper(BookDao.class);
Book book = bookDao.getById("ISBN-001");
System.out.println(book);
}
}
①根据全局配置文件创建一个SqlSessionFactory对象
②通过SqlSessionFactory获取sqlSession对象操作数据库
③使用sqlSession对象操作数据库
5>导入dtd约束文件
3.实现一次增删改查操作
<?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">
<!--
public Book getById(String isbn);
public int updateBook(Book book);
public int deleteBook(Book book);
public int insertBook(Book book);
-->
<mapper namespace="com.cuco.dao.BookDao">
<select id="getById" resultType="com.cuco.bean.Book">
select * from book where isbn=#{isbn}
</select>
<update id="updateBook">
update book set book_name=#{book_name},price=#{price}
</update>
<delete id="deleteBook">
delete from book where isbn=#{isbn}
</delete>
<insert id="insertBook">
insert into book(isbn,book_name,price) values(#{isbn},#{book_name},#{price})
</insert>
</mapper>
public class MyBatisTest {
SqlSessionFactory sqlSessionFactory ;
@Before
public void initSqlSessionFactory() throws IOException{
//根据全局配置文件创建出一个SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//测试添加
@Test
public void testInsert() throws IOException {
//获取和数据库的一次会话(相当于getConnection,获取连接)
SqlSession openSession = sqlSessionFactory.openSession(true);
//使用SqlSession操作数据库,获取到Dao接口的实现(映射器)
BookDao bookDao = openSession.getMapper(BookDao.class);
try{
bookDao.insertBook(new Book("ISBN-031","book31",30));
}finally{
openSession.close();
}
}
//测试删除
@Test
public void testDel() throws IOException {
//获取和数据库的一次会话(相当于getConnection,获取连接)
SqlSession openSession = sqlSessionFactory.openSession();
//使用SqlSession操作数据库,获取到Dao接口的实现(映射器)
BookDao bookDao = openSession.getMapper(BookDao.class);
try{
Book book = new Book("ISBN-001","book01",100);
bookDao.deleteBook(book);
}finally{
openSession.commit();
openSession.close();
}
}
//测试查询
@Test
public void test() throws IOException {
//获取和数据库的一次会话(相当于getConnection,获取连接)
SqlSession openSession = sqlSessionFactory.openSession();
//使用SqlSession操作数据库,获取到Dao接口的实现(映射器)
BookDao bookDao = openSession.getMapper(BookDao.class);
try{
Book book = bookDao.getById("ISBN-001");
System.out.println(book);
}finally{
openSession.close();
}
}
}
两个文件:1>全局配置文件:mybatis-config.xml:指导mybatis正确运行的一些全局设置
2>SQL映射文件:BookDao.xml:相当于是实现BookDao接口的实现类
细节:1>获取到的是接口的代理对象;mybatis自动创建
2>SqlSessionFactory只需要创建一次
4.引入外部配置文件
mybatis-config.xml中的标签:
1><properties></properties>:引入外部文件
<configuration>
<!-- 引用外部配置文件
resource:从类路径下开始引用
url:引用磁盘路径或者网络路径的资源
-->
<properties resource="dbconfig.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置连接池 -->
<dataSource type="POOLED">
<!-- 用${}取出配置文件中的值 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入自己编写的每一个接口的实现文件 -->
<mappers>
<!-- resource:表示从类路径下找资源 -->
<mapper resource="BookDao.xml"/>
</mappers>
</configuration>
2><settings></settings>
3><typeAliases></typeAliases>:类型别名:为常用的类型起别名;(但是要注意标签顺序,否则会报错)
<configuration>
<!-- 引用外部配置文件
resource:从类路径下开始引用
Url:引用磁盘路径或者网络路径的资源-->
<properties resource="dbconfig.properties"></properties>
<typeAliases>
<!-- typeAlias:就是为一个javaBean起别名;别名默认就是类名(不缺分大小写),配置文件中就可以使用别名 -->
<!-- <typeAlias type="com.cuco.bean.Book" alias="bo"/> -->
<package name="com.cuco.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置连接池 -->
<dataSource type="POOLED">
<!-- 用${}取出配置文件中的值 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 引入自己编写的每一个接口的实现文件 -->
<mappers>
<!-- resource:表示从类路径下找资源 -->
<mapper resource="BookDao.xml"/>
</mappers>
</configuration>
<mapper namespace="com.cuco.dao.BookDao">
<select id="getById" resultType="bo">
select * from book where isbn=#{isbn}
</select>
<update id="updateBook">
update book set book_name=#{book_name},price=#{price}
</update>
<delete id="deleteBook">
delete from book where isbn=#{isbn}
</delete>
<insert id="insertBook">
insert into book(isbn,book_name,price) values(#{isbn},#{book_name},#{price})
</insert>
</mapper>
4> typeHandler:类型处理器
5>objectFactory
6>plugins插件
7>environments:配置环境:都需要一个事务管理器和一个数据源。但实际上配置数据源和事务管理器都是用Spring 的IOC容器配置
8>databaseIdProvider:用来考虑数据库移植性的
9>mappers:写好的SQL映射文件需要使用该标签进行注册
可以通过<mappers>
<package name="com.cuco.dao"/>
</mappers>实现批量注册(将实现接口的xml文件放在conf源文件下的dao包中)