mybaties的批量增删改查及普通增删改查

数据库:

create table school(
    id int(11) not null auto_increment comment ‘主键‘,
    name varchar(20) comment ‘学校名称‘,
    address varchar(100) comment ‘学校地址‘,
    create_time datatime comment ‘数据上传时间‘,
    primary key (id)
)

实体类:

package com.test.entity;
public class School{
    private Integer id;//主键id
    private String name;//学校名称
    private String address//学校地址
    private Date createTime//数据上传时间
}

现在开始添加功能

mybaties: schooMapper.xml:

<mapper namespace="com.test.dao.SchoolMapper">
    <resultMap type="com.test.entity.School" id="schoolMap">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="address" property="address" jdbcType="VARCHAR"/>
        <result column="create_time" property="createTime" jdbcType="DATE"/>
    </resultMap>
    <sql id="s_sql" >
        name,address,create_time
    </sql>
    
    <!-- 普通的插入数据不能返回id -->
    <insert id="save" parameterType="com.test.entity.School">
        insert into school (<include refid="s_sql"/>)values(#{name},#{address},#{createTime})
    </insert>
    
 </mapper>

下面的可以返回id,但是需要主键为自增(id在这儿要不要都可以)

<!-- 插入数据返回id,方法一  这个需要是自增的id -->
    <insert id="saveReturnIdOne" parameterType="com.test.entity.School" useGeneratedKeys="true" keyProperty="id">
        insert into school (id,<include refid="s_sql"/>)values(#{id},#{name},#{address},#{createTime})
    </insert>

这个第二种添加可以返回主键id的,好像是返回添加的最后一个id--不需要自增(这个不确切知道)

<!-- 插入数据返回id,方法一  这个返回最后添加的一条id -->
    <insert id="saveReturnIdTwo" parameterType="com.test.entity.School"                    useGeneratedKeys="true">
        insert into school (<include refid="s_sql"/>)values(#{name},#{address},#{createTime})
        <selectKey keyProperty="id"  resultType="int" order="AFTER" >
           SELECT LAST_INSERT_ID() AS VALUE
        </selectKey>
    </insert>

--------现在开始批量添加

<!-- 这个批量插入数据    -->
    <insert id="bathSave" parameterType="java.util.List">
        insert into school (<include refid="s_sql"/>)values
       <foreach collection="list" index="index" item="l" separator=",">
           (#{l.name},#{l.address},#{l.createTime})
       </foreach>
    </insert>

java代码:

public int save(School test);
public int saveReturnIdOne(School test);
public int saveReturnIdTwo(School test); 
public void bathSave(List<School> list);

现在开始删除功能

<!-- 这个普通删除数据    -->
    <delete id="deleteById" parameterType="java.lang.Integer">
        delete from school where id=#{id}
    </delete>
    <!-- 这个批量删除数据    -->
    <delete id="bathDelete" parameterType="java.util.List">
        delete from school where id in
        <foreach collection="list" index="index" item="l" open="(" close=")" separator=",">
            #{l}
        </foreach>
    </delete>

java代码:

    public int deleteById(Integer list);
    public int bathDelete(List<Integer> list);

现在开始修改功能

<!-- 普通修改      -->
<update id="update" parameterType="com.test.entity.School">
        update school set name=#{name}, address=#{address}, create_time=#{createTime} where id=#{id,jdbcType=INTEGER}
</update>
    <!-- 有选择性的修改数据  -->
    <update id="updateSet" parameterType="com.test.entity.School">
        update school
        <set>
            <if test="name != null">
                name=#{name},
            </if>
            <if test="address !=null ">
                address=#{address},
            </if>
            <if test="createTime !=null ">
                create_time=#{createTime}
            </if>
        </set>
        where id=#{id}
    </update>
    <!--  这个批量修改需要在数据库的url后面拼接 &allowMultiQueries=true 意思是同时执行多条,否则报错  -->
    <update id="bathUpdate" parameterType="java.util.List">
        <foreach collection="list" index="index" item="l" open="" close="" separator=";">
            update school 
            <set>
                <if test="l.name != null">
                    name=#{l.name},
                </if>
                <if test="l.address !=null ">
                    address=#{l.address},
                </if>
                <if test="l.createTime !=null ">
                    create_time=#{l.createTime}
                </if>
            </set>
             where id=#{l.id,jdbcType=INTEGER}
        </foreach>
    </update> 
    
    <!--  还有一种批量修改多个id,即 id in(1,2,3,4) 方法类同批量删除,这里不写了  -->

java代码:

public void update(TestEntity test);
public void updateSet(TestEntity test);
public void bathUpdate(List<TestEntity> list);

现在开始查询功能

xml:

<!--  根据id查询一条  -->
<select id="getById" resultMap="schoolMap" >
        select id,<include refid="s_sql"/> from school where id =#{id}
</select>
<!--  根据地址分页查询  -->
<select id="getLimit" resultMap="schoolMap" parameterType="java.util.Map">
    select id,<include refid="s_sql"/> from school where address=#{address} limit #{begin},#{end}
</select>
<!--  根据名字模糊查询  -->
<select id="getLikeName" resultMap="schoolMap">
        select id,<include refid="s_sql"/> from school where name like concat(‘%‘,#{name},‘%‘)
</select>
<!--  根据名字模糊查询所有id集合  -->
<select id="getIdsLikeName" resultType="java.lang.String">
        select group_concat(id) from school  where name like concat(‘%‘,#{name},‘%‘)
</select>
<!--  根据实体类属性选择查询  -->
<select id="getWhere" resultMap="schoolMap">
        select id,<include refid="s_sql"/> from school
        <where>
            <if test="id != null">
                id=#{id}
            </if>
            <if test="name != null">
                and name=#{name}
            </if>
            <if test="address !=null ">
                and address=#{address}
            </if>
            <if test="createTime !=null ">
                and create_time=#{createTime}
            </if>
        </where>
</select>

java代码:

public School getById(Integer id);
public List<School > getLimit(Map<String, Object> map);
public List<School > getLikeName(String name);
public String getIdsLikeName(String name);
public List<School > getWhere(School test);

下面是从其它地方看到:

同时执行多条sql的办法:

1、最简单的办法:在MySQL的连接字符串中设置allowMultiQueries参数置为true。(只有MySQL Connector/J 3.1.1以上版本才支持) 。例如:在jdbc下设置连接字符串的时候设成如下的形式:
      jdbc:mysql://192.168.3.180/sample?user=root&password=&allowMultiQueries=true就可以执行多条语句了
 在odbc下也是可以设置的,方法如下:
设置 ODBC -- 配置 --Detials -- Flags 3 -- 钩上 Allow multiple statements,这样就可以了。
结论:第一种方式最简单。
2、在程序中对SQL语句以分号拆分成多条SQL语句,然后使用Statement的addBatch方法,最后executeBatch就行。
希望对以后遇到此类问题的朋友有所帮助。

关于Statement的execute(String sql)语句能够同时执行多条SQL语句, 可以看MySQL自带的测试例子:

可查看testsuite.regression包下的ResultSetRegressionTest类:  这个可以查看:MySQL for Java的SQL注入测试

 public class ResultSetRegressionTest extends BaseTestCase {    
    public void testBug33678() throws Exception {    
        if (!versionMeetsMinimum(4, 1)) {    
            return;    
        }    
        createTable("testBug33678", "(field1 INT)");    
        // allowMultiQueries=true设置    
        Connection multiConn = getConnectionWithProps("allowMultiQueries=true");    
        Statement multiStmt = multiConn.createStatement();    
        try {    
            multiStmt.setFetchSize(Integer.MIN_VALUE);    
            // 一次性执行多条SQL语句    
            multiStmt.execute("SELECT 1 UNION SELECT 2; INSERT INTO testBug33678 VALUES (1); UPDATE testBug33678 set field1=2; INSERT INTO testBug33678 VALUES(3); UPDATE testBug33678 set field1=2 WHERE field1=3; UPDATE testBug33678 set field1=2; SELECT 1");     
    // 以下代码省略...    
    }    
}

还可以查看英文API   Mapper XML Files

时间: 2024-11-05 20:37:16

mybaties的批量增删改查及普通增删改查的相关文章

前缀方式增1和后缀方式增1的区别

增量运算符++属于一元运算符,增量运算符可以出现在变量的前面作为前缀,也可以出现在变量的后面作为后缀.两者有何区别呢? 前缀方式加1 先使用前缀方式加1,并把前缀方式加1后变量的值赋值给另外一个临时变量temp. static void Main(string[] args) { int num1 = 0; while (num1 < 3) { int temp; Console.WriteLine("变量num1的值是:" + num1.ToString()); temp =

【并查集&amp;&amp;带权并查集】BZOJ3296&amp;&amp;POJ1182

bzoj1529[POI2005]ska Piggy banks [题目大意] n头奶牛m种语言,每种奶牛分别掌握一些语言.问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流? [思路] (n+m)个点,奶牛学会某种语言就合并它和语言的节点.并查集维护联通块,答案为联通块个数-1.水,可是我跳坑了. 我一开始做法是设总的联通块有(n+m)个,然后没合并一次减去1.其实这样是不可行的,因为我们只需要考虑奶牛(即节点1..n)有几个联通块.有可能一些语言根本没有任何奶牛掌握-- 1 #in

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物

[bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2*10^4 Input Output Sample Input 5 6 1 1 2 3 1 2 2 0 3 1 2 2 1 3 1 2 Sample Output 1 0 1 Solution 用rope实现可持久化数组,用rope的历史记录功能实现可持久化并查集,通过时间168ms

sqlite3自增key设定(创建自增字段)

在用sqlite设计表时,每个表都有一个自己的整形id值作为主键,其实可以不指定这 么一个id值,sqlite内部本来就会为每个表加上一个 rowid,这个rowid可以当成一个隐含的字段使用,但是由sqlite引擎来维护的,在 3.0以前rowid是32位的整数,3.0以后是 64位的整数,为什么不直接使用这个内部的rowid作为每个表的id主键呢. 相关的文档在这里:?http://www.sqlite.org/autoinc.html?http://www.sqlite.org/faq.h

并查集,以及可拆分并查集

普通并查集. 合并 均摊O(α(n)) 查询 均摊O(α(n)) 1 //常用版本 2 3 //Union Find 4 int f[1005000]; 5 6 void INIT(int size) 7 { for(int i=0;i<=size;i++) f[i]=i; } 8 9 int findf(int x) 10 { return f[x]==x ? x : f[x]=findf(f[x]); }; 11 12 int connect(int x) 13 { f[findf(a)]=

重置SQLSERVER表的自增列,让自增列重新计数

SQL的自增列挺好用,只是开发过程中一旦删除数据,标识列就不连续了 写起来 也很郁闷,所以查阅了一下标识列重置的方法 发现可以分为三种: --- 删除原表数据,并重置自增列truncate table tablename  --truncate方式也可以重置自增字段--重置表的自增字段,保留数据DBCC CHECKIDENT (tablename,reseed,0) -- 设置允许显式插入自增列SET IDENTITY_INSERT tablename  ON -- 当然插入完毕记得要设置不允许

IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总:

http://cn.bing.com/search?q=ip%3A220.181.111.85 http://dns.aizhan.com/?q=www.baidu.com http://domains.yougetsignal.com/domains.php?remoteAddress=lcx.cc http://i.links.cn/sameip/61.164.241.103.html http://ip.robtex.com/ http://rootkit.net.cn/index.asp

BZOJ 4195: [Noi2015]程序自动分析 [并查集 离散化 | 种类并查集WA]

题意: 给出若干相等和不等关系,判断是否可行 woc NOI考这么傻逼的题飞快打了一个种类并查集交上了然后爆零... 发现相等和不等看错了异或一下再叫woc90分 然后发现md$a \neq b, a \neq c,不能得到b = c$ 老老实实的把所有相等关系加并查集然后不等关系来判断吧,唉 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using