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);
}
}