mybatis iBatis
(1)mybatis是什么?
开源的持久层框架。
jdbc 代码繁琐 sql 性能好<br/>
hibernate 代码简洁 不用写sql 性能不好<br/>
mybatis 代码较简洁 要写sql 性能可以
(2)使用mybatis
1.导包。 mybatis,ojdbc
2.添加mybatis配置文件。
3.写实体类。
注:实体类的属性名与表的字段表要求一样。大小写不做要求。
4.写映射文件。
注:修改配置文件,指定映射文件的位置。
5.调用SqlSession提供的方法来访问数据库。
(3)基本原理
------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <environments default="environment"> <environment id="environment"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="username" value="scott" /> <property name="password" value="tiger" /> </dataSource> </environment> </environments> <!-- 映射文件的位置 --> <mappers> <mapper resource="entity/EmpMapper.xml" /> </mappers> </configuration>
package entity; public class Emp { private Integer id; private String name; private Double age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getAge() { return age; } public void setAge(Double age) { this.age = age; } @Override public String toString() { return "Emp [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="test"> <insert id="save" parameterType="entity.Emp"> insert into emps values(seq_emps.nextval,#{name},#{age}) </insert> <!-- id:要求唯一。resultType:返回的数据类型。parameterType:参数类型 --> <select id="findAll" resultType="entity.Emp"> select * from emps </select> <select id="findById" parameterType="int" resultType="entity.Emp"> select * from emps where id = #{id1} </select> </mapper>
package test; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import entity.Emp; public class TestCase { private SqlSession session; @Before public void init() { SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml")); session = ssf.openSession(); } @Test public void test1() { Emp emp = new Emp(); emp.setName("Eric"); emp.setAge(new Double(22)); session.insert("test.save",emp); session.commit(); session.close(); } @Test public void test2() { List<Emp> emps = session.selectList("test.findAll"); System.out.println(emps); session.close(); } @Test public void test3() { List<Emp> emps = session.selectList("test.findById",2); System.out.println(emps); session.close(); } }
(4)返回Map类型的结果
(5)实体类的
方法1. select id empId from emps
方法2.使用resultMap
package entity; public class Emp2 { private Integer empId; private String name; private Double age; public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getAge() { return age; } public void setAge(Double age) { this.age = age; } @Override public String toString() { return "Emp2 [empId=" + empId + ", name=" + name + ", age=" + age + "]"; } }
<!-- 使用ResultMap解决表的字段名和实体类属性名不一致的情况 --> <select id="findById3" parameterType="int" resultMap="emp2Map"> select * from emps where id = #{id1} </select> <!-- 处理表的字段名与实体类的属性名的对应关系。 --> <resultMap type="entity.Emp2" id="emp2Map"> <result property="empId" column="id"/> </resultMap>
@Test public void test7() { List<Emp> emps = session.selectList("test.findById3",2); System.out.println(emps); session.close(); }
(1)Mapper映射器
符合映射文件的接口。
注:mybatis会自动实现一个符合该接口要求的对象。
要求:
a.接口方法的名称与映射文件中的sql的id要一致。
b.方法的参数类型要与映射文件中的parameterType一致。
c.方法的返回类型要与映射文件当中的resultType一致。
此外,映射文件的namespace必须等于Mapper映射器的全限定名。
(1)Mapper映射器
符合映射文件的接口。
注:mybatis会自动实现一个符合该接口要求的对象。
要求:
a.接口方法的名称与映射文件中的sql的id要一致。
b.方法的参数类型要与映射文件中的parameterType一致。
c.方法的返回类型要与映射文件当中的resultType一致。
此外,映射文件的namespace必须等于Mapper映射器的全限定名。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"> <configuration> <environments default="environment"> <environment id="environment"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> <property name="username" value="scott" /> <property name="password" value="tiger" /> </dataSource> </environment> </environments> <!-- 映射文件的位置 --> <mappers> <mapper resource="entity/EmpMapper.xml" /> </mappers> </configuration>
package dao; import entity.Emp; /** * Mapper映射器。 * */ public interface EmpDAO { public void save(Emp emp); public Emp findById(int id); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="dao.EmpDAO"> <insert id="save" parameterType="entity.Emp"> insert into emps values(seq_emps.nextval,#{name},#{age}) </insert> <!-- id:要求唯一。resultType:返回的数据类型。parameterType:参数类型 --> <select id="findAll" resultType="entity.Emp"> select * from emps </select> <select id="findById" parameterType="int" resultType="entity.Emp"> select * from emps where id = #{id1} </select> <!-- 使用ResultMap解决表的字段名和实体类属性名不一致的情况 --> <select id="findById3" parameterType="int" resultMap="emp2Map"> select * from emps where id = #{id1} </select> <!-- 处理表的字段名与实体类的属性名的对应关系。 --> <resultMap type="entity.Emp2" id="emp2Map"> <result property="empId" column="id"/> </resultMap> </mapper>
package test; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import dao.EmpDAO; import entity.Emp; public class TestCase { private SqlSession session; @Before public void init() { SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml")); session = ssf.openSession(); } @Test /** * getMapper方法返回一个符合Mapper映射器(EmpDAO)要求的对象。 */ public void test1() { EmpDAO dao = session.getMapper(EmpDAO.class); Emp emp = new Emp(); emp.setName("Johnson"); emp.setAge(new Double(22)); dao.save(emp); session.commit(); session.close(); } @Test public void test2() { EmpDAO dao = session.getMapper(EmpDAO.class); Emp emp = dao.findById(4); System.out.println(emp); } }