MyBatis环境搭建
概述简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
Mybatis;和数据库进行交互,持久化层框架(SQL映射框架)
- 从原始的jdbc-dbutils(QueryRunner)--jdbcTemplate----xx;
称工具
- 工具:一些功能的简单封装
- 框架:某个领域的整体解决方法;缓存,考虑异常处理问题,考虑部分字段映射问题
原生的JDBC Hibernate Mybatis 的介绍
JDBC:
- 麻烦
- sql语句是硬编码在程序中的【语句固定 修改需要重新编译 启动项目】耦合(数据库层和Java编码耦合)
Hibernate 数据库交互的框架(ORM框架 对象关系映射)(全自动框架)
- 创建好javaBean 【@Table】
- 黑箱操作【sql全部已经定义好了】
- 缺点:自己编写sql代码麻烦【HQL】全映射机制【不能半映射 效率性能降低】
Mybatis 【支持定制sql,而且功能强大,sql也不要硬编码在java文件中(导致维护修改比较麻烦)】
- Mybatis将重要的步骤抽取出来可以人工定制,其他步骤自动化
- 重要步骤都是写在配置文件中(好维护)
- 完全解决数据库的优化问题
- Mybatis底层就是对原生JDBC的一个简单封装
- 即将java编码与sql抽取出来,还不会失去自动化功能,半自动的持久化层框架
导包
一个包默认是就行了 mybatis-3.4.6.jar 还有一些驱动包 日志包
以及日志依赖的log4j.xml
搭建环境
mybatis的实现代码【】
- 配置数据源
- 引入我们自己编写的每一个接口的实现文件
resource:表示从类路径下找资源<?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"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.jdbcUrl}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/project/mapper/MyMapper.xml"/> </mappers> </configuration>
bean对象的代码public class book { public String isbn; public String book_name; public Integer price; }
环境查询信息接口代码public interface MyMapper { public Book getBookByIsbn(String isbn); }
对应接口的实现配置信息 - namespace:名称空间:写接口的全类名,相当于告诉Mybatis这个配置文件是实现哪个接口的
- public Book getBookByIsbn(String isbn);
select 用来定义一个查询操作
id:方法名,相当于这个配置是对于某个方法的实现
resultType:指定方法运行后的返回值类型(查询操作必须指定的)
‘#’{属性名}:代表取出传递过来的某个参数的值<?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="com.project.mapper.MyMapper"> <select id="getBookByIsbn" resultType="com.project.bean.Book"> select * from book where isbn = #{isbn} </select> </mapper>
实现文件mybatis默认是不知道的,需要在全局配置文件中注册
测试代码
根据全局配置文件先创建一个
public class MyService { @Test public void test() { // 1. 根据全局配置文件创建出一个SqlsessionFactory // SqlSessionFactory 是sqlSession工厂 负责创建sqlSession对象 // SqlSession:sql会话(代表和数据库的一次会话) String resource = "mybatisConf.xml"; InputStream inputStream = null; SqlSessionFactory sqlSessionFactory = null; SqlSession openSession = null; MyMapper myMapper = null; Book book = null; try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 2.获取和数据库的一次会话:getConnnection() openSession = sqlSessionFactory.openSession(); // 3. 使用sqlsession操作数据库,获取mapper接口的实现 myMapper = openSession.getMapper(MyMapper.class); book = myMapper.getBookByIsbn("ISBN-001"); } catch (IOException e) { e.printStackTrace(); } finally { openSession.close(); } System.out.println(book); } } book [isbn=ISBN-001, book_name=book01, price=100]
SqlSession
SqlSession 的实例不是线程安全的,因此是不能被共享的。
SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的
SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的类,执行对象的方法,可以更安全的进行类型检查操作
所有的相关查询【增删改查】 没有增删改提交 需要提交
sqlSessionFactory.openSession();--> sqlSessionFactory.openSession(true);自动提交
增删改查代码
public class MyService { private InputStream inputStream = null; private SqlSessionFactory sqlSessionFactory = null; @Before public void initFunc() { System.out.println("启动初始化"); String resource = "mybatisConf.xml"; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void insertBookTest() { SqlSession openSession = sqlSessionFactory.openSession(); try { MyMapper myMapper = openSession.getMapper(MyMapper.class); Book book = new Book(); book.setBook_name("java"); book.setIsbn("ISBN-007"); book.setPrice(500); System.out.println(myMapper.insertBook(book)); } finally { openSession.commit(); openSession.close(); } } @Test public void deleteBookTest() { SqlSession openSession = sqlSessionFactory.openSession(); try { MyMapper myMapper = openSession.getMapper(MyMapper.class); System.out.println(myMapper.deleteBookByIsbn("ISBN-007")); } finally { openSession.commit(); openSession.close(); } } @Test public void updateBookTest() { SqlSession openSession = sqlSessionFactory.openSession(); try { MyMapper myMapper = openSession.getMapper(MyMapper.class); Book book = new Book(); book.setBook_name("book003"); book.setIsbn("ISBN-003"); book.setPrice(700); System.out.println(myMapper.updateBook(book)); } finally { openSession.commit(); openSession.close(); } } @Test public void getAllBookTest() { SqlSession openSession = sqlSessionFactory.openSession(); try { MyMapper myMapper = openSession.getMapper(MyMapper.class); List<Book> ls = myMapper.getBookAll(); for (Book book : ls) { System.out.println(book); } } finally { openSession.close(); } } }
配置MyMapper.xml
<mapper namespace="com.project.mapper.MyMapper"> <select id="getBookByIsbn" resultType="com.project.bean.Book"> select * from book where isbn = #{isbn} </select> <select id="getBookAll" resultType="com.project.bean.Book"> select * from book </select> <insert id="insertBook" parameterType="com.project.bean.Book"> insert into book(book_name,price,isbn) values(#{book_name},#{price},#{isbn}) </insert> <!-- 增删改不用写返回值类型,增删改是返回影响多少行 mybatis自动判断,如果是数字(int long) 如果是boolean(影响0行自动封装 false 否则true) #{属性名},从传入的参数对象中取出对应属性的值 --> <update id="updateBook" parameterType="com.project.bean.Book"> update book set book_name = #{book_name} , price = #{price} where isbn = #{isbn} </update> <delete id="deleteBookByIsbn" parameterType="String"> delete from book where isbn = #{isbn} </delete> </mapper>
可以更加详细的匹配