xml地图|网站地图|网站标签 [设为首页] [加入收藏]
当前位置: www8029com > 澳门新葡8522最新网站 > 正文

一次向表中插入多条数据的方法分享,使用mapp

时间:2019-08-26 17:36来源:澳门新葡8522最新网站
转自:) 单表的CURAV4D操作(使用mapper动态代理) MyBatis框架抛开dao的落到实处类,直接定位到映射文件mapper的对应sql语句,对DB实行操作。这种dao的兑现情势改为mapper的动态代理模式。 mapp

转自:)

单表的CURAV4D操作(使用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);

澳门新葡8522最新网站,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>

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

动态SQL

动态sql,主要用于缓和查询条件不分明的状态:在程序运营时期,依据顾客提交的查询条件实行询问。提交的询问条件分歧,实施的sql语句不相同。若将各类或者的场地均逐一列出,对具备准绳实行排列组合,将会并发大批量的sql语句。此时,可应用动态sql来化解这样的标题

澳门新葡8522最新网站 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恐怕会油可是生解析出错难点。

澳门新葡8522最新网站 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>

澳门新葡8522最新网站 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);

辉映文件:

澳门新葡8522最新网站 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);
}
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 

 

编辑:澳门新葡8522最新网站 本文来源:一次向表中插入多条数据的方法分享,使用mapp

关键词: www8029com