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&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&characterEncoding=utf8"></property>