Mybatis
环境:
- JDK1.8
- Mysql5.1
- maven 3.5.5
- eclipse
回顾:
- JDBC
- Mysql
- Java基础
- maven
简介
1.1 什么是Mybatis?
- MyBatis 是一款优秀的持久层框架
- 它支持自定义 SQL、存储过程以及高级映射。
- MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
- MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
- 2013年11月迁移到Github。
如何获得MyBatis?
-
maven仓库
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency>
-
Github
-
Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
-
GitHub : https://github.com/mybatis/mybatis-3
1.2 持久化
数据持久化
持久化是将程序数据在持久状态和瞬时状态间转换的机制
- 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
- JDBC就是一种持久化机制。文件IO也是一种持久化机制。
- 在生活中 : 将鲜肉冷藏,吃的时候再解冻的方法也是。将水果做成罐头的方法也是。
为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
-
有一些对象,不能让他丢失。
-
内存断电后数据会丢失**(断电即失瞬时状态)**。
-
内存过于昂贵,而且维持成本也高,至少需要一直供电吧。
1.3 持久层
什么是持久层?
Dao层 Service层 Controller层…
- 完成持久化工作的代码块 。
- 层界限十分明显。
1. 4 为什么要用Mybatis?
-
帮助程序员讲数据存入到数据库中
-
方便
-
传统JDBC代码太过于复杂。简化。框架。自动化。
-
容易上手
-
优点
-
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
-
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
-
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
-
电商项目迭代--------Mybatis
思路流程:搭建环境–>导入Mybatis—>编写代码—>测试
- 搭建环境:在Mysql数据库中已经完成对表的创建以及插入了一些测试数据。
- 导入Mybatis,直接把jar包拖入lib目录
(特别注意,此处也要导log4j入包,并完成log4j.properties相关配置,方便做测试)
log4j.properties相关配置
#log level: off fatal error warn info debug all
log4j.rootCategory=debug,con
#log to console
log4j.appender.con=org.apache.log4j.ConsoleAppender
log4j.appender.con.layout=org.apache.log4j.PatternLayout
log4j.appender.con.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c:%L %m%n
#log to file
#log4j.appender.proj=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.proj.File=c:/temp/proj.log
#log4j.appender.proj.layout=org.apache.log4j.PatternLayout
#log4j.appender.proj.layout.ConversionPattern=%d-[TS] %p %t %c:%L - %m%n
-
编写MyBatis核心配置文件 mybatis-cfg.xml (名字随意名命名)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Configuration 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="dev">
<environment id="dev">
<!-- 事务的管理方式:JDBC(程序自己管理,tomcat下只能使用JDBC),MANAGED(托管,交给服务器管理,支持托管的服务器有jboss/weblogic等) -->
<transactionManager type="JDBC" />
<!-- 数据库连接获取方式:POOLED(连接池中获取)、UNPOOLED(每做一次crud操作,都新建一个连接)、JNDI(从JNDI数据源获取) -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/eshop?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/lanqiao/eshop/mapper/YhbMapper.xml"/>
</mappers>
</configuration>
- 编写Mapper.xml配置文件
- namespace 十分重要,不能写错!
<?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="org.lanqiao.eshop.mapper.YhbMapper">
<insert id="add" parameterType="org.lanqiao.eshop.entity.Yhb">
insert into yhb(yhbh,yhm,pwd,yhnc,yhsf,sex,yhtx,sjh,email,zcsj)
values(#{yhbh},#{yhm},#{pwd},#{yhnc},#{yhsf},#{sex},#{yhtx},#{sjh},#{email},#{zcsj})
</insert>
<delete id="deleteById">
delete from yhb where yhbh = #{yhbh}
</delete>
<update id="update">
update yhb set yhm = 'libai';
</update>
<select id="selectById" resultType="org.lanqiao.eshop.entity.Yhb">
select * from yhb where yhbh = #{yhbh}
</select>
<select id="listAll" resultType="org.lanqiao.eshop.entity.Yhb">
select * from yhb
</select>
</mapper>
-
编写MyBatis工具类
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 MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //获取SqlSession连接 public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } }
6.java代码编写(获取session),进行CRUD操作
package org.lanqiao.eshop.service.impl; import java.io.Serializable; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.lanqiao.eshop.dao.BaseDaoAdapter; import org.lanqiao.eshop.dao.impl.YhbDao; import org.lanqiao.eshop.entity.Pager; import org.lanqiao.eshop.entity.Yhb; import org.lanqiao.eshop.service.IBaseService; import org.lanqiao.eshop.util.DateUtil; import org.lanqiao.eshop.util.MybatisUtils; import org.lanqiao.eshop.util.UUIDUtil; public class YhbService extends BaseDaoAdapter<Yhb> implements IBaseService<Yhb>{ YhbDao yhbDao=new YhbDao(); @Override public boolean add(Yhb obj) { String yhbh=UUIDUtil.getUuid(); String zcsj=DateUtil.getNow(); obj.setYhbh(yhbh); obj.setZcsj(zcsj); SqlSession sqlSession = MybatisUtils.getSession(); //org.lanqiao.eshop.mapper.YhbMapper.add 此处要 .add 来锁定YhbMapper.xml中DMl的id int ret = sqlSession.insert("org.lanqiao.eshop.mapper.YhbMapper.add", obj); sqlSession.commit(); sqlSession.close(); return ret > 0; } }
6.测试结果
对应的数据库,添加成功!