Mybatis框架(02)

Mybatis框架(02)

1.基于代理Dao实现CRUD操作

使用要求
1、持久层接口和持久层接口的映射配置必须在相同的包下
2、持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定类名
3、SQL语句的配置标签<.select>,<.insert>,<.delete>,<.update>的id属性必须和持久层接口的方法名相同

1.1根据ID查询

在这里插入图片描述

1.1.1在持久层接口中添加findById方法

IUserDao接口文件

/** * 根据id查询
 * @param userId
 * @return
 * */

User findById(Integer userId);

2.1.2 在用户的映射配置文件中配置

2.1.2.1 resultType\parameterType#{}中细节

细节
resultType属性: 用于指定结果集的类型。
parameterType属性:用于指定传入参数的类型。
sql语句中使用#{}字符: 它代表占位符,相当于原来jdbc部分所学的?,都是用于执行语句时替换实际的数据。 具体的数据是由#{}里面的内容决定的。
#{}中内容的写法: 由于数据类型是基本类型,所以此处可以随意写。
IUserDao.xml

    <!-- 根据id查询 -->
    <select id="findById" resultType="com.itheima.domain.User" parameterType="int">
select * from user where id = #{
    
    id}
    </select>

2.1.3 在测试类添加测试

数据库:
在这里插入图片描述

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;

MybastisCRUDTest.java

public class MybastisCRUDTest {
    
    
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IUserDao userDao;

    @Before//在测试方法执行之前执行
    public void init() throws IOException {
    
    
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.创建SqlSession工厂对象
       factory = builder.build(in);
       //4.创建SqlSession对象
        session = factory.openSession();
        //5.创建Dao的代理对象
        userDao = session.getMapper(IUserDao.class);
    }

@Test
public void testFindOne(){
    
    
        //执行操作
    User byId = userDao.findById(48);
    System.out.println(byId);
}

    @After//在测试方法执行完成之后执行
    public void destroy() throws IOException {
    
    
        session.commit();
        session.close();
        in.close();
    }
    
}

结果:
在这里插入图片描述

1.2保存操作

1.2.1 在持久层接口中添加新增方法

/** * 保存用户
 * @param user
 * @return 影响数据库记录的行数 */

int saveUser(User user);

1.2.2 在用户的映射配置文件中配置

1.2.2.1

细节:
parameterType属性: 代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
sql语句中使用#{}字符: 它代表占位符,相当于原来jdbc部分所学的?,都是用于执行语句时替换实际的数据。 具体的数据是由#{}里面的内容决定的。
#{}中内容的写法: 由于我们保存方法的参数是 一个User对象,此处要写User对象中的属性名称。 它用的是ognl表达式。
ognl表达式: 它是apache提供的一种表达式语言,全称是: Object Graphic Navigation Language 对象图导航语言 它是按照一定的语法格式来获取数据的。 语法格式就是使用 #{对象.对象}的方式

#{user.username}它会先去找user对象,然后在user对象中找到username属性,并调用getUsername()方法把值取出来。但是我们在parameterType属性上指定了实体类名称,所以可以省略user.而直接写username。

<insert id="saveUser" parameterType="com.itheima.domain.User">
        insert into user(username,birthday,sex,address)values(#{
    
    username},#{
    
    birthday},#{
    
    sex},#{
    
    address})
    </insert>

1.2.3 添加测试类中的测试方法

@Test
public void testSave(){
    
    
    User user = new User();
    user.setUsername("刘德华");
    user.setAddress("中国大陆");
    user.setBirthday(new Date());
    user.setSex("男");
    System.out.println("保存操作之前"+user);
    //执行保存方法
    userDao.saveUser(user);
    System.out.println("保存操作之后"+user);
}
   @After//在测试方法执行完成之后执行
    public void destroy() throws IOException {
    
    
        session.commit();
        session.close();
        in.close();
    }

结果;
在这里插入图片描述
在这里插入图片描述

1.2.4 问题扩展:新增用户id的返回值

新增用户后,同时还要返回当前新增用户的id值,因为id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长auto_increment的值返回。

    <insert id="saveUser" parameterType="com.itheima.domain.User">
--         配置保存时获取插入的id
        <selectKey keyColumn="id" keyProperty="id" resultType="int">
            select last_insert_id();

        </selectKey>

        insert into user(username,birthday,sex,address)
        values(#{
    
    username},#{
    
    birthday},#{
    
    sex},#{
    
    address})
    </insert>

在这里插入图片描述

1.3 用户更新

1.3.1 在持久层接口中添加更新方法

    /**
     * 更新用户 *
     *
     * @param user *
     * @return 影响数据库记录的行数
     */
    int updateUser(User user);

1.3.2 在用户的映射配置文件中配置

    <!--更新用户-->
    <update id="updateUser" parameterType="com.itheima.domain.User" >
        update user set username=#{
    
    username},address=#{
    
    address},sex=#{
    
    sex},birthday=#{
    
    birthday} where id=#{
    
    id}
    </update>

1.3.3 加入更新的测试方法

@Test
public void testUpdateUser(){
    
    
        //根据id查询
    User user = userDao.findById(52);
    user.setUsername("张柏芝");

    //返回影响行数
    int i = userDao.updateUser(user);
    System.out.println("返回更新影响行数"+i);

}

在这里插入图片描述
在这里插入图片描述

1.4 用户删除

1.4.1在持久层接口中添加删除方法

/** * 根据id删除用户 *
 *  @param userId *
 *  @return */

int deleteUser(Integer userId);
}

1.4.2在用户的映射配置文件中配置

<delete id="deleteUser" parameterType="com.itheima.domain.User">
    delete from user where id=#{
    
    id}
</delete>

1.4.3加入删除的测试方法

@Test
public void testDeleteUser(){
    
    
        //返回删除的影响行数
    int user = userDao.deleteUser(49);
    System.out.println("返回删除的影响行数"+user);
}

在这里插入图片描述

1.5 用户模糊查询

1.5.1 在持久层接口中添加模糊查询方法

/** * 根据名称模糊查询 *
 * @param username *
 * @return */

List<User> findByName(String username);

1.5.2 在用户的映射配置文件中配置

<select id="findByName" resultType="com.itheima.domain.User" parameterType="String" >
    select * from user where username like #{
    
    username}
</select>

1.5.3 加入模糊查询的测试方法

@Test
public void testFindByName(){
    
    
    List<User> users = userDao.findByName("小%");
    for (User user : users) {
    
    
        System.out.println(user);
    }

在这里插入图片描述

若配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以SQL语句显示为“?”。

在这里插入图片描述

1.5.4 模糊查询的另一种配置方式

将原来的#{}占位符,改成了 v a l u e 。 注 意 如 果 用 模 糊 查 询 的 这 种 写 法 , 那 么 {value}。注意如果用模糊查询的这种写法,那么 value{value}的写法就是固定的,不能写成其它名字。

    <select id="findByName" resultType="com.itheima.domain.User" parameterType="String" >
    select * from user where username like '%${value}%'
</select>

在这里插入图片描述
可以发现,在程序代码中就不需要加入模糊查询的匹配符%了,这两种方式的实现效果是一样的,但执行的语句是不一样的。

1.5.5 #{}与${}的区别

在这里插入图片描述

1.5.6 模糊查询的${value}源码分析

TextSqlNode类的源码:
在这里插入图片描述
说明了源码中指定了读取的key的名字就是”value”,所以在绑定参数时就只能叫value的名字了。

1.6 查询使用聚合函数

1.6.1 在持久层接口中添加模糊查询方

    /** * 查询总记录条数 *
     * @return */
    int findTotal();

1.6.2 在用户的映射配置文件中配置

    <!-- 查询总记录条数 -->
    <select id="findTotal" resultType="int">
   select count(*) from user;
  </select>

1.6.3 加入聚合查询的测试方法

 @Test public void testFindTotal() throws Exception {
    
    
        //6.执行操作
        int res = userDao.findTotal();
        System.out.println(res);
    }

在这里插入图片描述

1.7 Mybatis与JDBC编程的比较

  1. 1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
    解决: 在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

  2. Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
    解决: 将Sql语句配置在XXXXmapper.xml文件中与java代码分离

  3. 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数对应。
    解决: Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型

  4. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

  5. 解决: Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

2.Mybatis的参数深入

2.1parameterType配置参数

2.1.1使用说明

上文已介绍SQL语句传参,使用标签的parameterType属性来设定。该属性的取值可以是基本类型,引用类型(例如:String类型),还可以是实体类类型(POJO类)。同时也可以使用实体类的包装类,下面将介绍如何使用实体类的包装类作为参数传递。

2.1.2注意事项

基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String。

实体类类型,目前只能使用全限定类名。

究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。后面将讲解如何注册实体类的别名。
在这里插入图片描述
这些都是支持的默认别名。我们也可以从源码角度来看它们分别都是如何定义出来的。 可以参考TypeAliasRegistery.class的源码。
在这里插入图片描述

2.2 传递pojo包装对象

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数

Pojo类中包含pojo。

需求:根据用户名查询用户信息,查询条件放到QueryVo的user属性中。

2.2.1 编写QueryVo

public class QueryVo {
    
    
    private User user;

    public User getUser() {
    
    
        return user;
    }

    public void setUser(User user) {
    
    
        this.user = user;
    }
}

2.2.2 编写持久层接口

/** * 根据QueryVo中的条件查询用户 *
 * @param vo *
 * @return */

List<User> findByVo(QueryVo vo);

2.2.3 持久层接口的映射文件

 <!-- 根据用户名称模糊查询,参数变成一个QueryVo对象了 -->
    <select id="findByVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo">
        select * from user where username like #{
    
    user.username}
    </select>

2.2.4 测试包装类作为参数

   @Test
    public void testFindByQueryVo(){
    
    
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUsername("%王%");
        vo.setUser(user);
        List<User> users=userDao.findByVo(vo);
        for (User user1 : users) {
    
    
            System.out.println(user1);
        }

    }

在这里插入图片描述

3.Mybatis的输出结果封装

3.1 resultType配置结果类型

resultType属性可以指定结果集的类型,它支持基本类型和实体类类型

在前面的CRUD案例中已经对此属性进行过应用了。

需要注意的是,它和parameterType一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名(后面会讲解如何配置实体类的别名)

同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装

3.1.1 基本类型示例

3.1.1.1 Dao接口

 /** * 查询总记录条数 *
     * @return */
    int findTotal();

3.1.1.2 映射配置

  <!-- 查询总记录条数 -->
    <select id="findTotal" resultType="int">
   select count(*) from user;
  </select>

3.1.2 基本类型示例

3.1.2.1 Dao接口

  /**
     * 查询所有操作
     */
    @Select("select * from user")
    List<User> findAll();

3.1.2.2 映射配置

<!-- 配置查询所有操作 --> 
<select id="findAll" resultType="com.itheima.domain.User"> 
select * from user 
</select>

3.1.3 特殊情况示例

3.1.3.1 修改实体类

(此时的实体类属性和数据库表的列名已经不一致了)
加上get\set\toString

public class User implements Serializable {
    
    

    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;
    public User() {
    
    
    }
    }

在这里插入图片描述

3.1.3.2 Dao接口

   /**
     * 查询所有用户
     */
    List<User> findAll();

3.1.3.3 映射配置

<!-- 配置查询所有操作 -->
 <select id="findAll" resultType="com.itheima.domain.User"> 
 select * from user
  </select>

3.1.3.4 测试查询结果

 @Test public void testFindAll() {
    
    
        List<User> users = userDao.findAll();
        for(User user : users) {
    
    
            System.out.println(user);
        }
    }

在这里插入图片描述

3.1.3.5 修改映射配置

使用别名查询

    <!-- 配置查询所有操作 -->
    <select id="findAll" resultType="com.itheima.domain.User">

 select id as userId,username as userName,birthday as userBirthday,
  sex as userSex,address as userAddress from user
 </select>

在这里插入图片描述

思考: 如果我们的查询很多,都使用别名的话写起来岂不是很麻烦,有没有别的解决办法呢

3.2 resultMap结果类型

resultMap标签可以建立查询的列名实体类的属性名称不一致时建立对应关系。从而实现封装。
在select标签中使用resultMap属性指定引用即可。同时resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

3.2.1 定义resultMap

3.2.1.1 type属性、id属、id标签、result标签、column属性、property属性说明

type属性:指定实体类的全限定类名
id属性:给定一个唯一标识,是给查询select标签引用用的。
id标签:用于指定主键字段
result标签:用于指定非主键字段
column属性:用于指定数据库列名
property属性:用于指定实体类属性名称

 <!--配置 查询结果的列名和实体类的属性名的对应关系-->
    <resultMap id="userMap" type="com.itheima.domain.User">
        <!--主键字段的对应-->
        <id column="id" property="userId"></id>
        <result column="username" property="userName"></result>
        <result column="address" property="userAddress"></result>
        <result column="sex" property="userSex"></result>
        <result column="birthday" property="userBirthday"></result>
    </resultMap>

3.2.2 映射配置

    <!-- 配置查询所有操作 -->
    <select id="findAll" resultMap="userMap">
    select * from user
    </select>

3.2.3 测试结果

   @Test public void testFindAll() {
    
    
        List<User> users = userDao.findAll();
        for(User user : users) {
    
    
            System.out.println(user);
        }
    }

在这里插入图片描述

4.Mybatis传统DAO层开发[了解]

使用Mybatis开发Dao,通常有两个方法,
(1)即原始Dao开发方式和Mapper接口代理开发方式。
(2)而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。下文主要以接口代理开发方式为主。

4.1 Mybatis实现DAO的传统开发方式

在这里插入图片描述

4.1.1 持久层Dao接口

/**
 * 用户的持久层接口
 */
public interface IUserDao {
    
    

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAll();

    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用户
     * @param user
     */
    void updateUser(User user);

    /**
     * 根据Id删除用户
     * @param userId
     */
    void deleteUser(Integer userId);

    /**
     * 根据id查询用户信息
     * @param userId
     * @return
     */
    User findById(Integer userId);

    /**
     * 根据名称模糊查询用户信息
     * @param username
     * @return
     */
    List<User> findByName(String username);

    /**
     * 查询总用户数
     * @return
     */
    int findTotal();

}

4.1.2 持久层Dao实现类

public class UserDaoImpl implements IUserDao {
    
    

    private SqlSessionFactory factory;

    public UserDaoImpl(SqlSessionFactory factory){
    
    
        this.factory = factory;
    }

    @Override
    public List<User> findAll() {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findAll");//参数就是能获取配置信息的key
        //3.释放资源
        session.close();
        return users;
    }

    @Override
    public void saveUser(User user) {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现保存
        session.insert("com.itheima.dao.IUserDao.saveUser",user);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    @Override
    public void updateUser(User user) {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现更新
        session.update("com.itheima.dao.IUserDao.updateUser",user);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    @Override
    public void deleteUser(Integer userId) {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用方法实现更新
        session.update("com.itheima.dao.IUserDao.deleteUser",userId);
        //3.提交事务
        session.commit();
        //4.释放资源
        session.close();
    }

    @Override
    public User findById(Integer userId) {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询一个
        User user = session.selectOne("com.itheima.dao.IUserDao.findById",userId);
        //3.释放资源
        session.close();
        return user;
    }

    @Override
    public List<User> findByName(String username) {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询列表
        List<User> users = session.selectList("com.itheima.dao.IUserDao.findByName",username);
        //3.释放资源
        session.close();
        return users;
    }

    @Override
    public int findTotal() {
    
    
        //1.根据factory获取SqlSession对象
        SqlSession session = factory.openSession();
        //2.调用SqlSession中的方法,实现查询一个
        Integer count = session.selectOne("com.itheima.dao.IUserDao.findTotal");
        //3.释放资源
        session.close();
        return count;
    }
}

4.1.3 持久层映射配置

<?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.itheima.dao.IUserDao">

    <!-- 查询所有 -->
    <select id="findAll" resultType="com.itheima.domain.User">
        select * from user;
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.itheima.domain.User">
        <!-- 配置插入操作后,获取插入数据的id -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{
    
    username},#{
    
    address},#{
    
    sex},#{
    
    birthday});
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.itheima.domain.User">
        update user set username=#{
    
    username},address=#{
    
    address},sex=#{
    
    sex},birthday=#{
    
    birthday} where id=#{
    
    id}
    </update>

    <!-- 删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{
    
    uid}
    </delete>
    
    <!-- 根据id查询用户 -->
    <select id="findById" parameterType="INT" resultType="com.itheima.domain.User">
        select * from user where id = #{
    
    uid}
    </select>

    <!-- 根据名称模糊查询 -->
    <select id="findByName" parameterType="string" resultType="com.itheima.domain.User">
          select * from user where username like #{
    
    name}
   </select>

    <!-- 获取用户的总记录条数 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
</mapper>

5.1.4 测试类

public class MybatisTest {
    
    

    private InputStream in;
    private IUserDao userDao;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
    
    
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂对象,创建dao对象
        userDao = new UserDaoImpl(factory);
    }

    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
    
    
        //6.释放资源
        in.close();
    }

    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll(){
    
    
        //5.执行查询所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
    
    
            System.out.println(user);
        }

    }
    /**
     * 测试保存操作
     */
    @Test
    public void testSave(){
    
    
        User user = new User();
        user.setUsername("dao impl user");
        user.setAddress("北京市顺义区");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存操作之前:"+user);
        //5.执行保存方法
        userDao.saveUser(user);

        System.out.println("保存操作之后:"+user);
    }

    /**
     * 测试更新操作
     */
    @Test
    public void testUpdate(){
    
    
        User user = new User();
        user.setId(50);
        user.setUsername("userdaoimpl update user");
        user.setAddress("北京市顺义区");
        user.setSex("女");
        user.setBirthday(new Date());

        //5.执行保存方法
        userDao.updateUser(user);
    }

    /**
     * 测试删除操作
     */
    @Test
    public void testDelete(){
    
    
        //5.执行删除方法
        userDao.deleteUser(54);
    }

    /**
     * 测试删除操作
     */
    @Test
    public void testFindOne(){
    
    
        //5.执行查询一个方法
        User  user = userDao.findById(50);
        System.out.println(user);
    }

    /**
     * 测试模糊查询操作
     */
    @Test
    public void testFindByName(){
    
    
        //5.执行查询一个方法
        List<User> users = userDao.findByName("%王%");
        for(User user : users){
    
    
            System.out.println(user);
        }
    }

    /**
     * 测试查询总记录条数
     */
    @Test
    public void testFindTotal(){
    
    
        //5.执行查询一个方法
        int count = userDao.findTotal();
        System.out.println(count);
    }
}

5.SqlMapConfig.xml配置文件

5.1 配置内容

5.1.1 SqlMapConfig.xml中配置的内容和顺序

在这里插入图片描述

5.2 properties(属性)

在使用properties标签配置时,我们可以采用两种方式指定属性配置。

5.2.1 第一种

<properties> 
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/> 
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="jdbc.username" value="root"/> 
<property name="jdbc.password" value="1234"/> 
</properties>

在这里插入图片描述

5.2.2 第二种

5.2.2.1 在classpath下定义db.properties文件

jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/eesy 
jdbc.username=root 
jdbc.password=1234

5.2.2.2 properties标签配置

在这里插入图片描述

5.2.3 此时我们的dataSource标签就变成了引用上面的配置

在这里插入图片描述

5.3 typeAliases(类型别名)

5.3.1 自定义别名:

在SqlMapConfig.xml中配置:

<typeAliases> 
<!-- 单个别名定义 -->
 <typeAlias alias="user" type="com.itheima.domain.User"/> 
 <!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) --> 
 <package name="com.itheima.domain"/>
  <package name="其它包"/> 
  </typeAliases>

5.4 mappers(映射器)

5.4.1 <.mapper resource=" " />

使用相对于类路径的资源 如:

5.4.2 <.mapper class=" " />

使用mapper接口类路径 如: 注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中

5.4.3 <.package name=""/>

注册指定包下的所有mapper接口 如:
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

猜你喜欢

转载自blog.csdn.net/gy99csdn/article/details/114767366