MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
mybatis基本应用
1:mybatis.jar和mysql.jar
添加jar包到构建路径中
2:MybatisConfig.xml
要求:会改即可。mybatisConfig.xml:mybatis核心配置文件 定义了数据源与实体映射配置文件(定义sql语句的xml,StuMapper.xml) <?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="d1"> <environment id="d1"> <!-- 配置事务管理,采用JDBC的事物管理 --> <transactionManager type="JDBC"/> <!-- POOLED:mybatis自带的数据源 JNDI:基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/abc2?serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mapper/StuMapper.xml"/> </mappers> </configuration>
3:引入DAO映射xml文件
<?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.mapper.DeptDAO"> <select id="findAll" resultType="com.entity.Dept"> select * from dept </select> </mapper>
4:接口与实体映射文件中定义方法
package com.dao; import java.util.List; import com.entity.Dept; public interface DeptDAO { List<Dept> findAll(); }
5:调用类方法,实现功能。
新建main函数测试: public static void main(String[] args) { SqlSession sqlSession = null; try { //1:将MyBatisConfig.xml加载到流中 InputStream in = Test.class.getResourceAsStream("/MyBatisConfig.xml"); //2:调用方法读取流中的xml文件中定义的数据源封装在SqlSessionFactory类中 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3:调用方法获得Sqlsession对象,封装数据库连接对象 sqlSession = sqlSessionFactory.openSession(); //4:调用方法,获得StuMapper接口的代理对象 StuMapper stuMapper = sqlSession.getMapper(StuMapper.class); List<Stu> list1 = stuMapper.selAll(); Stu stu = stuMapper.selOne(); System.out.println(list1); System.out.println(stu); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); }finally { sqlSession.close(); } }
注意:
1:流中加载MyBatisConfig文件名经常写错,必须放在src根目录 InputStream in = Test.class.getResourceAsStream("/MyBatisConfig.xml");
2:MyBatisConfig.xml忘记加载XXXXDAO.xml或者路径错误 3:DAO.xml要实现接口 <mapper namespace="com.mapper.StuMapper"> 4:DAO.xml文件中的语法错误
返回类型
查询方法: 查询一行数据返回一个实体对象:使用resultType="com.entity.Stu" 查询多行数据返回一个集合:依然使用resultType="com.entity.Stu",来定义集合的泛型 <!-- 查询方法,查询一行,返回实体对象,查询多行,返回集合,需要定义泛型 --> <select id="selAll" resultType="com.entity.Stu"> select * from stu </select> <select id="selOne" resultType="com.entity.Stu"> select * from stu where sid=#{arg0} </select> 增删改的方法: 默认返回全是boolean,可以不用定义返回类型 <update id="updateStuBySid" parameterType="com.entity.Stu"> update stu set sname=#{sname},sbir=#{sbir},ssex=#{ssex},saddress=#{saddress} where sid=#{sid} </update>
参数类型
参数为实体类: parameterType="com.entity.Stu" update stu set sname=#{sname},sbir=#{sbir},ssex=#{ssex},saddress=#{saddress} where sid=#{sid} #{属性名}:从实参中获得该属性值 <update id="updateStuBySid" parameterType="com.entity.Stu"> update stu set sname=#{sname},sbir=#{sbir},ssex=#{ssex},saddress=#{saddress} where sid=#{sid} </update> 参数类型可以不用定义:使用#{arg0}、#{arg1}、#{arg2}的方式给sql语句赋值 #{arg0}:下标为0的实参 <delete id="delStuBySid2"> delete from stu where sid=#{arg0} </delete> <delete id="delStuBySid3"> delete from stu where sname=#{arg1} and saddress=#{arg0} </delete>
mybatis封装
现在:每个方法的代码都是在main函数,要封装起来,在main函数中随时调用。新建一个包:com.service:业务层包,封装具体工具,且提供事务处理(提交、回滚、关闭),新建StuService类,定义多个方法,每个方法中调用StuMapper中的方法,实现功能。问题:service每个方法中的大量代码重复,明天来继续封装。作业 新建项目,完成商品表中带商品类型id信息的增、删、查、改