Unit07: MyBatis框架简介 MyBatis基本应用
Posted 唐胜伟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unit07: MyBatis框架简介 MyBatis基本应用相关的知识,希望对你有一定的参考价值。
Unit07: MyBatis框架简介 、 MyBatis基本应用
1. myBatis
(1)myBatis是什么?
是一个开源的持久层框架。
注:myBatis底层仍然是jdbc。
(2)编程步骤
step1. 导包。
mybatis,ojdbc,junit。
step2. 添加配置文件。
注:配置文件主要包含连接池的配置和映射文件的位置。
step3. 写实体类。
注:属性名必须跟表的字段名一样(大小写不区分)。
step4. 写映射文件。
注:映射文件主要包含的是sql语句。
step5. 使用SqlSession提供的方法来访问数据库。
(3)基本原理
(4)返回Map类型的结果
myBatis会将查询到的记录放到一个Map对象里面(会以字段名为key, 字段值作为value),然后再将Map对象里面的数据放到实体对象里面。
(5)解决表的字段名与实体类的属性名不一致的情况
方式一:使用别名来解决。
方式二: 使用ResultMap来解决。
(6)Mapper映射器
Mapper映射器是什么?
是符合映射文件要求的接口。
注:myBatis会依据该接口的要求生成一个相应的实例。
具体要求:
a. 方法的名称必须与sql的id一样。
b. 方法的返回值类型必须与sql的resultType一样。
c. 方法的参数类型必须怀sql的parameterType一样。
d. 映射文件的namespace必须等于该接口的完整的名称。
如何使用?
step1. 先按照映射文件要求写好相应的接口,比如EmployeDAO。
step2. 调用SqlSession的方法获得符合映射器要求的对象。
代码示例:
src/main/java
dao (Mapper映射器的接口类)
package dao; import java.util.List; import java.util.Map; import entity.Employee; import entity.Employee2; /** * Mapper映射器 * */ public interface EmployeeDAO { public void save(Employee e); public List<Employee> findAll(); public Employee findById(int id); public void modify(Employee e); public void delete(int id); public Map findById2(int id); public Employee2 findById3(int id); }
entity
Employee2.java类,测试表里字段名,和数据库中的字段名不一致时情况。
package entity; public class Employee { private Integer id; private String name; private Integer age; @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", age=" + 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
package entity; public class Employee2 { private Integer empNo; private String ename; private Integer age; @Override public String toString() { return "Employee2 [empNo=" + empNo + ", ename=" + ename + ", age=" + age + "]"; } public void setEmpNo(Integer empNo) { this.empNo = empNo; } public void setEname(String ename) { this.ename = ename; } public void setAge(Integer age) { this.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="dao.EmployeeDAO"> <!-- id:要求唯一 parameterType:参数类型,要写类的完整的名称。 --> <insert id="save" parameterType="entity.Employee"> INSERT INTO emp_czh VALUES(emp_czh_seq.nextval,#{name},#{age}) </insert> <!-- resultType:返回类型,要写类的完整的名称。 --> <select id="findAll" resultType="entity.Employee"> SELECT * FROM emp_czh </select> <select id="findById" parameterType="int" resultType="entity.Employee"> SELECT * FROM emp_czh WHERE id = #{id1} </select> <update id="modify" parameterType="entity.Employee"> UPDATE emp_czh SET name = #{name}, age = #{age} WHERE id = #{id} </update> <delete id="delete" parameterType="int"> DELETE FROM emp_czh WHERE id = #{id1} </delete> <!-- 返回Map类型的结果 --> <!-- map是java.util.Map的简写形式 --> <select id="findById2" parameterType="int" resultType="map"> SELECT * FROM emp_czh WHERE id = #{id1} </select> <!-- resultMap告诉mybatis表的字段名 与实体类的属性名的对应关系。 (如果表的字段名与属性名相同,则不用写了) --> <resultMap type="entity.Employee2" id="empResultMap"> <result property="empNo" column="id"/> <result property="ename" column="name"/> </resultMap> <select id="findById3" parameterType="int" resultMap="empResultMap"> SELECT * FROM emp_czh WHERE id = #{id1} </select> </mapper>
src/main/resources
<?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" /> <!-- mybatis自带的连接池 --> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192.168.201.227:1521:orcl" /> <property name="username" value="openlab" /> <property name="password" value="open123" /> </dataSource> </environment> </environments> <!-- 告诉mybatis,映射文件的位置 --> <mappers> <mapper resource="entity/EmpMapper.xml" /> </mappers> </configuration>
src/test/java
test
TestCase2.java测试使用映射器的情况。
package test; import java.util.List; import java.util.Map; 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.Employee; import entity.Employee2; public class TestCase { private SqlSession session; @Before //执行测试方法(比如test1方法)之前, //@Before方法会先执行。 public void init(){ /* * 先要获得SqlSession,然后再调用 * SqlSession提供的方法来访问数据库。 */ //step1. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); //step2. 创建SqlSessionFactory对象 SqlSessionFactory ssf = ssfb.build( TestCase.class.getClassLoader() .getResourceAsStream("SqlMapConfig.xml")); //step3. 创建SqlSession对象 session = ssf.openSession(); } @Test public void test1(){ //step4. 调用SqlSession提供的方法访问数据库 Employee e = new Employee(); e.setName("Tom"); e.setAge(22); session.insert("test.save", e); //step5. 提交事务 //session.commit(); //step6.关闭session session.close(); } @Test public void test2(){ List<Employee> employees = session.selectList("test.findAll"); System.out.println(employees); session.close(); } @Test public void test3(){ Employee e = session.selectOne( "test.findById", 5); System.out.println(e); session.close(); } @Test public void test4(){ Employee e = session.selectOne( "test.findById", 5); e.setAge(e.getAge() + 20); session.update("test.modify", e); session.commit(); session.close(); } @Test public void test5(){ session.delete("test.delete", 5); session.commit(); session.close(); } @Test //测试 返回Map类型的结果 public void test6(){ Map data = session.selectOne( "test.findById2", 6); /* * oracle数据库中,表的字段名都是大写的。 */ System.out.println(data.get("NAME")); session.close(); } @Test //测试 解决实体类属性与表的字段名不一致的情况 public void test7(){ Employee2 e = session.selectOne( "test.findById3",6); System.out.println(e); session.close(); } }
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 dao.EmployeeDAO; import entity.Employee; public class TestCase2 { private SqlSession session; @Before //执行测试方法(比如test1方法)之前, //@Before方法会先执行。 public void init(){ /* * 先要获得SqlSession,然后再调用 * SqlSession提供的方法来访问数据库。 */ //step1. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); //step2. 创建SqlSessionFactory对象 SqlSessionFactory ssf = ssfb.build( TestCase.class.getClassLoader() .getResourceAsStream("SqlMapConfig.xml")); //step3. 创建SqlSession对象 session = ssf.openSession(); } @Test public void test1(){ //获得符合映射器(接口)要求的对象 EmployeeDAO dao = session.getMapper( EmployeeDAO.class); Employee e = new Employee(); e.setName("Eric"); e.setAge(23); dao.save(e); //仍然需要提交事务 session.commit(); session.close(); } @Test public void test2(){ EmployeeDAO dao = session.getMapper( EmployeeDAO.class); List<Employee> employees = dao.findAll(); System.out.println(employees); session.close(); } @Test public void test3(){ EmployeeDAO dao = session.getMapper(EmployeeDAO.class); Employee e = dao.findById(6); System.out.println(e); session.close(); } }
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.4.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
以上是关于Unit07: MyBatis框架简介 MyBatis基本应用的主要内容,如果未能解决你的问题,请参考以下文章