GVKun编程网logo

MyBatis直接执行SQL的工具SqlMapper(mybatis 执行过程)

9

本篇文章给大家谈谈MyBatis直接执行SQL的工具SqlMapper,以及mybatis执行过程的知识点,同时本文还将给你拓展4.MyBatis执行SQL的两种方式、ibatis,mybatis项目

本篇文章给大家谈谈MyBatis直接执行SQL的工具SqlMapper,以及mybatis 执行过程的知识点,同时本文还将给你拓展4.MyBatis执行SQL的两种方式、ibatis,mybatis 项目中 sqlmap 越来越多、java – SqlServer / MyBatis SqlMapConfig数据源设置、java中ibatis2直接执行my sql脚本等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

MyBatis直接执行SQL的工具SqlMapper(mybatis 执行过程)

MyBatis直接执行SQL的工具SqlMapper(mybatis 执行过程)

今天小编就为大家分享一篇关于MyBatis直接执行sql的工具sqlMapper,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决。

能否通过MyBatis实现这样的功能呢?

为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行sql的新类sqlMapper。

我们来了解一下sqlMapper。

sqlMapper提供的方法

sqlMapper提供了以下这些公共方法:

Map selectOne(String sql)

Map selectOne(String sql, Object value)

T selectOne(String sql, Class resultType)

T selectOne(String sql, Object value, Class resultType)

List> selectList(String sql)

List> selectList(String sql, Object value)

List selectList(String sql, Class resultType)

List selectList(String sql, Object value, Class resultType)

int insert(String sql)

int insert(String sql, Object value)

int update(String sql)

int update(String sql, Object value)

int delete(String sql)

int delete(String sql, Object value)

一共14个方法,这些方法的命名和参数和sqlSession接口的很像,只是基本上第一个参数都成了sql。

其中Object value为入参,入参形式和sqlSession中的入参一样,带有入参的方法,在使用时sql可以包含#{param}或${param}形式的参数,这些参数需要通过入参来传值。需要的参数过多的时候,参数可以使用Map类型。另外这种情况下的sql还支持下面这种复杂形式:

String sql = "";

这种情况用的比较少,不多说。

不带有Object value的所有方法,sql中如果有参数需要手动拼接成一个可以直接执行的sql语句。

在selectXXX方法中,使用Class resultType可以指定返回类型,否则就是Map类型。

实例化sqlMapper

sqlMapper构造参数public sqlMapper(sqlSession sqlSession),需要一个入参sqlSession sqlSession,在一般系统中,可以按照下面的方式获取:

sqlSession sqlSession = (...);//通过某些方法获取sqlSession //创建sqlMapper sqlMapper sqlMapper = new sqlMapper(sqlSession);

如果使用的Spring,那么可以按照下面的方式配置:

在Service中使用的时候可以直接使用@Autowired注入。

简单例子

在src/test/java目录的com.github.abel533.sql包中包含这些方法的测试。

下面挑几个看看如何使用。

selectList

//查询,返回List List> list = sqlMapper.selectList("select * from country where id countryList = sqlMapper.selectList("select * from country where id

selectOne

Map map = sqlMapper.selectOne("select * from country where id = 35"); map = sqlMapper.selectOne("select * from country where id = #{id}", 35); Country country = sqlMapper.selectOne("select * from country where id = 35", Country.class); country = sqlMapper.selectOne("select * from country where id = #{id}", 35, Country.class);

insert,update,delete

//insert int result = sqlMapper.insert("insert into country values(1921,'天朝','TC')"); Country tc = new Country(); tc.setId(1921); tc.setCountryname("天朝"); tc.setCountrycode("TC"); //注意这里的countrycode和countryname故意写反的 result = sqlMapper.insert("insert into country values(#{id},#{countrycode},#{countryname})" , tc); //update result = sqlMapper.update("update country set countryname = '天朝' where id = 35"); tc = new Country(); tc.setId(35); tc.setCountryname("天朝"); int result = sqlMapper.update("update country set countryname = #{countryname}" + " where id in(select id from country where countryname like 'A%')", tc); //delete result = sqlMapper.delete("delete from country where id = 35"); result = sqlMapper.delete("delete from country where id = #{id}", 35);

注意

通过上面这些例子应该能对此有个基本的了解,但是如果你使用参数方式,建议阅读下面的文章:

深入了解MyBatis参数

实现原理

最初想要设计这个功能的时候,感觉会很复杂,想的也复杂,需要很多个类,因此当时没有实现。

突发奇想,设计了现在的这种方式。并且有种强烈的感觉就是幸好昨天没有尝试去实现,因为昨天晚上思考这个问题的时候是晚上10点多,而今天晚上7点开始思考。我很庆幸在一个更清醒的状态下去写这段代码。

下面简单说思路和实现方式。

在写MyBatis分页插件的时候熟悉了MappedStatement类。

在写通用Mapper的时候熟悉了xml转sqlNode结构。

如果我根据sql动态的创建一个MappedStatement,然后使用MappedStatement的id在sqlSession中执行不就可以了吗?

想到这一点,一切就简单了。

看看下面select查询创建MappedStatement的代码:

/** * 创建一个查询的MS * @param msId * @param sqlSource 执行的sqlSource * @param resultType 返回的结果类型 */ private void newSelectMappedStatement(String msId, sqlSource sqlSource, final Class> resultType) { MappedStatement ms = new MappedStatement.Builder( configuration, msId, sqlSource, sqlCommandType.SELECT) .resultMaps(new ArrayList() { { add(new ResultMap.Builder(configuration, "defaultResultMap", resultType, new ArrayList(0)).build()); } }) .build(); //缓存 configuration.addMappedStatement(ms); }

代码是不是很简单,这段代码的关键是参数sqlSource,下面是创建sqlSource的方法,分为两种。

一种是一个完整的sql,不需要参数的,可以直接执行的:

StaticsqlSource sqlSource = new StaticsqlSource(configuration, sql);

其中configuration从sqlSession中获取,sql就是用户传入到sql语句,是不是也很简单?

另一种是支持动态sql的,支持参数的sqlSource:

sqlSource sqlSource = languageDriver.createsqlSource(configuration, sql, parameterType);

是不是也很简单?这个方法其实可以兼容上面的StaticsqlSource,这里比上面多了一个parameterType,因为这儿是可以传递参数的,另外languageDriver是从configuration中获取的。

是不是很简单?

我一开始也没想到MyBatis直接执行sql实现起来会这么的容易。

insert,delete,update方法的创建更容易,因为他们的返回值都是int,所以处理起来更简单,有兴趣的可以查看sqlMapper的源码。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小编的支持。如果你想了解更多相关内容请查看下面相关链接

4.MyBatis执行SQL的两种方式

4.MyBatis执行SQL的两种方式

本节主要介绍 MyBatis 执行 sql 语句的两种方式和它们的区别。

MyBatis 有两种执行 sql 语句的方式,如下:

  1. 通过 sqlSession 发送 sql
  2. 通过 sqlSession 获取 Mapper 接口,通过 Mapper 接口发送 sql

一、sqlSession发送sql

有映射器之后就可以通过 sqlSession 发送 sql 了。我们以 getWebsite 这条 sql 为例看看如何发送 sql。

  • Website website = (Website)sqlSession.selectOne("net.biancheng.mapper.WebsiteMapper.getWebsite",1);

MyBatis 常用的查询方法有 2 种,分别为 selectOne 和 selectList。

1)selectOne 

selectOne 方法表示使用查询并且只返回一个对象,必须指定查询条件。只能查询 0 或 1 条记录,大于 1 条记录则运行错误。常用格式如下(也有其它重载方法,根据需要选择)。

  • sqlSession.selectOne(String arg0, Object arg1)

2)selectList 

selectList 方法表示使用查询并且返回一个列表。可以查询 0 或 N 条记录。常用格式如下。

  • sqlSession.selectOne(String arg0)

也可指定参数:

  • sqlSession.selectList(String arg0, Object arg1)

以上语法格式中,String 对象由一个命名空间加 sql id 组合而成,它完全定位了一条 sql,这样 MyBatis 就会找到对应的 sql。Object 对象为需要传递的参数,也就是查询条件。

selectOne 实现的 selectList 都可以实现,即 list 中只有一个对象。但 selectList 能实现的,selectOne 不一定能实现。

如果 MyBatis 中只有一个 id 为 getWbsite 的 sql,那么也可以简写为:

  • Website website = (Website )sqlSession.selectOne("getWbsite",1);

这是 MyBatis 前身 iBatis 所留下的方式。

二、Mapper接口发送 sql

sqlSession 还可以获取 Mapper 接口,通过 Mapper 接口发送 sql,如下所示。

  • WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
  • Website website = websiteMapper.getWebsite(1);

通过 sqlSession 的 getMapper 方法获取一个 Mapper 接口,然后就可以调用它的方法了。因为 XML 文件或者接口注解定义的 sql 都可以通过“类的全限定名+方法名”查找,所以 MyBatis 会启用对应的 sql 运行,并返回结果。

三、区别

上面分别讲解了 MyBatis 两种发送 sql 的方式,一种用 sqlSession 直接发送,另外一种通过 sqlSession 获取 Mapper 接口再发送。笔者建议采用 Mapper 接口发送 sql 的方式,理由如下:

  • 使用 Mapper 接口编程可以消除 sqlSession 带来的功能性代码,提高可读性,而 sqlSession 发送 sql,需要一个 sql id 去匹配 sql,比较晦涩难懂。
  • 使用 Mapper 接口,类似 websiteMapper.getWebsite(1) 则是完全面向对象的语言,更能体现业务的逻辑。
  • 使用 websiteMapper.getWebsite(1) 方式,IDE 会提示错误和校验,而使用 sqlSession.selectOne("getWebsite",1L) 语法,只有在运行中才能知道是否会产生错误。


目前使用 Mapper 接口编程已成为主流,尤其在 Spring 中运用 MyBatis 时,Mapper 接口的使用就更为简单,所以本教程使用 Mapper 接口的方式讨论 MyBatis。

ibatis,mybatis 项目中 sqlmap 越来越多

ibatis,mybatis 项目中 sqlmap 越来越多

现在 sqlmap 有 80 多了。开发一点也不快,不光要改实体类,还要注意之前 sqlmap 中 定义的东西.. 感觉 ibatis 这些还是没有发挥出更强大的力量。

@Table
@Alise("user")
class User{
	
   @Column("id")	
   private Long id;
   
   @Column("name")	
   private String name;

}

@Table
@Alise("card")
class Card{

	 @Column("id")	
	 private Long id;
	 @Column("user_id")
	 private Long user_id;
	 @Column("cardtype")
	 private Long type;

}

getList(User.id,User.name).for(User.class) --> select user.id,user.name from User as user


getList(User.id,User.name,Card.type).for(User.class).inner_join(Card.class).on(User.id.equals(Card.user_id)).where(Collections(...)).group_by(...).sort(...).limit(...)



有没有这样的框架  ?


java – SqlServer / MyBatis SqlMapConfig数据源设置

java – SqlServer / MyBatis SqlMapConfig数据源设置

我正在研究this MyBatis tutorial,并且遇到了在sqlMapConfig.xml中设置dataSource的问题.本教程使用MysqL,就像互联网上现有的其他教程一样,但我使用的是sqlServer 2008.

请帮我转换下面的代码连接到本地sqlServer,或者帮助我了解如何设置环境/ sqlMapConfig如何与连接工厂一起工作.

信息/教程的链接也很棒.

谢谢!

figuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

figuration>

    MysqL.jdbc.Driver"/>
                MysqL://localhost:3306/blog"/>
                figuration>

更新:

figuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

figuration>

    sqlServerDriver"/>
            dbname; catalogName=sameasdbname"/>
            figuration>

注意:
我在sql 2008中使用了最新的JDBC驱动程序4,并且遇到了版本问题,特别是错误:“异常数据:java.lang.UnsupportedClassversionError(com / microsoft / sqlserver / jdbc / sqlServerDriver)错误的主要版本在offset = 6 .. …….”

通过sqljdbc3 / sqljdbc4.jar切换到兼容的驱动程序sqljdbc.jar来解决此问题.

最佳答案
要连接到sql Server(或任何其他数据库),您需要两个基本的东西:

>一个合适的JDBC驱动程序.
>配置数据源时的适当属性;

对于驱动程序,我猜你可以使用“the official”Microsoft JDBC驱动程序进行sql Server分发,你必须在你的应用程序的类路径上提供,然后在MyBatis配置中配置数据源属性,这涉及指定驱动程序类(com.microsoft.sqlserver) .jdbc.sqlServerDriver如果我没记错的话)和连接url(必须以jdbc开头:sqlserver://而不是jdbc:MysqL://).

您可以在官方页面上找到更多信息,它将提供appropriate links以帮助您完成所有操作(只需确保您阅读了您的sql Server版本的文档; sql Server 2012已经发布,因此Microsoft更新了他们的文档).

然后,根据您运行的查询类型(对于基本教程,因为这不应该是一个问题),您必须确保使用the proper SQL syntax.

java中ibatis2直接执行my sql脚本

java中ibatis2直接执行my sql脚本

原来ibatis2中,其实还可以有ScriptRunner类直接运行mysql中的脚本了(其实不限于mysql的脚本),马上来看代码: 

Java代码 
  1. String aSQLScriptFilePath = "/script.sql";  
  2.    
  3.           
  4.         Class.forName("com.mysql.jdbc.Driver");  
  5.         Connection con = DriverManager.getConnection(  
  6.             "jdbc:mysql://localhost:3306/database""username""password");  
  7.         Statement stmt = null;  
  8.    
  9.         try {  
  10.               
  11.             ScriptRunner sr = new ScriptRunner(con, falsefalse);  
  12.    
  13.           
  14.             Reader reader = new BufferedReader(  
  15.                                new FileReader(aSQLScriptFilePath));  
  16.    
  17.               
  18.             sr.runScript(reader);  
  19.    
  20.         } catch (Exception e) {  
  21.             System.err.println("Failed to Execute" + aSQLScriptFilePath  
  22.                     + " The error is " + e.getMessage());  
  23.         }  

关于MyBatis直接执行SQL的工具SqlMappermybatis 执行过程的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于4.MyBatis执行SQL的两种方式、ibatis,mybatis 项目中 sqlmap 越来越多、java – SqlServer / MyBatis SqlMapConfig数据源设置、java中ibatis2直接执行my sql脚本的相关知识,请在本站寻找。

本文标签: