Mybatis学习之路 第五篇(完结篇)

Mybatis学习之路 第五篇(完结篇)

  • 本文从头开始,做Mybatis的注解开发。
  • 本文涉及以下内容:
    1. Mybatis的注解开发 。

1. Mybatis的注解开发
1.1 环境搭建
  1. 看看整体的项目结构:
    在这里插入图片描述
  2. pom.xml的内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>fang</groupId>
        <artifactId>eesy_mybatis_annotation</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
    
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
            </dependency>
        </dependencies>
    </project>
  3. log日志配置文件log4j.properties内容如下:
    # Set root category priority to INFO and its only appender to CONSOLE.
    #log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
    log4j.rootCategory=debug, CONSOLE, LOGFILE
    
    # Set the enterprise logger category to FATAL and its only appender to CONSOLE.
    log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
    
    # CONSOLE is set to be a ConsoleAppender using a PatternLayout.
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
    
    # LOGFILE is set to be a File appender using a PatternLayout.
    log4j.appender.LOGFILE=org.apache.log4j.FileAppender
    log4j.appender.LOGFILE.File=d:\axis.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
  4. mysql配置文件jdbcConfig.properties内容如下:
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/eesy_mybatis
    jdbc.username=root
    jdbc.password=root
  5. 主配置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"
    <!--mybatis的主配置文件-->
    <configuration>
        <!--引入外部配置文件-->
        <properties resource="jdbcConfig.properties"/>
        <!--配置别名-->
        <typeAliases>
            <package name="fang.domain"/>
        </typeAliases>
        <environments default="mysql">
    <!--        配置mysql的环境-->
            <environment id="mysql">
    <!--            配置的事务的类型-->
                <transactionManager type="JDBC"></transactionManager>
    <!--            配置数据源(连接池)-->
                <dataSource type="POOLED">
    <!--                配置连接数据库的4个基本信息-->
                    <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>
            </environment>
        </environments>
        <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
            如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名-->
        <mappers>
        <!--第一种:使用 mapper 标签配置 class 属性-->
        <!--第二种:使用 package 标签,直接指定 dao 接口所在的包-->
        <!--<package name="fang.dao"/>-->
            <mapper class="fang.dao.IUserDao"/>
        </mappers>
    </configuration>
  6. User实体类的内容如下,省略get、set和toString方法:
    public class User implements Serializable {
        private Integer id;
        private String username;
        private Date birthday;
        private String sex;
        private String address;
    }
  7. IUserDao接口的内容如下:
  • 当注解只需要写value属性值时,value可以省略不写
    //用户的持久层接口
    public interface IUserDao {
        /**
         * 查询所有操作
         * @return
         */
        @Select("select * from user")
        List<User> findAll();
    }
  1. MybatisTest测试类编写:
    public static void main(String[] args) throws Exception {
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user: users) {
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }

1.2 Mybatis的CRUD等功能
  • 基本功能和xml的一样,除了IUserDao接口,编写如下:
        /**
         * 保存用户
         * @param user
         */
        @Insert("insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})")
        void saveUser(User user);
    
        /**
         * 更新用户
         * @param user
         */
        @Update("update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}")
        void updateUser(User user);
    
        /**
         * 删除用户
         * @param userId
         */
        @Delete("delete from user where id=#{id} ")
        void deleteUser(Integer userId);
    
        /**
         * 根据id查询用户
         * @param userId
         * @return
         */
        @Select("select * from user  where id=#{id} ")
        User findById(Integer userId);
    
        /**
         * 根据用户名称模糊查询
         * @param username
         * @return
         */
        //@Select("select * from user where username like #{username} ")
        @Select("select * from user where username like '%${value}%' ")
        List<User> findUserByName(String username);
    
        /**
         * 查询总用户数量
         * @return
         */
        @Select("select count(*) from user ")
        int findTotalUser();
1.3 Mybatis的实体类和数据库对应关系
  1. 我们将User类的属性改成和数据库的不一样
    public class User implements Serializable {
        private Integer userId;
        private String userName;
        private Date userBirthday;
        private String userSex;
        private String userAddress;
    }
  2. 修改IUserDao接口内容:
    /**
     * 查询所有操作
     * @return
     */
    @Select("select * from user")
    @Results(id = "userMap", value = {
            @Result(id = true, column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday")
    })
    List<User> findAll();
    
    /**
     * 根据id查询用户
     * @param userId
     * @return
     */
    @Select("select * from user  where id=#{id} ")
    @ResultMap("userMap") 
    //value={"userMap"},value可去掉,{}中只有一个值时{}可去掉
    User findById(Integer userId);
1.4 Mybatis的一对一查询配置
  • 一个账号(Account)对应一个用户(User)
  1. Account类的编写,省略get、set等方法:
    public class Account implements Serializable {
        private Integer id;
        private Integer uid;
        private Double money;
        //多对一(mybatis中称之为一对一)的映射:一个账户只能属于一个用户
        private User user;
    }
  2. IAccountDao接口的编写如下:
public interface IAccountDao {

    /**
     * 查询所有账户,并且获取每个账户所属的用户信息
     * @return
     */
    @Select("select * from account")
    @Results(id="accountMap",value = {
            @Result(id=true,column = "id",property = "id"),
            @Result(column = "uid",property = "uid"),
            @Result(column = "money",property = "money"),
            @Result(property = "user",column = "uid",one=@One(select="fang.dao.IUserDao.findById",fetchType= FetchType.EAGER))
    })
    List<Account> findAll();
}
1.5 Mybatis的一对多查询配置
  • 一般一对一用立即加载,一对多用延时加载。
  • 一个用户(User)可以对应多个账号(Account)
  1. 在User类中添加List< Account>部分,省略get、set等方法:
    public class User implements Serializable {
        private Integer userId;
        private String userName;
        private Date userBirthday;
        private String userSex;
        private String userAddress;
        //一个用户对应多个账户
        private List<Account> accounts;
    }
  2. 在IAccountDao接口中添加方法:
    /**
     * 根据用户id查询账户信息
     * @param userId
     * @return
     */
    @Select("select * from account where uid = #{userId}")
    List<Account> findAccountByUid(Integer userId);
  3. 修改IUserDao接口中内容:
    /**
     * 查询所有操作
     * @return
     */
    @Select("select * from user")
    @Results(id = "userMap", value = {
            @Result(id = true, column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday"),
            @Result(property = "accounts", column = "id",
                    many = @Many(select = "fang.dao.IAccountDao.findAccountByUid",
                            fetchType = FetchType.LAZY))
    })
    List<User> findAll();

1.6 Mybatis的缓存
  • 一级缓存时默认存在的。
  • 二级缓存开启步骤如下:
  1. 在SqlMapConfig.xm中添加如下:
    <!--配置开启二级缓存-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
  2. 在需要添加二级缓存的接口上添加注解就可以开启了:
    @CacheNamespace(blocking = true)
    public interface IUserDao {
    	...
    }
  • 到这里,我们整个Mybatis的学习就结束啦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值