mybatis-config.xml主配置檔案中, mapper引入的兩種方式:
①通過xml路徑
②通過mapper接口的class路徑
<mappers>
<!--mapper 是表的映射檔案,每張表對應一個mapper檔案
引入方式有2種,第一種:通過xml路徑
第二種:通過mapper接口的路徑引入
-->
<!--
<mapper resource="dao/UserDao.xml"/>
<mapper class="dao.UserDao"/>
-->
<!--可以使用批量掃描的形式,表的配置檔案和dao層中的檔案名字一緻,配置package标簽-->
<package name="dao"></package>
</mappers>
使用mapper代理開發,注意namespace:和 dao中 UserDao 對象一緻;
1,session擷取userdao.class對象
2,加載mapper.xml
3,擷取sql的statement
4,statement把sql執行結果映射到結果集(User類,及java對象)中。
mapper.xml 配置如下;
<?xml version="1.0" encoding="UTF-8"?>
<!-- 該檔案代表的是user類和user表的映射關系,關于user表的sql語句等等寫在這裡 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--使用mapper 代理開發,需要實作UserDao接口-->
<mapper namespace="dao.UserDao">
<!-- #{}代表占位符?,表示mybatis架構會接收輸入的參數并指派到sql語句當中
關于簡單類型(int,String,date。long)可以使用value來代表參數名
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="model.User">
select * from user where id=#{id}
</select>
<!--模糊查詢 like +條件 '% ${比對的内容} %' $是拼接sql -->
<select id="findUserByName" parameterType="java.lang.String" resultType="model.User">
select * from user where name like '%${value}%';
</select>
<!-- ${}代表字元串拼接 -->
<!-- 插入的時候可以使用主鍵回填的政策,LAST_INSERT_ID() -->
</mapper>
impl類開發,這裡雖然使用了dao的實作類,主要為了擷取代理對象,實質仍是動态代理開發:
使用了 session.getMapper( 接口的位元組碼檔案 )來擷取接口的 代理對象 [實作類對象 ];
//擷取代理對象,真正的代理開發沒有實作類,通過擷取代理類對象 完成crud
@Override
public List<User> findUserByName(String name) {
SqlSession session = MybatisUtils.getFactory().openSession();//會話
UserDao daili = session.getMapper(UserDao.class);//擷取userdao接口代理對象----可以擷取接口中的所有方法
/**擷取mapper.xml 通過statement擷取sql語句,把sql 的執行結果映射到
* model.User中
*/
return daili.findUserByName(name);
}
//僅僅是實作類
@Override
public User findUserById(int id) {
SqlSession session = MybatisUtils.getFactory().openSession();
User user = (User) session.selectOne("dao.UserDao.findUserById", id);//注意mapper中的namespace
return user;
}
test測試:
package test;
/**
* @auther SyntacticSugar
* @data 2018/9/7 0007下午 5:28
*/
public class Junittest01 {
@Test
public void test1(){
DaoImpl dao = new DaoImpl();
System.out.println(dao.findUserById(5));
}
@Test
public void test2(){
DaoImpl dao = new DaoImpl();
System.out.println(dao.findUserById(30));
}
@Test
public void test3(){
DaoImpl dao = new DaoImpl();
System.out.println(dao.findUserByName("熊"));
}
// jdbc:mysql://localhost:3306/student?serverTimezone=UTC
}
下面來說下不寫實作類,使用動态代理開發的測試例子;
實作動态代理的條件,開發範式:
(1)面向接口程式設計
(2)1、 Mapper.xml檔案中的 namespace與 mapper接口的類路徑相同。
2、 Mapper接口方法名 和 Mapper.xml中定義的每個sql的 id相同
3、 Mapper接口方法的輸入參數類型和 mapper.xml中定義的每個 sql 的 parameterType 的類型相同
4、 Mapper接口方法的輸出參數類型和 mapper.xml中定義的每個 sql的 resultType 的類型相同
接口定義的特點:
1、 Mapper接口方法名和 Mapper.xml中定義的 statement的 id 相同
2、 Mapper接口方法的輸入參數類型和 mapper.xml中定義的statement的 parameterType的類型相同
3、 Mapper接口方法的輸出參數類型和 mapper.xml中定義的statement的 resultType的類型相同
聲明,使用的JDK8,MYSQL8,mybatis3.5.4 進行測試;
工程的目錄結構如下:

UserMapper.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">
<!--
命名空間,每張表對應一個實體類
啟用了别名,是以 resultType="User"
-->
<!-- 使用動态代理 mapper.xml中 namespace和接口路徑一緻 -->
<mapper namespace="com.baidu.dao.UserMapper">
<!-- 使用resultMap 進行映射 -->
<select id="findUserById" resultMap="UserMap">
select * from tb_user where id = #{id}
</select>
<!-- 使用autoMapping 開啟自動映射,當列名和 pojo中filed名 一緻時候,可以有效映射 -->
<resultMap id="UserMap" type="User" autoMapping="true">
<id property="id" column="id"></id>
</resultMap>
<select id="login" resultType="User">
select * from tb_user where user_name=#{userName} and password=#{password}
</select>
</mapper>
UserMapper接口如下:
package com.baidu.dao;
import com.baidu.domain.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @auther SyntacticSugar
* @data 2018/11/4 0004下午 10:59
*/
public interface UserMapper {
/**
* 根據id查詢使用者
* @param id
* @return
*/
User findUserById(Long id);
//使用動态代理開發 ,當參數為多個時候,使用@Param 注解傳入參數
User login(@Param("userName") String userName, @Param("password") String password);
}
mybatis-config.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>
<!-- 引入jdbc 配置檔案 -->
<properties resource="jdbc.properties"/>
<!-- 開啟駝峰 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 啟用别名 -->
<typeAliases>
<!--<typeAlias type="com.baidu.domain.User" alias="User"></typeAlias>-->
<package name="com.baidu.domain"></package>
<package name="com.baidu.dao"></package>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/baidu/mapper/UserMapper.xml"></mapper>
<mapper resource="com/baidu/mapper/UserDaoMapper.xml"></mapper>
<mapper resource="com/baidu/mapper/commenSql.xml"></mapper>
<!-- 批量掃描包 -->
<package name="com.baidu.mapper"></package>
</mappers>
<!-- Continue going here -->
</configuration>
jdbc.properties如下:使用的連接配接資料庫 jar 版本 8.0.11
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=root
UserMapperTest如下:
/**
* @auther SyntacticSugar
* @data 2018/11/5 0005下午 3:18
*/
public class UserMapperTest {
private UserMapper mapper;
@Before
public void setUp() throws IOException {
// 加載配置檔案
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//建立SqlSessionFactory ,擷取UserMapper接口的代理對象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
mapper = sqlSession.getMapper(UserMapper.class);
}
/**
* findUserById
*/
@Test
public void test01() {
User userById = mapper.findUserById(1L);
System.out.println("userById = " + userById);
}
/**
*login
*/
@Test
public void test03() {
User zhangsan = mapper.login("zhangsan", "123456");
System.out.println(zhangsan);
}
}