澳门金沙vip 4

澳门金沙vipmssql 一遍向表中插入多条数据的不二等秘书技分享 (转自:http://www.maomao365.com/?p=6058)

转自:)

动态SQL

动态sql,重要用以化解查询条件不分明的情事:在程序运营时期,按照客户提交的查询条件进行查询。提交的询问条件分歧,施行的sql语句分化。若将各样也许的状态均逐个列出,对具有准绳实行排列组合,将会出现多量的sql语句。此时,可采用动态sql来消除那样的主题材料

澳门金沙vip 1

顾客自定义查询.PNG

动态sql,即通过MyBatis提供的种种标签对准则作出剖断以落到实处拼接sql语句

此地的标准决断使用的表明式为OGNL说明式。常用的动态SQL标签有<if>、<where>、<choose/>、<foreach>等。

1.实体类:

public class Student {

    private Integer id;
    private String name;
    private int age;
    private double score;
    //无参构造器与带参构造器
    //getter 和 setter
    //toString()
}

2.测试类

public class MyTest {

    private IStudentDao dao;
    private SqlSession session;

    @Before
    public void setUp(){
        session = MyBatisUtils.getSqlSession();
        dao = session.getMapper(IStudentDao.class);
    }

    @After
    public void tearDown(){
        if(session!=null){
            session.close();
        }
    }
}

注意事项:

在mapper的动态sql中若出现超越号(>)、小于号(<)、大于等于号(>=)、小于等于号(<=)等标识,最棒将其转移为实体符号。否则,xml可能会油不过生深入分析出错难题。

澳门金沙vip 2

轮换法规.PNG

1.<if/>标签

对于该标签的施行,当test的值为true时,会将其包括的sql片段拼接到其后所在的sql语句中。

例:查询出知足客户提交查询条件的兼具学员。客户提交的查询条件能够满含壹位名的模糊查询,同一时候还足以分包四个岁数的下限。当然,客商在付出表单时只怕四个条件均作出了设定,也只怕多个原则均不做设定,也得以只做个中一项设定。

询问条件不鲜明,查询条件注重于客商提交的源委。此时,就可使用动态sql语句,根据客户提交内容对将要实行的sql举行拼接。

dao接口:

public interface IStudentDao {      
    List<Student> selectStudentsIf(Student student) 
}

照耀文件:

<select id="selectStudentsIf" resultType="Student">
    select * from student
    where 1=1
    <if test="name !=null and name!=''">
        and name like '%' #{name} '%'
    </if>
    <if test="age > 0">
        and age > #{age}
    </if>
</select>

测试类:

@Test
public void test01(){
    Student student = new Student();
    List<Student> students = dao.selectStudentsIf(student);
    System.out.println(students);
}

2.<where/>标签

dao接口:

public interface IStudentDao {

    List<Student> selectStudentsIf(Student student);
    List<Student> selectStudentsWhere(Student student);
}

辉映文件:

<select id="selectStudentsWhere" resultType="Student">
    select * from student
    <where>
        <if test="name!=null and name!=''">
            and name like '%' #{name} '%'
        </if>
        <if test="age > 0">
            and age > #{age}
        </if>
    </where>
</select>

测试:

@Test
public void test02(){
    Student student = new Student();
    List<Student> students = dao.selectStudentsWhere(student);
    System.out.println(students);
}

3.<choose/>标签

该标签只可以够包涵<when/><otherwise/>,能够包括八个<when/>与叁个<otherwise/>。他们合伙利用,完毕java中的按钮语句switch..case功能。

急需:若姓名不空,则按姓名查询;若姓名字为空,则按年龄查询;若未有询问条件,则从未询问结果。

dao接口:

public interface IStudentDao {

    List<Student> selectStudentsIf(Student student);
    List<Student> selectStudentsWhere(Student student);
    List<Student> selectStudentsChoose(Student student);
}

炫丽文件:

对于<choose/>标签,其会从第二个<when/>开端每一种向后张开规范化剖断。若出现<when/>中的test属性值为true的情事,则一贯甘休<choose/>标签,不再向后开展剖断查找。若有所<when/>的test判别结果均为false,则最后会实行<otherwise/>标签。

<select id="selectStudentsChoose" resultType="Student">
    select * from student
    <where>
        <choose>
            <when test="name!=null and name!=''">
                and name like '%' #{name} '%'
            </when>
            <when test="age>0">
                and age < #{age}
            </when>
            <otherwise>
                and 1 != 1
            </otherwise>
        </choose>
    </where>
</select>

测试类:

@Test
public void test03(){
    Student student = new Student();
    List<Student> students = dao.selectStudentsChoose(student);
    System.out.println(students);
}

4.<foreach/>标签–遍历数组

<foreach/>标签用于落到实处对于数组于集中的遍历。对其应用,必要小心:

  • collection表示要遍历的集中类型,这里是数组,即array
  • open、close、separator为对遍历内容的SQL拼接

dao接口:

public interface IStudentDao {

    List<Student> selectStudentsIf(Student student);
    List<Student> selectStudentsWhere(Student student);
    List<Student> selectStudentsChoose(Student student);
    List<Student> selectStudentsForeachArray(Object[] studentIds);
}

照耀文件

动态sql的判断中使用的都以OGNL表明式。OGNL表达式中的数组使用array表示,数老总度使用array.length表示。

<select id="selectStudentsForeachArray" resultType="Student">
    select * from student
    <if test="array !=null and array.length >0">
        where id in
        <foreach collection="array" open="(" close=")" item="myid" separator=",">
            #{myid}
        </foreach>
    </if>
</select>

澳门金沙vip 3

foreach标签.PNG

测试类:

@Test
public void test04(){   
    Object[] studentIds = new Object[]{1,3};
    List<Student> students = dao.selectStudentsForeachArray(studentIds);
    System.out.println(students);
}

5.<foreach/>标签–遍历泛型为中央项指标List

dao接口:

public interface IStudentDao {

    List<Student> selectStudentsIf(Student student);
    List<Student> selectStudentsWhere(Student student);
    List<Student> selectStudentsChoose(Student student);
    List<Student> selectStudentsForeachArray(Object[] studentIds);
    List<Student> selectStudentsForeachList(List<Integer> studentIds);
}

照耀文件:

OGNL表达式中的List使用list表示,其大小使用list.size表示。

<select id="selectStudentsForeachList" resultType="Student">
    select * from student
    <if test="list!=null and list.size > 0">
        where id in
        <foreach collection="list"  open="(" close=")" item="myid" separator=",">
            #{myid}
        </foreach>
    </if>
</select>

测试类:

@Test
public void test05(){
    List<Integer> studentIds = new ArrayList<Integer>();
    student.add(1);
    student.add(3);

    List<Student> students = dao.selectStudentsForeachList(studentIds);
    System.out.println(students);   
}

6.<foreach/>标签–遍历泛型为自定义类型的List

dao接口:

List<Student> selectStudentsForeachList2(List<Student> students);

辉映文件:

注意,这里的此时此刻遍历对象类型是List中的泛型,正是Student对象。

<select id="selectStudentsForeachList2" resultType="Student">
    <!-- select * from student where id in(1,3) -->
    select * from student
    <if test="list!=null and list.size > 0">
        where id in
        <foreach collection="list"  open="(" close=")" item="stu" separator=",">
            #{stu.id}
        </foreach>
    </if>
</select>

测试类:

@Test
public void test09(){
    Student student1 = new Student();
    student1.setId(1);
    Student student3 = new Student();
    student3.setId(3);

    List<Student> students = new ArrayList<Student>();
    students.add(student1);
    students.add(student3);

    students = dao.selectStudentsForeachList2(students);
    System.out.println(students);
}

7.<sql/>标签

<sql/>标签用于定义sql片段,以便另外sql标签复用。而任何标签使用该SQL片段,须求使用<include/>子标签。该<sql/>标签能够定义SQL语句中的任何部分,所以<include/>子标签能够放在动态sql的别样地方

dao接口:

List<Student> selectStudentsBySQLFragment(List<Student> students);

辉映文件:

澳门金沙vip 4

使用sql片段.PNG

测试类:

@Test
public void test09(){
    Student student1 = new Student();
    student1.setId(1);
    Student student3 = new Student();
    student3.setId(3);

    List<Student> students = new ArrayList<Student>();
    students.add(student1);
    students.add(student3);

    students = dao.selectStudentsBySQLFragment(students);
    System.out.println(students);
}

<!DOCTYPE mapper

<span style=”font-size:16px;font-weight:bold;”>
摘要:
在mssql中,一条sql语句默认为叁个事务,下文显示怎么样在一条sql语句中,插入多行数据
</span>
<hr />
例:
 

单表的CULX570D操作(使用mapper动态代理)

MyBatis框架抛开dao的达成类,直接定位到映射文件mapper的附和sql语句,对DB实行操作。这种dao的贯彻形式改为mapper的动态代理格局。

mapper动态代理格局不供给程序猿完结dao接口。接口是由MyBatis结合映射文件自动生成的动态代理落成的。

1.映射文本的namespace属性值

一般情况下,七个dao接口的落到实处类情势运用的是同贰个sql映射文件中的sql映射id。所以,MyBatis框架供给,将映射文件中<mapper/>标签的namespace属性设为dao接口的全类名,则系统会依附办法所属dao接口,自动到对应namespace的炫丽文件中找寻有关的sql映射。

一言以蔽之的话,通过接口名就能够定位到映射文件mapper。

2.改变日志输出调控文件

mapper的namespace修改了,则要求将日志输出调控文件中的logger的出口对象开展改换

##define a logger
#log4j.logger.namespace_value=trace,console
log4j.logger.com.hcx.dao.IStudentDao=trace,console

3.dao接口办法名

MyBatis框架须要,接口中的方法名,与映射文件中相应的sql标签的id值同样。系统会自动依照章程名到对应的投射文件中探究同名的sql映射id。

轻便易行来讲,通过措施名就可一定到映射文件mapper中相应的sql语句。

接口:

public interface IStudentDao {

    int insertStudent(Student student); 
    void deleteStudentById(int id);
    void updateStudent(Student student);

    List<Student> selectAllStudents();
    Map<String, Object> selectAllStudentsMap();

    Student selectStudentById(int id);
    List<Student> selectStudentsByName(String name);

}

映射:

<select id="selectStudnetById" parameterType="int" resultType="com.hcx.beans.Student">
    select id,name,age,score,birthday from student where id=#{id}
</select>

4.dao指标的获取

利用时,只需求调用Sqlsession的getMapper()方法,就能够获取钦定接口的完结类对象。该方法的参数为钦赐dao接口类的class值。

session = factory.openSession();
dao = session.getMapper(IStudentDao.class);

5.删除dao实现类

出于通过调用dao接口的法子,不只好够从sql映射文件中找到所要实施sql语句,还可通过措施参数及再次来到值,将sql语句的动态参数字传送入,将查询结果回到。所以,dao的贯彻专门的学问,完全可以由MyBatis系统自动依据映射文件完毕。所以,dao的实现类就不再须求了。

dao达成指标是由jdk的proxy动态代理自动生成的。

6.测试类

1.在before注解方法中赢获得Sqlsession对象后,通过Sqlsession的getMapper方法创立dao接口兑现类的动态代理对象。在after表明方法中关闭Sqlsession对象。

public class MyTest {

    private IStudentDao dao;
    private SqlSession session;

    @Before
    public void setUp(){
        session = MyBatisUtils.getSqlSession();
        dao = session.getMapper(IStudentDao.class);
    }

    @After
    public void tearDown(){
        if(session!=null){
            session.close();
        }
    }
}

2.增加Sqlsession的交付方法

在增删改测验方法的末段,增加Sqlsession的commit方法,完结提交。

@Test
public void test01(){
    Student student = new Student("张三",23,99.8);
    dao.insertStudent(student);
    session.commit();
}

@Test
public void test02(){
    Student student = new Student("张三",23,99.8);
    dao.insertStudentCatchId(student);
    System.out.println("student="+student);
    session.commit();
}

@Test
public void test03(){
    dao.deleteStudentById(3);   
    session.commit();
}

3.刨除selectStudentMap()方法测量检验

MyBatis框架对于dao查询的自发性完成,底层只会调用selectOne与selectList()方法。而框架选拔格局的正规化是测量试验类中客商收取再次回到值得对象类型。若接收类型为list,则自动选用selectList()方法;不然,自动选用selectOne()方法。

接受类型为map,所以框架接纳了selectOne()方法,会报错。

7.多查询条件非常的小概完整接收难点的消除

在事实上海工业作中,表单中所给出的查询条件一时是心余力绌将其包装为二个目的的,约等于说,查询艺术只好指引多个参数,而无法辅导将着这多少个参数实行打包的四个指标。对于这些标题,有三种缓和方案。

方案一:将那四个参数封装为贰个map

将那四个参数封装为三个Map<String,Object>,依据Map进行查询。

1.dao接口

List<Student> selectStudentByMap(Map<String, Object> map);

2.测试类

@Test
public void test10(){
    Map<String, Object> map = new HashMap<String,Object>();
    map.put("nameCondition", "张");
    map.put("ageCondition",22);

    List<Student> students = dao.selectStudentByMap(map);
    for (Student student : students) {
        System.out.println(student);
    }
}

3.修改映射文件

<select id="selectStudentByMap" resultType="Student">
    select *from student
    where name like '%' #{nameCondition} '%'
    and age > #{ageCondition}
</select>

方案二:三个参数各个接收

对此mapper中的SQL语句,能够由此参数索引#{index}的点子挨个接收每一种参数。

1.dao接口

List<Student> selectStudentByConditions(String name,int age);

2.测试类

@Test
public void test11(){
    List<Student> students = dao.selectStudentByConditions("张", 22);
    for (Student student : students) {
        System.out.println(student);
    }
}

3.映射文件

<select id="selectStudentByconditions" resultType="Student">
    select * from student
    where name like '%' #{0} '%'
    and age > #{1}
</select>

<dependency>

create table test (keyId int identity,info varchar(10))
go
insert into test(info) values('a'),('b'),('ac'),('ad'),('e')
----采用在每个插入的value后面加入一个逗号
go
select * from test 
go
truncate table test 
drop table test 

     <!– id:唯一标记二个运作意况 –>

 

“;

     id:独一标志名称

         <transactionManager type=“JDBC” />

<!– 依据客户Id查询客户,表达:

</environments>

             <property name=“url”
value=“jdbc:mysql://127.0.0.1:3306/79_mybatis” />

<?xml version=“1.0” encoding=“UTF-8” ?>

<configuration>

2.2策画布置文件sqlMapConfig.xml(mybatis的主配置文件)

2.5.2.mapper映射文件正是客户配置的Java对象与sql语句的相应关系

     <environment id=“development”>

     <artifactId>mybatis</artifactId>

一. 简介

     </environment>

<!DOCTYPE configuration

PUBLIC “-//mybatis.org//DTD Config 3.0//EN”

<!–mybatis针对种种sql语句:新扩充/修改/删除/查询,

</select>

         </dataSource>