MyBatis之接口編程

通過SqlSession的實例可進行MyBatis的增刪改查操作;

以查詢爲例:

Object obj = sqlSession.selectOne("com.chensan.sys.entity.SysUser1.getById",1);
SysUser1 sysUser1 = (SysUser1)obj;
第一個參數爲映射文件命名空間加上相應元素的id值,第二個參數則爲Object類型,在相應SQL操作的元素上要指定參數類型;執行SQL後,獲取的返回值需要將Object轉換成想要的數據類型;

這種操作的方式潛在的問題:

1.爲確保命名空間唯一,一般用實體類的全路徑名作爲namespace。如果拼寫錯誤,或者無意中被修改,會導致操作無法完成的問題;

2.操作的參數是Object類型,如果傳入的參數和映射文件的parameterType的數據類型不一致,會出現不可預知的錯誤;

3.返回值使用了泛型,須確保用於接收返回值的變量 類型與映射文件中屬性resultType指定的類型一致;

用戶表sys_user7:

CREATE TABLE `sys_user7` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `salary` decimal(8,2) DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;
INSERT INTO `sys_user7` VALUES(1, '陳三', '1992-02-29', 123456.78, '深圳市南山區');
INSERT INTO `sys_user7` VALUES(2, '張三', '1990-03-05', 8500, '深圳市寶安區');
INSERT INTO `sys_user7` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田區');
INSERT INTO `sys_user7` VALUES(4, '趙四', '1988-09-15', 8000, '深圳市龍華新區');
用戶類SysUser7:

public class SysUser7 {
	private int id;
	private String userName;
	private Date birthday;
	private Double salary;
	private String address;
	//...省略setter、getter方法
	public String toString(){
		return "SysUser7 [id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "]";
	}
}

接口SysUser7Dao:

public interface SysUser7Dao {
	//新增用戶
	public void insertUser(SysUser7 user);
	
	//刪除用戶
	public void deleteUser(int id);
	
	//修改用戶
	public void updateUser(SysUser7 user);
	
	//查詢單個用戶
	public SysUser7 getUserById(int id);
	
	//根據用戶姓名查詢單個用戶
	public List<SysUser7> getUserByName(String userName);
	
	//查詢所有用戶
	public List<SysUser7> getAllUser();
}
映射文件SysUser7.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.chensan.sys.dao.SysUser7Dao">
  <resultMap type="com.chensan.sys.entity.SysUser7" id="sysUser7Map">
    <result property="userName" column="user_name"/>
  </resultMap>

  <!-- 新增用戶 -->
  <insert id="insertUser" parameterType="com.chensan.sys.entity.SysUser7" useGeneratedKeys="true" keyProperty="id">
    insert into `sys_user7`(user_name, birthday, salary, address) 
    values(#{userName}, #{birthday}, #{salary}, #{address})
  </insert>

  <!-- 刪除用戶 -->
  <delete id="deleteUser" parameterType="int">
    delete from `sys_user7` where id=#{id}
  </delete>
  
  <!-- 根據id修改用戶信息 -->
  <update id="updateUser" parameterType="com.chensan.sys.entity.SysUser7">
    update `sys_user7` set user_name=#{userName}, birthday=#{birthday}, 
    salary=#{salary}, address=#{address} 
    where id=#{id}
  </update>
  
  <!-- 根據id查詢單條用戶記錄 -->
  <select id="getUserById" parameterType="int" resultMap="sysUser7Map">
    select * from `sys_user7` where id=#{id}
  </select>
  
  <!-- 根據其它字段查詢用戶列表 -->
  <select id="getUserByName" parameterType="java.lang.String" resultMap="sysUser7Map">
    select * from `sys_user7` where user_name like '%${value}%'
  </select>
  
  <!-- 查詢用戶列表所有用戶 -->
  <select id="getAllUser" parameterType="java.lang.String" resultMap="sysUser7Map">
    select * from `sys_user7`
  </select>
</mapper>

在MyBatis配置文件引入SyUser7的映射文件SysUser7.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>
  <!-- 和spring整合後 environments配置將廢除-->
  <environments default="development">
	<environment id="development">
	  <!-- 使用jdbc事務管理  或者JTA事務管理-->
	  <transactionManager type="JDBC" />
	  <!-- 數據庫連接池  第三方組件:c3p0-->
	  <dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
	  </dataSource>
	</environment>
  </environments>

  <!-- 加載實體類的映射文件 -->
  <mappers>
    <mapper resource="com/chensan/sys/mapper/SysUser7.xml"/>
  </mappers>
</configuration>
測試類:

public class MyBatisSysUser7InterfaceTest {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader resource;
    
    //創建會話工廠
    static{
        try{
        	//讀取MyBatis配置文件
        	resource = Resources.getResourceAsReader("myBatisConfig.xml");
        	//創建SqlSessionFactory會話工廠
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }
    
    //插入一條數據
    public void insert(){
    	SysUser7 user = new SysUser7();
    	user.setUserName("王二");
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	try {
    		user.setBirthday(df.parse("1988-08-23"));
    	} catch (ParseException e) {
    	    e.printStackTrace();
    	}
    	user.setSalary(7800.00);
    	user.setAddress("深圳市羅湖區");
    	
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	sysUser7Dao.insertUser(user);
    	
    	sqlSession.commit();//新增、修改、刪除需要提交
    	sqlSession.close();
    	System.out.println(user);
    }
    
    //刪除一條記錄
    public void delete(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	sysUser7Dao.deleteUser(2);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    //更新用戶記錄
    public void update(){
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	SysUser7 user = new SysUser7();
    	user.setId(4);
    	user.setUserName("趙大光");
    	
    	sysUser7Dao.updateUser(user);
    	sqlSession.commit();
    	sqlSession.close();
    	System.out.println(user);
    }
    
    public void getById(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	SysUser7 user = sysUser7Dao.getUserById(5);
    	System.out.println(user);
    	sqlSession.close();
    }
    
    //根據其它字段查詢記錄
    public void getByName(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	List<SysUser7> users = sysUser7Dao.getUserByName("三");
    	for(SysUser7 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    //查詢所有用戶記錄
    public void getAll(){
    	//開啓會話實例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser7Dao sysUser7Dao = sqlSession.getMapper(SysUser7Dao.class);
    	List<SysUser7> users = sysUser7Dao.getAllUser();
    	for(SysUser7 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public static void main(String[] args) {
    	MyBatisSysUser7InterfaceTest myBatisSysUser7InterfaceTest = new MyBatisSysUser7InterfaceTest();
    	//myBatisSysUser7InterfaceTest.insert();
    	//myBatisSysUser7InterfaceTest.delete();
    	//myBatisSysUser7InterfaceTest.update();
    	//myBatisSysUser7InterfaceTest.getById();
    	//myBatisSysUser7InterfaceTest.getByName();
    	myBatisSysUser7InterfaceTest.getAll();
    } 
}

接口方式編程,那麼映射文件如何知道被哪個接口代理了?

答:使用代理接口的全限定名作爲其命名空間(全限定名即接口所在的包名加上接口名稱)。

sqlSession.getMapper(SysUser7Dao.class);實例化接口,接口調用的方法名與namespace下要操作SQL對應元素的id一致即可完成SQL操作;

發佈了102 篇原創文章 · 獲贊 49 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章