zoukankan      html  css  js  c++  java
  • MyBatis 查询示例

    环境搭建

    数据库schema

     

    1)datasource.xml配置

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- SqlSeesionTemplate是线程安全的,可以被多个Dao共享,可以使用Singleton -->
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <!-- 第一个参数是 sqlSessionFactory -->
            <constructor-arg index="0" ref="sqlSessionFactory"/>
            <!-- 第二个参数是 ExecutorType -->
            <constructor-arg index="1" value="BATCH"/>
        </bean>
    
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 指定数据源 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 指定MyBatis配置文件 -->
            <property name="configLocation" value="classpath:mybatis-config.xml" />
            <!-- 导入Mapper -->
            <property name="mapperLocations" value="classpath:mappers/*.xml" />
        </bean>
    
        <!-- datasource -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatistest?characterEncoding=utf8" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>
    
    </beans>
    复制代码

     

     

    2.applicationContext.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context.xsd">
        <context:component-scan base-package="dao" />
        <context:component-scan base-package="bean" />
    
        <bean id="userDao" class="dao.UserDao">
            <!--<property name="sqlSessionFactory" ref="sqlSessionFactory" />-->
            <property name="sqlSessionTemplate" ref="sqlSession" />
        </bean>
    
        <bean id="articleDao" class="dao.ArticleDao">
            <property name="sqlSessionTemplate" ref="sqlSession" />
        </bean>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
    </beans>
    复制代码

     

     

    3. log4j.properties

    复制代码
    将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句,方便调试: 
    
    ### 设置Logger输出级别和输出目的地 ###
    log4j.rootLogger=debug,stdout,logfile
    
    
    ### 把日志信息输出到控制台 ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    #log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
    
    
    ### 把日志信息输出到文件:jbit.log ###
    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=jbit.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
    
    
    ###显示SQL语句部分
    log4j.logger.com.ibatis=DEBUG
    log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
    log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
    log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
    log4j.logger.java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    复制代码

     

    4.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>
        <!-- MyBatis 配置 -->
        <settings>
            <setting name="cacheEnabled" value="true"/>
            <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="multipleResultSetsEnabled" value="true"/>
            <setting name="useColumnLabel" value="true"/>
            <setting name="useGeneratedKeys" value="false"/>
            <setting name="autoMappingBehavior" value="PARTIAL"/>
            <setting name="defaultExecutorType" value="BATCH"/>
            <setting name="defaultStatementTimeout" value="25"/>
            <setting name="safeRowBoundsEnabled" value="false"/>
            <setting name="mapUnderscoreToCamelCase" value="false"/>
            <setting name="localCacheScope" value="SESSION"/>
            <setting name="jdbcTypeForNull" value="OTHER"/>
            <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
        </settings>
        
        <!-- 类别名设置 -->
        <typeAliases>
            <typeAlias alias="User" type="bean.User"/>
            <typeAlias alias="Article" type="bean.Article"/>
            <typeAlias alias="Post" type="bean.Post"/>
        </typeAliases>
    </configuration>
    复制代码

     

    查询代码示例

    BaseMapper.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">
    
    <mapper namespace="dao.base">
        <resultMap id="userResultMap" type="User">
            <id property="id" column="id" />
            <result property="name" column="name" />
            <result property="age" column="age" />
            <result property="address" column="address" />
        </resultMap>
    
        <resultMap id="postResultMap" type="Post">
            <id property="id" column="id" />
            <result property="content" column="content" />
        </resultMap>
    
        <!-- 复杂类型的ResultMap构造 -->
        <resultMap id="articleResultMap" type="Article">
            <id property="id" column="article_id" />
            <result property="title" column="article_title" />
            <result property="content" column="article_content" />
            <!-- association表示单个外键对象使用 -->
            <!-- property为Article里的成员 -->
            <!-- columnprefix表示在userResultMap里的column全都加上prefix,以跟select语句里column label的匹配 -->
            <association property="user" resultMap="userResultMap" columnPrefix="user_"/>
            <!-- collection表示多个的外键对象List,例如一对多关系 -->
            <!-- 此处表示一个Article对应多个Post -->
            <collection property="postList" resultMap="postResultMap" columnPrefix="post_" />
        </resultMap>
    </mapper>
    复制代码

     

    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">
    
    <!-- 对应类的SQL语句 -->
    <mapper namespace="dao.userdao">
        <!-- 简单查询示例 -->
        <!-- Select的flushCache默认为false -->
        <!-- useCache默认为true,statementType默认为PREPARED -->
        <!-- MyBatis结果集的映射规则就是使用column label(没有则直接使用column) -->
        <!-- 去对应resultType里的property名字并赋值(除了使用resultMap手动控制映射) -->
        <select id="selectUserByID" parameterType="int" resultType="User"
                flushCache="false" useCache="true" timeout="10000" statementType="PREPARED">
            SELECT
                *
            FROM user
            WHERE id = #{id}
        </select>
        
        <!-- 简单插入示例 -->
        <!-- 此处值得注意的是 userGenerateKeys,keyProperty,keyColumn -->
        <!-- 这三个值表示使用jdbc自动生成主键并赋给数据库里的column和实体的property -->
        <!-- flushCache默认为true,statmentType默认为PREPARED -->
        <insert id="insertUser" parameterType="User" timeout="10000"
                flushCache="true" statementType="PREPARED" useGeneratedKeys="true"
                keyProperty="id" keyColumn="id">
            INSERT INTO user (name, age, address)
            VALUES (#{name}, #{age}, #{address})
        </insert>
    
        <!-- 简单更新示例 -->
        <update id="updateUser" parameterType="User">
            UPDATE user SET
               name = #{name},
               age = #{age},
               address = #{address}
        </update>
    
        <!-- 简单删除 -->
        <delete id="deleteUser" parameterType="int">
            DELETE FROM user
            WHERE id = #{id}
        </delete>
    
        <!-- Cache 配置 -->
        <!-- 根据官方文档的介绍
            By default, just local sessión caching is enabled that is used solely to cache data for the duration of a sessión.
            To enable a global second level of caching you simply need to add one line to your SQL Mapping file
            需要加上这个cache标签才能使用全局的cache,否则只能使用session范围内的一级缓存,实际上在spring中根本无法使用一级缓存 -->
        <cache
            eviction="FIFO"
            flushInterval="60000"
            size="512"
            readOnly="true" />
    </mapper>
    复制代码

     

    ArticleMapper.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">
    
    <mapper namespace="dao.articledao">
        <!-- select里的column label必须与resultMap里的column(或者加上prefix的column)匹配 -->
        <select id="selectArticleById" parameterType="int" resultMap="dao.base.articleResultMap">
            SELECT
              a.id AS article_id,
              a.title AS article_title,
              a.content AS article_content,
              a.user_id AS user_id,
              u.name AS user_name,
              u.age AS user_age,
              u.address AS user_address,
              p.id AS post_id,
              p.content AS post_content
            FROM article AS a
            JOIN user AS u
              ON a.user_id = u.id
            JOIN post AS p
              ON a.id = p.article_id
            WHERE a.id = #{id}
        </select>
    </mapper>
    复制代码

     

     

    Dao

    复制代码
    package dao;
    
    import bean.User;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    import org.springframework.stereotype.Repository;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-8-3
     * Time: 下午9:21
     * To change this template use File | Settings | File Templates.
     */
    @Repository
    public class UserDao extends SqlSessionDaoSupport {
        public User selectUserById(int id) {
            return getSqlSession().selectOne("dao.userdao.selectUserByID", id);
        }
    }
    
    
    package dao;
    
    import bean.Article;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    import org.springframework.stereotype.Repository;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-8-5
     * Time: 下午12:37
     * To change this template use File | Settings | File Templates.
     */
    @Repository
    public class ArticleDao extends SqlSessionDaoSupport {
        public Article selectArticleById(int id) {
            return getSqlSession().selectOne("dao.articledao.selectArticleById", id);
        }
    }
    复制代码

     

    bean

    复制代码
    package bean;
    
    public class User {
    
        private Integer id;
    
    
        private String name;
    
    
        private Integer age;
    
    
        private String address;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return id + "|" + name + "|" + age + "|" + address;
        }
    }
    复制代码
    复制代码
    package bean;
    
    
    public class Post {
        private String id;
        private String content;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        @Override
        public String toString() {
            return content;
        }
    }
    复制代码
    复制代码
    package bean;
    
    import java.util.List;
    
    public class Article {
        
        private Integer id;
    
        
        // user属于单个外键复杂对象
        private User user;
    
        
        private String title;
    
        
        private String content;
    
        // postList属于一对多关系复杂对象
        private List<Post> postList;
    
        
        public Integer getId() {
            return id;
        }
    
        
        public void setId(Integer id) {
            this.id = id;
        }
    
        
        public User getUser() {
            return user;
        }
    
        
        public void setUser(User user) {
            this.user = user;
        }
    
        
        public String getTitle() {
            return title;
        }
    
        
        public void setTitle(String title) {
            this.title = title == null ? null : title.trim();
        }
    
        
        public String getContent() {
            return content;
        }
    
        
        public void setContent(String content) {
            this.content = content == null ? null : content.trim();
        }
    
        public List<Post> getPostList() {
            return postList;
        }
    
        public void setPostList(List<Post> postList) {
            this.postList = postList;
        }
    
        @Override
        public String toString() {
            return title + "|" + content + "|" + user + "|" + postList;
        }
    }
    复制代码

     

  • 相关阅读:
    vue前台 (三)优化三级分类请求次数(发送ajax次数)
    vue前台(三)采用申明式导航去点击连接到其他组件(采用事件委派方式)
    浅谈Vue中的路由配置项meta
    vue前台(三)函数防抖和节流,lodash
    vuex的mapState 辅助函数
    Vue使用NProgress
    axios拦截器
    编程式路由跳转到当前路由, 控制台抛出NavigationDuplicated的错误
    window 右键菜单添加 vscode
    对《Python核心编程》中“第一个Python程序”的改进
  • 原文地址:https://www.cnblogs.com/haimishasha/p/5709046.html
Copyright © 2011-2022 走看看