Mybatis学习(五)

2、搭建Java工程

A、加入mybatis核心包、依赖包、数据驱动包

B、在classpath下创建log4j.properties和db.propertites(mybatis默认使用log4j作为输出日志信息)

log4j.properties

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

db.propertites

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root

C、在classpath下创建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">

    <configuration>
        <!-- 加载数据库驱动信息 -->
        <properties resource="db.properties"></properties>

        <!-- 配置别名 -->
        <typeAliases>
            <!--扫描包的形式创建别名,别名就是类名,不区分大小写 -->
            <package name="com.kid.mybatis.pojo"/>
        </typeAliases>

        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
                <!-- 使用jdbc事务管理-->
                <transactionManager type="JDBC"/>

                <!-- 数据库连接池-->
                <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>
            </environment>
        </environments>

        <!-- 加载mapper文件 -->
        <mappers>
            <!-- 使用扫描包的形式加载mapper文件 -->
            <package name="com.kid.mybatis.mapper"/>
        </mappers>
    </configuration>

D、pojo类

    public class Orders {
        private Integer id;
        private Integer userId;
        private String number;
        private Date createtime;
        private String note;
        private User user;

        //省略getter/setter方法
    }

    public class QueryVo {
        private User user;
        private List<Integer> ids;

        省略getter/setter方法
    }

    public class User {
        private Integer id;
        private String username;
        private String sex;
        private Date birthday;
        private String address;

        省略getter/setter方法
    }

3、输入映射和输出映射:resultType和resultMap的使用

    OrderMapper接口:
        public interface OrderMapper {
            List<Orders> getOrderList();
            List<Orders> getOrderListResultMap();
        }

    OrderMapper.xml:
        <mapper namespace="com.kid.mybatis.mapper.OrderMapper">

            <select id="getOrderList" resultType="orders">
                select id,user_id userId,number,createtime,note from orders
            </select>

            <!--使用resultMap; type:返回结果映射的pojo,可以使用别名-->
            <resultMap type="orders" id="order_list_result_map">
                <!--id主键的映射,property是pojo中主键的属性,column:返回结果中主键映射  -->
                <id property="id" column="id"/>
                <result property="userId" column="user_id"/>
                <result property="number" column="number"/>
                <result property="createtime" column="createtime"/>
                <result property="note" column="note"/>
            </resultMap>
            <select id="getOrderListResultMap" resultMap="order_list_result_map">
                select id,user_id,number,createtime,note from orders
            </select>
        </mapper>

    测试文件:OrderMapperTest
        public class OrderMapperTest {

            private SqlSessionFactory sqlSessionFactory = null;
            @Before
            public void init() throws Exception {
                //第一步:创建一个SQLSessionFactoryBuilder对象。
                SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                //第二步:加载配置文件。
                InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
                //第三步:创建SQLSessionFactory对象
                sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
            }

            @Test
            public void getOrderList() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

                List<Orders> orderList = orderMapper.getOrderList();
                for (Orders orders : orderList) {
                    System.out.println(orders);
                }
                sqlSession.close();
            }

            @Test
            public void getOrderListResultMap() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);

                List<Orders> orderList = orderMapper.getOrderList();
                for (Orders orders : orderList) {
                    System.out.println(orders);
                }
                sqlSession.close();
            }
        }

这一块主要讲输入和输出映射无法匹配的问题!我们的 Order 中是userId,数据库中的字段名称是 user_id,这块我们使用了2种方法查询:

A、别名查询  select id,user_id userId,number,createtime,note from orders
B、使用 requltMap ,type:返回结果映射的pojo,可以使用别名(详细看上面注释)

   resultMap标签简单介绍:
        <id />:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id />。
        Property:表示User类的属性。
        Column:表示sql查询出来的字段名。
        Column 和 property放在一块儿表示将sql查询出来的字段映射到指定的pojo类属性上。
        <result />:普通结果,即pojo的属性。

4、动态SQL语句

   UserMapper接口:
        public interface UserMapper {
            User getUserByQueryVo(QueryVo queryVo);
            int findUserCount();
            List<User> findUserList(User user);
            List<User> findUseListByIds(QueryVo queryVo);
        }

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

        <mapper namespace="com.kid.mybatis.mapper.UserMapper">
            <!-- 通过queryVo查询客户 -->
            <select id="getUserByQueryVo" parameterType="queryvo" resultType="user">
                select * from user where id = #{user.id}
            </select>

            <!-- 查询用户总数 -->
            <select id="findUserCount" resultType="int">
                select count(*) from user
            </select>

            <!-- ############################# 华丽的 分割线 ################################# -->
            <!-- SQL片段引用&传递pojo综合查询用户信息 -->
            <sql id="find_user_list_where">
                <where>
                    <if test="id != null">
                        and id =#{id}
                    </if>
                    <if test="username != null and username != ‘‘ ">
                        and username like ‘%${username}%‘
                    </if>
                </where>
            </sql>
            <select id="findUserList" parameterType="user" resultType="user">
                select * from user
                <include refid="find_user_list_where"/>
            </select>

            <!-- ############################# 华丽的 分割线 ################################# -->
            <!-- SQL片段 & 动态sql foreach语句 -->
            <sql id="user_field_list">
                id,username,birthday,sex,address
            </sql>
            <select id="findUseListByIds" parameterType="queryvo" resultType="user">
                select <include refid="user_field_list"/>
                    from user
                <where>
                    <foreach collection="ids" item="id" open="and id in(" close=")" separator=",">
                        #{id}
                    </foreach>
                </where>
            </select>
        </mapper>

    测试文件 UserMapperTest:
        public class UserMapperTest {

            private SqlSessionFactory sqlSessionFactory = null;
            @Before
            public void init() throws Exception {
                //第一步:创建一个SQLSessionFactoryBuilder对象。
                SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
                //第二步:加载配置文件。
                InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
                //第三步:创建SQLSessionFactory对象
                sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
            }

            @Test
            public void findUserByQueryVoTest() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                //获取mapper的代理对象
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                //创建QueryVo对象
                QueryVo queryVo=new QueryVo();
                //创建User对象
                User user=new User();
                user.setId(10);
                queryVo.setUser(user);
                //根据queryvo查询客户
                User u  = userMapper.getUserByQueryVo(queryVo);
                System.out.println(u);
                sqlSession.close();
            }

            @Test
            public void findUserCountTest() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

                int count = userMapper.findUserCount();
                sqlSession.close();
                System.out.println(count);
            }

            @Test   //动态Sql测试
            public void findUserListTest() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

                User user=new User();
                user.setId(10);
                user.setUsername("张");
                List<User> userList = userMapper.findUserList(user);

                //循环遍历
                for (User user2 : userList) {
                    System.out.println(user2);
                }
                sqlSession.close();
            }

            @Test   //动态Sql测试
            public void findUseListByIdsTest() {
                SqlSession sqlSession = sqlSessionFactory.openSession();
                UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                QueryVo queryVo=new QueryVo();
                List<Integer> ids = new ArrayList<>();
                ids.add(1);//查询id为1的用户
                ids.add(10); //查询id为10的用户
                queryVo.setIds(ids);

                List<User> userList = userMapper.findUseListByIds(queryVo);

                //循环遍历
                for (User user2 : userList) {
                    System.out.println(user2);
                }
                sqlSession.close();
            }
        }
    

项目结构图

原文地址:https://www.cnblogs.com/miantiao312/p/9649486.html

时间: 2024-08-24 10:51:03

Mybatis学习(五)的相关文章

mybatis 学习五 二级缓存不推荐使用

mybatis 二级缓存不推荐使用 一 mybatis的缓存使用. 大体就是首先根据你的sqlid,参数的信息自己算出一个key值,然后你查询的时候,会先把这个key值去缓存中找看有没有value,如果有,直接返回出来,就不查询db了.如果没有,那么查询db,然后将key,value保存到缓存中,以便下次使用. 1.1mybatis的一级缓存是基于sqlsession为生命周期的 当你这个session没有了,缓存就没有了,其次当你sql执行!isselect语句的时候,缓存也会被直接全部清理掉

mybatis学习 (五) POJO的映射文件

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 1.parameterType(输入类型) 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型.#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?.例如: <select id="findUserById" parameterType=&qu

Mybatis学习五($和#区别以及其他tips)

1.$和#区别 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'. 2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文件复制到src/main/webapp下,删掉WebContent 5.修改Deployment Assembly 6.测试 二.mybatis访问mysql 1.数据库准备 2.修改pom.xml 3.创建实体类 4.创建访问接口 5.添加映射文件 6.添加MyBatisCfg.xml配置文件,注

MyBatis MapperScannerConfigurer配置――MyBatis学习笔记之八

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八 2012-09-02 20:01:42 标签:Spring MyBatis MapperScannerConfigurer bean默认命名 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://legend2011.blog.51cto.com/3018495/980150 在上一篇博文的示例中,我们在beans.xml中配置了stu

Mybatis学习第一天

Mybatis第一天 2      MyBatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.

MyBatis学习笔记(一)

相关使用文件的下载地址:http://pan.baidu.com/s/1mgiXI1y 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 Public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加载数据库驱动 Cla

mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下)

继续 mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上) 五.使用监听器启动Spring容器 1.修改pom.xml文件,添加Spring-web 2.修改web.xml,配置启动Spring容器 3.新建BookServer 4.新建BookServlet 5.修改ApplicationContext.xml 6.测试 继续!!! 五.使用监听器启动Spring容器 1.修改pom.xml,添加Spring-web包(注:上一篇中的pom

Mybatis 学习总结

1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //