• Mybatis 框架课程第二天


    目录

    3 基于代理Dao实现CRUD操作

    使用要求:

    1、持久层接口和持久层接口的映射配置必须在相同的包下。

    2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名。

    3、SQL 语句的配置标签<select>,<insert>,<delete>,<update>的 id 属性必须和持久层接口的方法名相同。

    3.1 根据id查询

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

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

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

        <!--查询用户-->
        <select id="findById" parameterType="int" resultType="com.zjw.domain.User">
            select * from user where id = #{userId} ;
        </select>
    

    resultType属性: 用于指定结果集的类型

    parameterType属性:用于指定传入参数的类型

    sql语句中使用#{}字符
    它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
    具体的数据是由#{}里面的内容决定的。

    #{}中内容的写法
    由于数据类型是基本类型,所以此处可以随意写。

    3.1.3 在测试类添加测试

    package com.zjw.test;
    
    import com.zjw.dao.IUserDao;
    import com.zjw.domain.QueryVo;
    import com.zjw.domain.User;
    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.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    public class TestDao {
    
        private InputStream in ;
        private SqlSessionFactoryBuilder builder;
        private SqlSessionFactory factory ;
        private SqlSession session ;
        private IUserDao userDao ;
    
        @Before
        public void init() throws Exception{
            //读取配置文件
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建SqlSessionFactory工厂
            builder = new SqlSessionFactoryBuilder();
            factory = builder.build(in);
            //使用工厂生成SqlSession对象
            session = factory.openSession();
            //使用SqlSession穿过将Dao接口的代理对象
            userDao = session.getMapper(IUserDao.class);
        }
    
        @After
        public void destory() throws Exception{
            session.close();
            in.close();
        }
    
        /**
         * 测试查询用户
         */
        @Test
        public void testfindById(){
            User user = userDao.findById(50);
            System.out.println(user);
        }
    
    }
    
    

    3.2 保存操作

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

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

    3.2.2 在用户䣌映射配置文件中配置

    <!--保存用户-->
        <insert id="saveUser" parameterType="com.zjw.domain.User">
            insert into user(username,address,birthday,sex) values (#{userName},#{userAddress},#{userBirthday},#{userSex}) ;
        </insert>
    

    细节:

    parameterType 属性:

    代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

    sql 语句中使用#{}字符:

    它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
    具体的数据是由#{}里面的内容决定的。

    #{}中内容的写法:
    由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。
    它用的是 ognl 表达式。
    ognl 表达式

    它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言

    它是按照一定的语法格式来获取数据的。

    语法格式就是使用 #{对象.对象}的方式

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

    3.2.3 在测试类中的测试方法

        /**
         * 测试保存操作
         * @throws IOException
         */
        @Test
        public void testSaveUser(){
    
            User user = new User();
            user.setUserName("朱俊伟1231231232");
            user.setUserAddress("河南");
            user.setUserBirthday(new Date());
            user.setUserSex("男");
    
            userDao.saveUser(user);
        }
    
          
    

    打开 Mysql 数据库发现并没有添加任何记录,原因是什么?

    这一点和 jdbc 是一样的,我们在实现增删改时一定要去控制事务的提交,那么在 mybatis 中如何控制事务提交呢?

    可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:

        @After
        public void destory() throws Exception{
            session.commit();
            session.close();
            in.close();
        }
    

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

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

        <!--保存用户后返回id-->
        <insert id="saveUserReturnId" parameterType="com.zjw.domain.User">
            <selectKey keyProperty="userId" keyColumn="id" order="AFTER" resultType="int">
                select LAST_INSERT_ID();
            </selectKey>
            insert into user(username,address,birthday,sex) values (#{userName},#{userAddress},#{userBirthday},#{userSex}) ;
        </insert>
    
         /**
         * 测试保存返回id操作
         * @throws IOException
         */
        @Test
        public void testSaveUserReturnId(){
    
            User user = new User();
            user.setUserName("testInsert id");
            user.setUserAddress("河南");
            user.setUserBirthday(new Date());
            user.setUserSex("男");
    
            System.out.println(user);//插入前打印无id
            userDao.saveUserReturnId(user);
            System.out.println(user);//插入后打印有id
        }
    

    3.3 用户更新

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

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

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

        <!--更新用户-->
        <update id="updateUser" parameterType="com.zjw.domain.User">
            update user set username=#{userName},address=#{userAddress},birthday=#{userBirthday},sex=#{userSex} where id=#{userId};
        </update>
    

    3.3.3 加入更新的测试方法

         /**
         * 测试更新操作
         */
        @Test
        public void testUpdateUser(){
    
            User user = new User();
            user.setUserId(50);
            user.setUserName("王二");
            user.setUserAddress("河南11111111");
            user.setUserBirthday(new Date());
            user.setUserSex("男");
    
            userDao.updateUser(user);
        }
    

    3.4 用户删除

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

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

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

        <!--删除用户-->
        <delete id="deleteUser" parameterType="int">
            delete from user where id = #{userId};
        </delete>
    

    3.4.3 加入删除的测试方法

    
        /**
         * 测试删除操作
         */
        @Test
        public void testDeleteUser(){
            userDao.deleteUser(48);
        }
    

    3.5 用户模糊查询

    3.5.1 在持久层接口最终添加模糊查询方法

        /**
         * 根据名字模糊查询用户
         * @param userName
         * @return
         */
        List<User> findByName(String userName);
    

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

        <!--根据名字模糊查询用户-->
        <select id="findByName" parameterType="String" resultType="com.zjw.domain.User">
            <!--使用的占位符,推荐使用,不过参数要加上%-->
            <!-- select * from user where username like #{userName};-->
    
            <!--使用的是字符串拼接,参数不用加%,但是会有sql注入问题-->
            select * from user where username like '%${value}%';
        </select>
    

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

        /**
         * 测试根据名字模糊查询用户
         */
        @Test
        public void testFindByName(){
            //使用#{} , 需要加%
    //        List<User> userList = userDao.findByName("%王%");
            //使用${} , 不用加%
            List<User> userList = userDao.findByName("王");
            for (User user : userList) {
                System.out.println(user);
            }
        }
    

    3.5.4 #{}和${}的区别

    #{}表示一个占位符号
    通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

    ${}表示拼接 sql 串
    通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,${}可以接收简
    单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

    3.6 查询使用聚合函数

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

        /**
         * 查询用户的所有记录数
         * @return
         */
        int findTotal();
    

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

        <select id="findTotal" resultType="int" >
            select count(*) from user;
        </select>
    

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

        /**
         * 查询用户的条数
         */
        @Test
        public void testFindTotal(){
            int total = userDao.findTotal();
            System.out.println(total);
        }
    

    3.7 Mybatis与JDBC编程的比较

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

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

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

    4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。
    解决:
    Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型

    4 Mybatis的参数深入

    4.1 parameterType配置参数

    4.1.1 使用说明

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

    4.1.2 注意事项

    基本类型和String我们可以直接写类型名称,也可以使用包名.类名的方式,例如:java.lang.String。
    实体类类型,目前我们只能使用全限定类名。
    究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。在今天课程的最后一个章节中将讲解如何注册实体类的别名。

    在 mybatis 的官方文档的说明(https://mybatis.org/mybatis-3/zh/configuration.html#typeAliases)

    这些都是支持的默认别名。我们也可以从源码角度来看它们分别都是如何定义出来的。
    可以参考 TypeAliasRegistery.class 的源码。

    4.2 传递pojo包装对象

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

    Pojo 类中包含 pojo。

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

    4.2.1 编写QueryVo

    package com.zjw.domain;
    
    public class QueryVo {
    
        private User user;
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    }
    

    4.2.2 编写持久层接口

        /**
         * 根据queryVo中的条件查询用户
         */
        List<User> findUserByVo(QueryVo queryVo);
    

    4.2.3 持久层接口的映射文件

        <!--根据queryVo的添加查询用户-->
        <select id="findUserByVo" parameterType="com.zjw.domain.QueryVo" resultType="com.zjw.domain.User">
            <!--ognl表达式:
                user:QueryVo类中的属性
            -->
            select * from user where username like #{user.userName};
        </select>
    

    4.2.4 测试包装类作为参数

        /**
         * 测试QueryVo查询用户
         */
        @Test
        public void testFindUserByVo(){
            QueryVo queryVo = new QueryVo();
            User user = new User();
            user.setUserName("%王%");
            queryVo.setUser(user);
    
            List<User> userList = userDao.findUserByVo(queryVo);
            for (User u : userList) {
                System.out.println(u);
            }
        }
    

    5 Mybatis的输出结果封装

    5.1 resultType配置结果类型

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

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

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

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

    5.1.1 特殊情况(属性名和列名不一致)

    5.1.1.1 数据库,User类

    5.1.1.2 Dao接口

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

    5.1.1.3 映射配置

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

    5.1.1.4 测试查询结果

        /**
         * 测试查询操作
         * @throws IOException
         */
        @Test
        public void testFindAll() throws IOException {
    
            //使用代理对象执行方法
            List<User> users = userDao.findAll();
            for (User user : users) {
                System.out.println(user);
            }
        }
    
    User{userId=null, userName='老王', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='小二王', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='小二王', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='传智播客', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='老王', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='testInsert id', userAddress='null', userSex='null', userBirthday=null}
    User{userId=null, userName='mybatis annotation', userAddress='null', userSex='null', userBirthday=null}
    

    发现名称有值,因为windows系统不区分大小写。其他值均为null.
    可以通过给列名取别名实现封装。也可以使用resultMap结果类型。

    5.1.1.5 修改映射配置

        <select id="findAll"  resultType="com.zjw.domain.User">
            select  id as userId,
                    username as userName,
                    birthday as userBirthday,
                    sex as userSex,
                    address as userAddress
            from user;
        </select>
    

    通过给列名取别名可以实现封装,但是太麻烦!

    5.2 resultMap结果类型

     resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。

     在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。

    5.2.1 定义resultMap

    
        <resultMap id="userMap" type="User">
            <id property="userId" column="id"/>
            <result property="userName" column="username"/>
            <result property="userAddress" column="address"/>
            <result property="userBirthday" column="birthday"/>
            <result property="userSex" column="sex"/>
        </resultMap>
    
    

    id 标签:用于指定主键字段
    result 标签:用于指定非主键字段
    column 属性:用于指定数据库列名
    property 属性:用于指定实体类属性名称

    5.2.2 映射配置

        <!--查询所有-->
        <select id="findAll"  resultMap="userMap">
            select  * from user;
        </select>
    

    使用resultMap属性指定我们定义的id

    6 Mybatis传统Dao层开发[了解]

    使用 Mybatis 开发 Dao,通常有两个方法,即原始 Dao 开发方式和 Mapper 接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。我们的课程讲解也主要以接口代理开发方式为主。在第二章节已经给大家介绍了基于代理方式的 dao 开发,现在给大家介绍一下基于传统编写 Dao 实现类的开发方式。

    6.1 Mybatis实现Dao的传统开发方式

    6.1.1 持久层Dao接口

    package com.zjw.dao;
    
    import com.zjw.domain.User;
    
    import java.util.List;
    
    /**
     * 用户的持久层接口
     */
    public interface IUserDao {
    
        /**
         * 查询所有用户
         * @return
         */
        List<User> findAll();
    
        /**
         * 保存用户
         * @param user
         */
        void saveUser(User user);
    
        void saveUserReturnId(User user);
    
        /**
         * 更新用户
         * @param user
         */
        void updateUser(User user);
    
        /**
         * 删除用户
         * @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();
    }
    
    

    6.1.2 持久层Dao实现类

    package com.zjw.dao.impl;
    
    import com.zjw.dao.IUserDao;
    import com.zjw.domain.User;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    
    import java.util.List;
    
    public class UserDaoImpl implements IUserDao {
    
        private SqlSessionFactory factory ;
    
        public UserDaoImpl(SqlSessionFactory factory){
            this.factory = factory ;
        }
    
        public List<User> findAll() {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现查询列表
            List<User> users = session.selectList("com.zjw.dao.IUserDao.findAll");//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.close();
            return users;
        }
    
        public void saveUser(User user) {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            session.insert("com.zjw.dao.IUserDao.saveUser",user);//参数就是能获取配置信息的key(namespace+id),要操作的对象
            //3、释放资源
            session.commit();
            session.close();
        }
    
        public void saveUserReturnId(User user) {
    
        }
    
        public void updateUser(User user) {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            session.update("com.zjw.dao.IUserDao.updateUser",user);//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.commit();
            session.close();
        }
    
        public void deleteUser(Integer userId) {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            session.delete("com.zjw.dao.IUserDao.deleteUser",userId);//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.commit();
            session.close();
        }
    
        public User findById(Integer userId) {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            User user = session.selectOne("com.zjw.dao.IUserDao.findById", userId);//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.close();
            return user ;
        }
    
        public List<User> findByName(String userName) {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            List<User> users = session.selectList("com.zjw.dao.IUserDao.findByName", userName);//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.close();
            return users ;
        }
    
        public int findTotal() {
            //1、获取SqlSession对象
            SqlSession session = factory.openSession();
            //2、调用SqlSession中的方法,实现保存用户操作
            int count = session.selectOne("com.zjw.dao.IUserDao.findTotal");//参数就是能获取配置信息的key(namespace+id)
            //3、释放资源
            session.close();
            return count ;
        }
    }
    
    

    6.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.zjw.dao.IUserDao">
    
        <!--查询所有-->
        <select id="findAll" resultType="com.zjw.domain.User" >
            select  * from user;
        </select>
    
        <!--保存用户-->
        <insert id="saveUser" parameterType="com.zjw.domain.User">
            insert into user(username,address,birthday,sex) values (#{username},#{address},#{birthday},#{sex}) ;
        </insert>
    
        <!--保存用户后返回id-->
        <insert id="saveUserReturnId" parameterType="com.zjw.domain.User">
            <selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
                select LAST_INSERT_ID();
            </selectKey>
            insert into user(username,address,birthday,sex) values (#{username},#{address},#{birthday},#{sex}) ;
        </insert>
    
        <!--更新用户-->
        <update id="updateUser" parameterType="com.zjw.domain.User">
            update user set username=#{username},address=#{address},birthday=#{birthday},sex=#{sex} where id=#{id};
        </update>
    
        <!--删除用户-->
        <delete id="deleteUser" parameterType="int">
            delete from user where id = #{userId};
        </delete>
    
        <!--查询用户-->
        <select id="findById" parameterType="INTEGER" resultType="com.zjw.domain.User">
            select * from user where id = #{userId} ;
        </select>
    
        <!--根据名字模糊查询用户-->
        <select id="findByName" parameterType="String" resultType="com.zjw.domain.User">
            <!--使用的占位符,推荐使用,不过参数要加上%-->
            select * from user where username like #{userName};
    
            <!--使用的是字符串拼接,参数不用加%,但是会有sql注入问题-->
            <!-- select * from user where username like '%${value}%';-->
        </select>
    
        <select id="findTotal" resultType="int" >
            select count(*) from user;
        </select>
    </mapper>
    

    6.1.4 测试类

    package com.zjw.test;
    
    import com.zjw.dao.IUserDao;
    import com.zjw.dao.impl.UserDaoImpl;
    import com.zjw.domain.User;
    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.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    
    public class TestDao {
    
        private InputStream in ;
        private SqlSessionFactoryBuilder builder;
        private SqlSessionFactory factory ;
        private SqlSession session ;
        private IUserDao userDao ;
    
        @Before
        public void init() throws Exception{
            //读取配置文件
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建SqlSessionFactory工厂
            builder = new SqlSessionFactoryBuilder();
            factory = builder.build(in);
            //使用工厂生成dao对象
            userDao = new UserDaoImpl(factory);
        }
    
        @After
        public void destory() throws Exception{
            //释放资源
            in.close();
        }
    
        /**
         * 测试查询操作
         * @throws IOException
         */
        @Test
        public void testFindAll() {
            List<User> users = userDao.findAll();
            for (User user : users) {
                System.out.println(user);
            }
        }
    
    
        /**
         * 测试保存操作
         * @throws IOException
         */
        @Test
        public void testSaveUser(){
    
            User user = new User();
            user.setUsername("testInsert user...");
            user.setAddress("河南");
            user.setBirthday(new Date());
            user.setSex("男");
    
            userDao.saveUser(user);
        }
    
        /**
         * 测试保存返回id操作
         * @throws IOException
         */
        @Test
        public void testSaveUserReturnId(){
    
            User user = new User();
            user.setUsername("testInsert user...");
            user.setAddress("河南");
            user.setBirthday(new Date());
            user.setSex("男");
    
            userDao.saveUser(user);
        }
    
        /**
         * 测试更新操作
         */
        @Test
        public void testUpdateUser(){
    
            User user = new User();
            user.setId(50);
            user.setUsername("朱俊伟111");
            user.setAddress("河南11111111");
            user.setBirthday(new Date());
            user.setSex("男");
    
            userDao.updateUser(user);
        }
    
        /**
         * 测试删除操作
         */
        @Test
        public void testDeleteUser(){
            userDao.deleteUser(53);
        }
    
        /**
         * 测试查询用户
         */
        @Test
        public void testfindById(){
            User user = userDao.findById(50);
            System.out.println(user);
        }
    
        /**
         * 测试根据名字模糊查询用户
         */
        @Test
        public void testFindByName(){
            //使用#{} , 需要加%
            List<User> userList = userDao.findByName("%王%");
            //使用${} , 不用加%
    //        List<User> userList = userDao.findByName("王");
            for (User user : userList) {
                System.out.println(user);
            }
        }
    
    
        /**
         * 查询用户的条数
         */
        @Test
        public void testFindTotal(){
            int total = userDao.findTotal();
            System.out.println(total);
        }
    }
    
    

    7 SqlMapConfig.xml配置文件

    7.1 配置内容

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

    -properties(属性)
          --property
    -settings(全局配置参数)
          --setting
    -typeAliases(类型别名)
          --typeAliase
          --package
    -typeHandlers(类型处理器)
    -objectFactory(对象工厂)
    -plugins(插件)
    -environments(环境集合属性对象)
          --environment(环境子属性对象)
                ---transactionManager(事务管理)
                ---dataSource(数据源)
    -mappers(映射器)
          --mapper
          --package
    

    7.2 properties(属性)

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

    7.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>
    

    7.2.2 第二种

    7.2.2.1 在classpath下定义properties文件

    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/eesy?serviceTimezone=Asia/Shanghai&useSSL=false
    jdbc.username=root
    jdbc.password=123456
    

    7.2.2.2 properties标签配置

    
    <!--<properties url="file:///E:codeIdeaProjectsmybatisday02_eesy_01mybatisCRUDsrcmain
    esourcesjdbcConfig.properties"/>-->
        <properties resource="jdbcConfig.properties"/>
    

    7.2.3 此时我们的dataSource标签就编程了引用上面的配置

    <dataSource type="POOLED">
          <property name="driver" value="${jdbc.driver}"/>
          <property name="url" value="${jdbc.url}"/>
          <property name="username" value="${jdbc.username}"/>
          <property name="password" value="${jdbc.password}"/>
    </dataSource>
    

    7.3 typeAliases(类型别名)

    在前面我们讲的 Mybatis 支持的默认别名,我们也可以采用自定义别名方式来开发

    7.3.1 自定义别名

        <!--  使用typeAliases配置别名,它只能配置domain中的类的别名  -->
        <typeAliases>
            <!-- typeiAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就再区分大小写  -->
            <!-- <typeAlias type="com.zjw.domain.User" alias="user"></typeAlias>-->
            <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写  -->
            <package name="com.zjw.domain"/>
        </typeAliases>
    

    7.4 mappers(映射器)

    7.4.1 resource

    使用相对于类路径的资源

    如:

    <mapper resource="com/zjw/dao/IUserDao.xml" />
    

    7.4.2 class

    使用mapper接口类路径

    如:

    <mapper class="com.zjw.dao.UserDao"/>
    

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

    7.4.3 package

    注册指定包下的所有mapper接口

    如:

    <package name="com.zjw.dao"/>
    

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

    --------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
  • 相关阅读:
    Windows系统的DOS常用命令
    常用pom
    ssm整合
    pom依赖集合
    json
    软件项目管理笔记-软件项目计划
    CSS
    网络配置
    用户组
    用户管理
  • 原文地址:https://www.cnblogs.com/zjw-blog/p/13933296.html
Copyright © 2020-2023  润新知