02 mybatis动态sql(xml方式实现单表的增删改查)

版权声明:转载需经过作者同意,请尊重原创 https://blog.csdn.net/woshilovetg/article/details/85386273

QueryVo

package cn.itcast.domain;

import java.io.Serializable;

import java.util.List;

public class QueryVo implements Serializable {

    private List<Integer> ids;

    public List<Integer> getIds() {

        return ids;

    }

    public void setIds(List<Integer> ids) {

        this.ids = ids;

    }

    @Override

    public String toString() {

        return "QueryVo{" +

                "ids=" + ids +

                '}';

    }

}

User.java

package cn.itcast.domain;

import java.io.Serializable;

import java.util.Date;

/**

 *

 */

public class User implements Serializable {

  /*  private Integer id;

    private String username;

    private String address;

    private String sex;

    private Date birthday;

    public User() {

    }

    public Integer getId() {

        return id;

    }

    public void setId(Integer id) {

        this.id = id;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getAddress() {

        return address;

    }

    public void setAddress(String address) {

        this.address = address;

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex;

    }

    public Date getBirthday() {

        return birthday;

    }

    public void setBirthday(Date birthday) {

        this.birthday = birthday;

    }

    @Override

    public String toString() {

        return "User{" +

                "id=" + id +

                ", username='" + username + '\'' +

                ", address='" + address + '\'' +

                ", sex='" + sex + '\'' +

                ", birthday=" + birthday +

                '}';

    }*/

//*************************************************************************************************************************************************************

    private Integer userId;

    private String userName;

    private String userAddress;

    private String userSex;

    private Date userBirthday;

    public Integer getUserId() {

        return userId;

    }

    public void setUserId(Integer userId) {

        this.userId = userId;

    }

    public String getUserName() {

        return userName;

    }

    public void setUserName(String userName) {

        this.userName = userName;

    }

    public String getUserAddress() {

        return userAddress;

    }

    public void setUserAddress(String userAddress) {

        this.userAddress = userAddress;

    }

    public String getUserSex() {

        return userSex;

    }

    public void setUserSex(String userSex) {

        this.userSex = userSex;

    }

    public Date getUserBirthday() {

        return userBirthday;

    }

    public void setUserBirthday(Date userBirthday) {

        this.userBirthday = userBirthday;

    }

    @Override

    public String toString() {

        return "User{" +

                "userId=" + userId +

                ", userName='" + userName + '\'' +

                ", userAddress='" + userAddress + '\'' +

                ", userSex='" + userSex + '\'' +

                ", userBirthday=" + userBirthday +

                '}';

    }

    public static void main(String[] args) {

        System.out.println("000");

    }

}

IUserDao.java

package cn.itcast.dao;

import cn.itcast.domain.QueryVo;

import cn.itcast.domain.User;

import java.util.List;

/**

 * 用户接口

 */

public interface IUserDao {

    //根据用户信息,查询用户列表

    public List<User> findUser(User user);

    //传入多个 id 查询用户信息

    public List<User> findUsersByIds(List<Integer> list);

    //传入多个 id 查询用户信息(多个id放入list,在将list作为Queryvo的属性)

    public List<User> findUsersByIds1(QueryVo queryVo);

    //修改用户

    public void updateUser(User user);

    //新增用户

    public void addUser(User user);

}

IUserDao.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="cn.itcast.dao.IUserDao">

    <!--配置user类的属性和user表中的列的对应关系(主要是解决表查询出来的字段名和pojo的属性名不一致)

      (type="user"是在SqlMapConfig中配置别名了,所以可以直接写user)-->

    <resultMap id="userMap" type="user">

    <!--注意column属性对应的是sql语句查询出来的字段名(或者起的别名),不是表中的字段-->

        <!-- 主键字段的对应 -->

        <id property="userId" column="id"></id>

        <!--非主键字段的对应-->

        <result property="userName" column="username"></result>

        <result property="userAddress" column="address"></result>

        <result property="userSex" column="sex"></result>

        <result property="userBirthday" column="birthday"></result>

    </resultMap>

    <!--抽取sql片段-->

    <sql id="user_sql">

        select * from user

    </sql>

    <!--根据用户信息,查询用户列表

     parameterType:参数类型

     resultMap:对应<resultMap>标签的id 

     -->

    <select id="findUser" parameterType="user" resultMap="userMap">

        <!--引用sql片段-->

        <include refid="user_sql"></include>

        <where>

            <if test="userName != null and userName != '' ">

                username = #{userName}

            </if>

            <if test="userSex != null and userSex != '' ">

                and sex = #{userSex}

            </if>

        </where>

    </select>

    <!--传入多个 id 查询用户信息(多个id放入list),如果采用这种做法,参数只能写 list 不推荐-->

   <!--foreach

        collection:需要遍历的集合

        item:每次遍历的对象

        open:循环开始输出的内容,只会输出一次

        close:循环结束输出的内容,只会输出一次

        separator:每次循环后,添加的内容,循环几次添加几次

             -->

    <select id="findUsersByIds" parameterType="java.util.List" resultMap="userMap">

        <!--引用sql片段-->

        <include refid="user_sql"></include>

        <!--select * from user where id in(42,43,45)-->

        <where>

            <if test="list != null and list.size() > 0">

                <foreach collection="list" item="id" open="id in  (" close=")" separator=",">

                    #{id}

                </foreach>

            </if>

        </where>

    </select>

    <!--传入多个 id 查询用户信息(多个id放入list,在将list作为Queryvo的属性)-->

    <!--使用这种sql语句进行查询select * from user where id in(42,43,45)-->

    <!--<select id="findUsersByIds1" parameterType="cn.itcast.domain.QueryVo" resultMap="userMap">

        <include refid="user_sql"></include>

        <where>

            <if test="ids != null and ids.size()>0">

                <foreach collection="ids" item="id" open="id in (" close=")" separator=",">

                    #{id}

                </foreach>

            </if>

        </where>

    </select>-->

    <!--传入多个 id 查询用户信息(多个id放入list,在将list作为Queryvo的属性)-->

    <!--使用这种sql语句进行查询select * from user where id = 42 or id = 43 or id = 45-->

    <select id="findUsersByIds1" parameterType="cn.itcast.domain.QueryVo" resultMap="userMap">

        <include refid="user_sql"></include>

        <where>

            <if test="ids != null and ids.size()>0">

                <foreach collection="ids" item="id" separator="or">

                    id = #{id}

                </foreach>

            </if>

        </where>

    </select>

    <!--修改用户  update user set sex = ?,username = ? where id = ?-->

    <update id="updateUser" parameterType="user">

        update user

        <set>

            <if test="userSex != null and userSex != '' ">

                sex = #{userSex},

            </if>

            <if test="userName != null and userName != '' ">

                username = #{userName}

            </if>

        </set>

        <where>

            <if test="userId != null and userId != '' ">

                id = #{userId}

            </if>

        </where>

    </update>

    <!--新增用户   insert into user (username,birthday,sex,address) VALUES(?,?,?,?)-->

    <insert id="addUser" parameterType="user">

        <!--新增成功之后,返回id-->

        <!--selectKey作用:

                   获取新增对象的id

                   order:在新增之后执行用(BEFORE),新增之前用(AFTER

                   mysql:自增,last_insert_id()  AFTER  ====>在新增成功之后,返回新增那条的id

                   UUID   uuid(); 一般在新增之前进行uuid的插入

                   resultType:返回主键ID的类型

                   keyProperty:模型类中主键的属性名

                   order:新增之前,还是新增之后

        -->

        <selectKey resultType="java.lang.Integer" keyProperty="userId" order="AFTER">

            select last_insert_id()

            <!--select uuid()-->

        </selectKey>

        insert into user (<include refid="insert_key"></include>) VALUES(<include refid="insert_value"></include>)

    </insert>

    <!--

    <trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>

    prefix:trim标签内sql语句加上前缀。

    suffix:trim标签内sql语句加上后缀。

    suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","

    prefixOverrides:指定去除多余的前缀内容

        userNameuserBirthday,userAddress为pojo属性名

   username,birthday,address,为数据库字段名

    -->

    <sql id="insert_key">

        <trim suffixOverrides=",">

            <if test="userName != null and userName != '' ">

                username,

            </if>

            <if test="userBirthday != null">

                birthday,

            </if>

            <if test="userSex != null and userSex != '' ">

                sex,

            </if>

            <if test="userAddress != null and userAddress != '' ">

                address,

            </if>

        </trim>

    </sql>

    <sql id="insert_value">

        <trim suffixOverrides=",">

            <if test="userName != null and userName != '' ">

                #{userName},

            </if>

            <if test="userBirthday != null">

                #{userBirthday},

            </if>

            <if test="userSex != null and userSex != '' ">

                #{userSex},

            </if>

            <if test="userAddress != null and userAddress != '' ">

                #{userAddress},

            </if>

        </trim>

    </sql>

</mapper>

MybatisTest.java

package test;

import cn.itcast.dao.IUserDao;

import cn.itcast.domain.QueryVo;

import cn.itcast.domain.User;

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.text.ParseException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

public class MybatisTest {

    private InputStream in;

    private IUserDao userDao;

    private SqlSession sqlSession;

    //在测试方法之前执行

    @Before

    public void init() {

        /**

         * ORM+SqlMapConfig+sqlSession

         */

        //加载配置文件

        in = MybatisTest.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        //创建构建者对象

        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //创建sqlSession工厂

        SqlSessionFactory sqlSessionFactory = builder.build(in);

        //创建sqlSession

        sqlSession = sqlSessionFactory.openSession();

        //获取代理对象

        userDao = sqlSession.getMapper(IUserDao.class);

    }

    //测试方法之后执行

    @After

    public void destory() throws IOException {

        //提交事务

        sqlSession.commit();

        //释放资源

        sqlSession.close();

        in.close();

    }

    //根据用户信息,查询用户列表

    @Test

    public void testFindUser() {

        User user = new User();

        user.setUserName("李四");

        user.setUserSex("");

        List<User> list = userDao.findUser(user);

        for (User user1 : list) {

            System.out.println(user1);

        }

    }

    //传入多个 id 查询用户信息(多个id放入list)

    @Test

    public void testFindUsersByIds() {

        List<Integer> ids = new ArrayList<Integer>();

        ids.add(42);

        ids.add(45);

        List<User> list1 = userDao.findUsersByIds(ids);

        for (User user1 : list1) {

            System.out.println(user1);

        }

    }

    //传入多个 id 查询用户信息(多个id放入list,在将list作为Queryvo的属性)

    @Test

    public void testFindUsersByIds1() {

        List<Integer> list = new ArrayList<Integer>();

        list.add(42);

        list.add(43);

        list.add(45);

        QueryVo queryVo = new QueryVo();

        queryVo.setIds(list);

        List<User> userList = userDao.findUsersByIds1(queryVo);

        for (User user : userList) {

            System.out.println(user);

        }

    }

    //修改id42的用户的性别为男,地址为中国

    @Test

    public void testUpdateUser(){

        User user = new User();

        user.setUserSex("");

        user.setUserName("韩晓峰");

        user.setUserId(43);

        userDao.updateUser(user);

    }

    //新增用户

    @Test

    public void testAddUser() throws ParseException {

        User user = new User();

        user.setUserName("张莹莹");

        user.setUserAddress("陕西咸阳");

        user.setUserSex("");

        Date date = new Date();

        user.setUserBirthday(date);

        userDao.addUser(user);

    }

}

db.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/mybatis

jdbc.username=root

jdbc.password=123456

log4j.properties

此文件可以输出到文件

# Set root category priority to INFO and its only appender to CONSOLE.

#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal

#输出到log文件中(d:\axis.log文件中)

#log4j.rootCategory=debug, CONSOLE, LOGFILE

#只输出到控制台

log4j.rootCategory=debug, CONSOLE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.

log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# 日志输出到控制台

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

# 日志输出到指定文件,根路径/

log4j.appender.LOGFILE=org.apache.log4j.FileAppender

log4j.appender.LOGFILE.File=/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

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 1.可以在标签内部配置连接数据库的信息。

                       2.也可以通过属性引用外部配置文件信息,url属性或者resource属性

                        resource属性: 常用的 用于指定配置文件的位置,是按照类路径的写法来写,并且必须存在于类路径下-->

    <!--<properties url="file:///D:/ideaProject/mybatis02/src/main/resources/db.properties" >--><!--file://这是一种文件协议(windows)-->

    <properties resource="db.properties">

        <!--标签内部配置数据库连接信息(不推荐)-->

        <!-- <property name="driver" value="com.mysql.jdbc.Driver"></property>

                    <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>

                    <property name="username" value="root"></property> <property name="password"

                    value="1234"></property> -->

    </properties>

    <!--配置别名-->

    <!--使用typeAliases配置别名,它只能配置domain中类的别名 -->

    <typeAliases>

        <!--1.typeAlias用于配置别名。type属性指定的是实体类全限定类名。alias属性指定别名,当指定了别名就不再区分大小写-->

        <!--<typeAlias type="cn.itcast.domain.User" alias="user"></typeAlias>-->

        <!-- 用于指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写 -->

        <package name="cn.itcast.domain"></package>

    </typeAliases>

    <!-- 配置 mybatis 的环境 -->

    <environments default="mysql">

        <environment id="mysql">

            <!-- 配置事务的类型 -->

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

    <!-- 告知 mybatis 映射配置的位置 -->

    <mappers>

        <!--此种方法要求 r mapper  接口名称和 r mapper-->

        <!--<mapper class="cn.itcast.dao.IUserDao"></mapper>-->

        <!--<mapper resource="cn/itcast/dao/IUserDao.xml"></mapper>-->

        <!-- package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class,大大减少开发时间 -->

        <!--此种方法要求marpper接口名称和mapper映射文件名称相同,且放在同一个目录中-->

        <package name="cn.itcast.dao"></package>

    </mappers>

</configuration>

猜你喜欢

转载自blog.csdn.net/woshilovetg/article/details/85386273