应用mapper动态代理,mybatis的应用流程

转自:)

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

一. 简介

目录

<span style="font-size:16px;font-weight:bold;">
摘要:
在mssql中,一条sql语句默感到三个政工,下文体现怎样在一条sql语句中,插入多行数据
</span>
<hr />
例:  

动态SQL

动态sql,首要用于清除查询条件不分明的图景:在程序运维时期,依据客商提交的查询条件举行查询。提交的询问条件不相同,实践的sql语句不一致。若将每一个只怕的情形均逐个列出,对富有条件实行排列组合,将会并发多量的sql语句。这时,可应用动态sql来消除那样的标题

图片 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可能会冒出分析出错难题。

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

图片 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);

照耀文件:

图片 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);
}

mybatis开始的一段时期版本叫做Ibatis,近来代码托管在github,是五个对jdbc举行打包的悠久层框架。mybatis通过xml或申明实行配备,将“java对象”与“sql语句中的参数”自动映射生成最后施行的sql语句,并将sql语句实施结果机关映射成java对象,重临给业务层(service)应用。

什么是SQLHelper

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 

二.利用流程

SqlHelper配置项

 

2.1.  配置pom.xml,加入mybatis依赖

SqlHelper调用源码

<dependency>

首要成员

     <groupId>org.mybatis</groupId>

注意事项

     <artifactId>mybatis</artifactId>

源程序(汉语注释)

     <version>3.4.5</version>

编写制定本段什么是SQLHelper

SqlHelper是一个基于.NET Framework的数据库操作组件。组件中蕴藏数据库操作方法,近来SqlHelper有为数不菲版本,首要以微软后生可畏上马发表的SqlHelper类,前边饱含进了Enterprise Library开源包中了。还会有二个重要版本是dbhelper.org开源的sqlhelper组件,优点是精简,高品质,不仅援救sqlserver,同临时间帮忙sqlserver、oracle、access、Mysql数据库,也是叁个开源项目,提供无需付费下载。

SqlHelper用于简化你再一次的去写这一个数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后不足为道是只必要给艺术传入一些参数如数据库连接字符串,SQL参数等,就能够采访数据库了,很便利。

SqlHelper 类用于通过风流倜傥组静态方法来封装数据访谈效果。该类不可能被接二连三或实例化,因而将其宣称为含有专用构造函数的不可承袭类。在 SqlHelper 类中实现的每一种办法都提供了意气风发组同样的重载。那提供了黄金时代种很好的利用 SqlHelper 类来实施命令的情势,同期为开采人士选用访问数据的方法提供了不可能缺乏的称心如意。每个形式的重载都协理差异的主意参数,因而开垦职员能够规定传递连接、事务和参数消息的措施。

</dependency>

编纂本段SqlHelper配置项

[1]在接受SqlHelper前最佳使用web.config配置连接字符串,那样便于网址的可移植性和代码的简短。

<connectionStrings>

<!--SqlServerHelper连接字符串设定-->

<add connectionString="server=.;uid=sa;pwd=123456;database=yourdatabase" name="SqlServerHelper"/>

<!--Oracle连接字符串设定-->

<add connectionString="Data Source=orcl;User Id=system;Password=***;Integrated Security=no" name="OracleHelper"/>

<!--MySql连接字符串设定-->

<add connectionString="server=localhost;uid=root;pwd=123456;database=mysqldatabase" name="MySqlHelper"/>

</connectionStrings>

2.2预备布置文件sqlMapConfig.xml(mybatis的主配置文件)

编写本段SqlHelper调用源码

编辑SqlHelper调用代码:

SqlHelper帮助二种数据库包蕴MySql、SqlServer、Oracle、Access数据库,即便的数据库是SqlServer,那么你能够行使SqlServerHelper类,假使是MySql,能够行使MySqlHelper,若是是Access,能够动用AccessHelper。如若是Oracle则足以接受OracleHelper类。

SqlHelper的书写风格相当多,你能够选拔自个儿的必要和爱好使用静态艺术或对象形式。各和利弊。选拔景况接纳呢!

第一种,静态方法,静态方式也是当下接收最多的意气风发种,因为其简要,所以在写三个Sql语句时,用一个主意就足以消除。即便贰个进度供给多少个Sql语句试行时,得创造SqlConnection和调控他的传参,使语句复杂。或然便是每实施二个sql语句让SqlConnection创制一回,使品质受到震慑。然而在只实行二个粗略的查询语句时,显的更简短,所以这种办法在大致的实施逻辑近日,受到我们的挚爱!

//查询语句实施:

DataTable dt=SqlServerHelper.ReadTable("select * from table1");

//插入语句试行:

SqlServerHelper.ExecuteNonQuery("insert into [students] values(@student_name,@class)",

SqlServerHelper.CreateInputParameter("@student_name", SqlDbType.NVarChar, 100, txt_student_name_sqlserver.Text),

SqlServerHelper.CreateInputParameter("@class", SqlDbType.NVarChar, 100, txt_class_sqlserver.Text)

);

简简单单吗,那让项止显的代码又简约,又清晰!

第二种:面向对象式编程,其实这种语法也不复杂,只是加个using语句而己:

using (SqlServerHelper helper = new SqlServerHelper())

{

helper.Command.CommandText = "delete from [Students] where stid=@stid";

helper.AddParameter("@stid", SqlDbType. Int, student_id);

helper.Open();

helper.ExecuteNoneQuery();

helper.Command.Parameters.Clear();

helper.Command.CommandText = "select * from [Students]";return helper.ReadTable();

}

那是合法示例代码中的豆蔻梢头部分,语法轻松,在贰个using语句中实践了delete删除语句和select查语句。

比如,倘使您想实行事务时,能够选拔:

using (SqlServerHelper helper = new SqlServerHelper())

{

helper.Command.CommandText = "delete from [Students] where stid=@stid";

helper.AddParameter("@stid", SqlDbType. Int, student_id);

helper.Open();

DbTransaction tran = helper.Connection.BeginTransaction();

helper.Command.Transaction=tran;

try

{

helper.ExecuteNoneQuery();

tran.Rollback();

}catch { tran.Rollback(); throw; }

}

<?xml version="1.0" encoding="UTF-8" ?>

编写制定本段非常重要成员

在 SqlHelper 类中完毕的办法满含:

ExecuteNonQuery。此方法用于奉行不回去任何行或值的吩咐。那几个命令常常用于实践数据库更新,但也可用以重临储存进程的输出参数。

ExecuteReader。此办法用于再次回到 SqlDataReader 对象,该目的包含由某一指令归来的结果集。

ExecuteDataset。此措施再次来到 DataSet 对象,该目的包罗由某一命令归来的结果集。

ExecuteScalar。此情势再次来到贰个值。该值始终是该命令归来的第风度翩翩行的第一列。

ExecuteXmlReader。此方式重返 FO昂科拉 XML 查询的 XML 片段。

除开这个公共艺术外,SqlHelper 类还蕴藏部分专用函数,用于管理参数和计划要实行的授命。不管客户端调用什么样的章程实现,全部命令都经过 SqlCommand 对象来进行。在 SqlCommand 对象能够被履行此前,全数参数都必得增加到 Parameters 集结中,况且必需科学安装 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专项使用函数首要用以提供风华正茂种同等的格局,以便向 SQL Server 数据库发出指令,而不思考客户端应用程序调用的重载措施实现。SqlHelper 类中的专项使用实用程序函数包涵:

AttachParameters:该函数用于将装有必要的 SqlParameter 对象连选拔正在运转的 SqlCommand。

AssignParameterValues:该函数用于为 SqlParameter 对象赋值。

PrepareCommand:该函数用于对命令的习性(如一而再再而三、事务处境等)举行初叶化。

ExecuteReader:此专项使用 ExecuteReader 达成用于通过适当的 CommandBehavior 打开 SqlDataReader 对象,以便最平价地管理与阅读器关联的接连的有效期。

<!DOCTYPE configuration

编写本段注意事项

1、假若选取SqlHelper方法调用数据库积攒进度,必要取得存款和储蓄进度的再次来到值,请使用带有SqlParameter[]参数的议程,Object[]参数的艺术不能猎取存款和储蓄进度重临值

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

编写本段源程序(中文注释)

/// <summary>

/// 自定义采访通用类

/// </summary>

public class SqlDbHelper

{

string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;

/// <summary>

/// 构造函数

/// </summary>

public SqlDbHelper()

{

}

/// <summary>

/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作((1)

/// </summary>

/// <param name="sql">要实施的SQL语句 </param>

/// <returns> </returns>

public int ExecuteNonQuery(string sql)

{

return ExecuteNonQuery(sql, CommandType.Text, null);

}

/// <summary>

/// ExecuteNonQuery操作,对数据库实行 增、删、改 操作(2)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <param name="commandType">要奉行的查询类型(仓库储存过程、SQL文本) </param>

/// <returns> </returns>

public int ExecuteNonQuery(string sql, CommandType commandType)

{

return ExecuteNonQuery(sql, commandType, null);

}

/// <summary>

/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(3)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <param name="commandType">要实行的查询类型(存款和储蓄进度、SQL文本) </param>

/// <param name="parameters">参数数组 </param>

/// <returns> </returns>

public int ExecuteNonQuery(string sql, CommandType commandType, SqlParameter[] parameters)

{

int count = 0;

using (SqlConnection connection = new SqlConnection(connectionString))

{

using (SqlCommand command = new SqlCommand(sql, connection))

{

command.CommandType = commandType;

if (parameters != null)

{

foreach (SqlParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

connection.Open();

count = command.ExecuteNonQuery();

}

}

return count;

}

/// <summary>

/// SqlDataAdapter的Fill方法试行三个查询,并赶回一个DataSet类型结果(1)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <returns> </returns>

public DataSet ExecuteDataSet(string sql)

{

return ExecuteDataSet(sql, CommandType.Text, null);

}

/// <summary>

/// SqlDataAdapter的Fill方法推行四个询问,并重返贰个DataSet类型结果(2)

/// </summary>

/// <param name="sql">要实践的SQL语句 </param>

/// <param name="commandType">要实践的询问类型(存储进程、SQL文本) </param>

/// <returns> </returns>

public DataSet ExecuteDataSet(string sql, CommandType commandType)

{

return ExecuteDataSet(sql, commandType, null);

}

/// <summary>

/// SqlDataAdapter的Fill方法推行贰个查询,并再次来到三个DataSet类型结果(3)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <param name="commandType">要执行的查询类型(存款和储蓄进度、SQL文本) </param>

/// <param name="parameters">参数数组 </param>

/// <returns> </returns>

public DataSet ExecuteDataSet(string sql, CommandType commandType, SqlParameter[] parameters)

{

DataSet ds = new DataSet();

using (SqlConnection connection = new SqlConnection(connectionString))

{

using (SqlCommand command = new SqlCommand(sql, connection))

{

command.CommandType = commandType;

if (parameters != null)

{

foreach (SqlParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

SqlDataAdapter adapter = new SqlDataAdapter(command);

adapter.Fill(ds);

}

}

return ds;

}

/// <summary>

/// SqlDataAdapter的Fill方法实施贰个询问,并重临一个DataTable类型结果(1)

/// </summary>

/// <param name="sql">要实践的SQL语句 </param>

/// <returns> </returns>

public DataTable ExecuteDataTable(string sql)

{

return ExecuteDataTable(sql, CommandType.Text, null);

}

/// <summary>

/// SqlDataAdapter的Fill方法实行三个询问,并回到一个DataTable类型结果(2)

/// </summary>

/// <param name="sql">要执行的SQL语句 </param>

/// <param name="commandType">要举行的询问类型(存款和储蓄进度、SQL文本) </param>

/// <returns> </returns>

public DataTable ExecuteDataTable(string sql, CommandType commandType)

{

return ExecuteDataTable(sql, commandType, null);

}

/// <summary>

/// SqlDataAdapter的Fill方法推行一个询问,并回到贰个DataTable类型结果(3)

/// </summary>

/// <param name="sql">要试行的SQL语句 </param>

/// <param name="commandType">要实践的询问类型(存款和储蓄进度、SQL文本) </param>

/// <param name="parameters">参数数组 </param>

/// <returns> </returns>

public DataTable ExecuteDataTable(string sql, CommandType commandType, SqlParameter[] parameters)

{

DataTable data = new DataTable();

using (SqlConnection connection = new SqlConnection(connectionString))

{

using (SqlCommand command = new SqlCommand(sql, connection))

{

command.CommandType = commandType;

if (parameters != null)

{

foreach (SqlParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

SqlDataAdapter adapter = new SqlDataAdapter(command);

adapter.Fill(data);

}

}

return data;

}

/// <summary>

/// Execute里德r实践生机勃勃查询,再次回到生机勃勃SqlDataReader对象实例(1)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <returns> </returns>

public SqlDataReader ExecuteReader(string sql)

{

return ExecuteReader(sql, CommandType.Text, null);

}

/// <summary>

/// ExecuteReader推行业作风姿罗曼蒂克查询,再次来到意气风发SqlDataReader指标实例(2)

/// </summary>

/// <param name="sql">要试行的SQL语句 </param>

/// <param name="commandType">要奉行的查询类型(存款和储蓄进程、SQL文本) </param>

/// <returns> </returns>

public SqlDataReader ExecuteReader(string sql, CommandType commandType)

{

return ExecuteReader(sql, commandType, null);

}

/// <summary>

/// ExecuteReader推行后生可畏询问,重返风华正茂SqlDataReader对象实例(3)

/// </summary>

/// <param name="sql">要实践的SQL语句 </param>

/// <param name="commandType">要执行的询问类型(存款和储蓄进度、SQL文本) </param>

/// <param name="parameters">参数数组 </param>

/// <returns> </returns>

public SqlDataReader ExecuteReader(string sql, CommandType commandType, SqlParameter[] parameters)

{

SqlConnection connection = new SqlConnection(connectionString);

SqlCommand command = new SqlCommand(sql, connection);

command.CommandType = commandType;

if (parameters != null)

{

foreach (SqlParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

connection.Open();

return command.ExecuteReader(CommandBehavior.CloseConnection);

}

/// <summary>

/// ExecuteScalar奉行豆蔻梢头查询,再次回到查询结果的率先行第一列(1)

/// </summary>

/// <param name="sql">要施行的SQL语句 </param>

/// <returns> </returns>

public Object ExecuteScalar(string sql)

{

return ExecuteScalar(sql, CommandType.Text, null);

}

/// <summary>

/// ExecuteScalar奉行业作风流罗曼蒂克询问,重临查询结果的首先行第一列(2)

/// </summary>

/// <param name="sql">要实施的SQL语句 </param>

/// <param name="commandType">要实践的查询类型(存款和储蓄进程、SQL文本) </param>

/// <returns> </returns>

public Object ExecuteScalar(string sql, CommandType commandType)

{

return ExecuteScalar(sql, commandType, null);

}

/// <summary>

/// ExecuteScalar实行后生可畏查询,再次回到查询结果的首先行第一列(3)

/// </summary>

/// <param name="sql">要实行的SQL语句 </param>

/// <param name="commandType">要奉行的查询类型(存款和储蓄进程、SQL文本) </param>

/// <returns> </returns>

public Object ExecuteScalar(string sql, CommandType commandType, SqlParameter[] parameters)

{

object result = null;

using (SqlConnection connection = new SqlConnection(connectionString))

{

using (SqlCommand command = new SqlCommand(sql, connection))

{

command.CommandType = commandType;

if (parameters != null)

{

foreach (SqlParameter parameter in parameters)

{

command.Parameters.Add(parameter);

}

}

connection.Open();

result = command.ExecuteScalar();

}

}

return result;

}

/// <summary>

/// 重回当前一而再再而三的数据库中全部由客户创造的数据库

/// </summary>

/// <returns> </returns>

public DataTable GetTables()

{

DataTable data = null;

using (SqlConnection connection = new SqlConnection(connectionString))

{

connection.Open();

data = connection.GetSchema("Tables");

}

return data;

}

}

";

<configuration>

<!-- 运转景况安排 -->

<!-- default:钦点使用哪一个周转条件 -->

<environments default="development">

     <!-- id:唯风度翩翩标志叁个运作情形 -->

     <environment id="development">

        <!-- 配置事务 -->

         <transactionManager type="JDBC" />

         <!-- 数据源配置 -->

         <dataSource type="POOLED">

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

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

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

             <property name="password" value="admin" />

         </dataSource>

     </environment>

</environments>

</configuration>

2.3.准备log4j.properties

2.4.编写pojo实体类

与数据库的字段对应

2.5备选sql和mapper映射文件

2.5.1.sql语句对应增加和删除改查操作。

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

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

";

<!--namespace:名称空间,相当于java中的package,用于幸免sql语句名称冲突(sql语句的隔绝)  -->

<mapper namespace="test">

<!--mybatis针对每意气风发种sql语句:新扩张/修改/删除/查询,

提供了相应的标签:insert/update/delete/select来放置-->

<!-- 依据客商Id查询客户,说明:

     select标签:用于放置查询sql语句

     id:唯大器晚成标志名称

     parameterType:输入参数的系列

     resultType:输出结果的门类(须要的是全范围名称)

     #{id}:占位符,相当于jdbc中的? -->

<select id="queryUserById" parameterType="int" resultType="com.code.po.User">

     select * from `user` where id=#{id}

</select>

</mapper>

2.6.还要在主配置文件中加多对映射文件的援用

<!-- 加载mapper映射文件 -->

<mappers>

     <!-- 加载User.xml文件,表达: 1.resource:内定布置文件的地点 -->

     <mapper resource="sqlmap/User.xml"/>

</mappers>

2.7.mybatis的周转原理

图片 5

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:应用mapper动态代理,mybatis的应用流程

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。