Mybatis快速上手

1. 什麼是Mybatis
  • MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。
  • MyBatis封裝了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索;
  • MyBatis使用簡單的XML或註解做配置和定義映射關係將Java的POJOs ( Plain Old Java Objects )映射成數據庫中的記錄。
2. 開發流程
  • 導入MyBatis開發包和數據庫驅動包
  • 在src下添加MyBatis主配置文件SqlMapConfig.xml。①修改連接數據庫的參數;②配置映射文件,路徑是輔配置文件的包名.文件名
  • 在src下創建包並添加輔配置文件。①添加namespace=“” ;②在< mapper>中添加標籤(DDL,DML,TCL等);③觀察sql語句有沒有返回值和參數;④需要一個id
  • 獲取SqlSession對象。①讀取配置文件;②創建SqlSessionFactoryBuilder並加載配置文件;③創建SqlSessionFactory; ④創建SqlSession;⑤執行後面的系列操作
3. 簡單測試案例

在這裏插入圖片描述
Ⅰ 通過SqlMapper.xml定義sql語句
(1)SqlMapConfig.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>
    <!--配置properties-->
    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&amp;characterEncoding=utf8"
  ></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </properties>
    <!--配置環境-->
    <environments default="mysql">
        <!-- 配置mysql的環境-->
        <environment id="mysql">
            <!-- 配置事務 -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置連接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"></property>
                <property name="url" value="${url}"></property>
                <property name="username" value="${username}"></property>
                <property name="password" value="${password}"></property>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 配置輔映射文件的位置,與其聯繫起來-->
    <mappers>
       <!-- 注意:包名的.要換成/ -->
        <mapper resource="com/hqyj/sql/SqlMapper.xml"></mapper>
    </mappers>
</configuration>

(2) user.java

package com.hqyj.entity;

public class User {

	private String cn_user_id;
	private String cn_user_name;
	private String cn_user_password;
	private String cn_user_token;
	private String cn_user_nick;
	public String getCn_user_id() {
		return cn_user_id;
	}
	public void setCn_user_id(String cn_user_id) {
		this.cn_user_id = cn_user_id;
	}
	public String getCn_user_name() {
		return cn_user_name;
	}
	public void setCn_user_name(String cn_user_name) {
		this.cn_user_name = cn_user_name;
	}
	public String getCn_user_password() {
		return cn_user_password;
	}
	public void setCn_user_password(String cn_user_password) {
		this.cn_user_password = cn_user_password;
	}
	public String getCn_user_token() {
		return cn_user_token;
	}
	public void setCn_user_token(String cn_user_token) {
		this.cn_user_token = cn_user_token;
	}
	public String getCn_user_nick() {
		return cn_user_nick;
	}
	public void setCn_user_nick(String cn_user_nick) {
		this.cn_user_nick = cn_user_nick;
	}
	@Override
	public String toString() {
		return "User [cn_user_id=" + cn_user_id + ", cn_user_name=" + cn_user_name + ", cn_user_password="
				+ cn_user_password + ", cn_user_token=" + cn_user_token + ", cn_user_nick=" + cn_user_nick + "]";
	}
}

(3) SqlMapper.xml
映射定義文件,用於定義SQL語句和映射信息

<?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">
<!-- namespace命名空間,作用就是對sql進行分類化管理(sql隔離) -->
<!-- 輔配置文件 -->
<mapper namespace="com.hqyj.dao.UserDao">
	<select id="findAll" resultType="com.hqyj.entity.User">
	     select * from cn_user; <!-- 注意:加不加分號都可以 -->
	</select> 
	
	<select id="findByName" resultType="com.hqyj.entity.User" parameterType="string">
	     select * from cn_user where cn_user_name=#{cn_user_name} <!-- 注意:只有一個參數時,#{}內的內容可以隨便寫 -->
	</select>
	
	<!-- 由於是插入了所有信息,參數類型可以直接用對象即可,但是values值必須與對象的屬性相同,不能隨便寫 -->
	<insert id="save" parameterType="com.hqyj.entity.User">
	     insert into cn_user(cn_user_id,cn_user_name,cn_user_password,cn_user_token,cn_user_nick) 
	     values(#{cn_user_id},#{cn_user_name},#{cn_user_password},#{cn_user_token},#{cn_user_nick})
	</insert>
	
	<delete id="delete" parameterType="string">
       delete from cn_user where cn_user_name = #{user_name}
   </delete>
   
   <update id="update" parameterType="com.hqyj.entity.User">
       update cn_user set cn_user_nick = #{cn_user_nick} where cn_user_name = #{cn_user_name}
   </update>
</mapper>

(4)TestMybatis.java (測試類)

package com.hqyj.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List;
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 org.junit.Test;
import com.hqyj.dao.UserDao;
import com.hqyj.entity.User;

public class TestMybatis {
  
	@Test //查詢所有信息
	public void test01() throws IOException{
		//讀取主配置文件,爲了連接數據庫
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		//創建SqlSessionFactoryBuilder對象.可以加載主配置文件
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		//獲取的session可以執行SQL語句
		SqlSession session=ssf.openSession();
		
		List<User> users=session.selectList("findAll");
		for(int i=0;i<users.size();i++){
			System.out.println(users.get(i).getCn_user_name());
		}
	}
	
	@Test  //按名字查找
	public void test02() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=session.selectOne("findByName","demo");
		System.out.println(user.getCn_user_id());
		
	}
	
	@Test  //增加新用戶
	public void test03() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=new User();
		user.setCn_user_id("122");
		user.setCn_user_name("xxx");
		user.setCn_user_password("123456");
		user.setCn_user_token("df");
		user.setCn_user_nick("ming");
		session.insert("save",user);
		//提交事務,必須放在最後。即當執行DML時,需要完成提交(delete、insert、update)
		session.commit();
	}
	
	@Test  //刪除用戶
	public void test04() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		session.delete("delete","demo");
		session.commit();
	}
	
	@Test  //修改用戶
	public void test05() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
		
		User user=session.selectOne("findByName","xxx");
		user.setCn_user_nick("xin");
		session.update("update",user);
		session.commit();
	}
}

Ⅱ 升級:使用Mapper映射器(重點)
Mapper映射器是開發者創建綁定映射語句的接口,映射器接口的實例可以從SqlSession中獲得。該接口中的函數與SqlMapper.xml中的相對應。
Mapper接口映射規則——重要
(1)id屬性作爲接口的方法名
(2)resultType類型爲方法的返回值類型
(3)ParameterType爲方法的參數類型
(4)namespace爲接口路徑:包名.接口名
※ 實例:
(1)SqlMapConfig.xml和User.java與上相同。
(2)UserDao.java——Mapper接口

package com.hqyj.dao;
import java.util.List;
import com.hqyj.entity.User;

public interface UserDao {
	/*
	 * Mapper接口映射規則
	   1.id就是方法名
	   2.resultType就是返回值類型
	   3.ParameterType就是參數
	   4.namespace就是我們的接口路徑:包名.接口名
	*/
	
	public List<User> findAll();
	public User findByName(String name);
	public void save(User user);
	public void delete(String name);
	public void update(User user);
}

(3)TestMybatis.java——測試類

@Test  //按名字查找
	public void test06() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
 		User user=dao.findByName("flora");
 		System.out.println(user);
	}
	
	@Test  //查找所有
	public void test07() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    List<User> users=dao.findAll();
	    for (User user : users) {
	        System.out.println(user);
	    }
	}
	
	@Test  //增加用戶
	public void test08() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=new User();
	    user.setCn_user_id("222");
		user.setCn_user_name("mmm");
		user.setCn_user_password("1234");
		user.setCn_user_token("dff");
		user.setCn_user_nick("mi");
	    dao.save(user);
	    session.commit();
	}
	
	@Test //刪除用戶
	public void test09() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=new User();
	    dao.delete("demo1");
	    session.commit();
	}
	
	@Test  //修改用戶
	public void test10() throws IOException{
		Reader reader =Resources.getResourceAsReader("SqlMapConfig.xml");
		SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
		SqlSessionFactory ssf=ssfb.build(reader);	
		SqlSession session=ssf.openSession();
	 	
	    UserDao dao=session.getMapper(UserDao.class);
	    User user=dao.findByName("pc");
	    user.setCn_user_nick("tian");
	    dao.update(user);
	    session.commit();
	}
4. 問題解決

(1) Error:
Unknown initial character set index ‘255’ received from server. Initial client character set can be forced via the ‘characterEncoding’ property.

  • 可知出錯信息是字符集設置出現問題
  • 原書寫語句:< property name=“url” value=“jdbc:mysql://localhost:3306/cloud_note”></ property>
  • 修改爲下面的語句即可:
<property name="url" value="jdbc:mysql://localhost:3306/cloud_note?useUnicode=true&amp;characterEncoding=utf8"></property>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章