码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis学习

时间:2018-08-07 21:30:02      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:pen   rip   获取数据   conf   应该   test   select   word   技术分享   

 一 Mybatis搭建核心架构

配置文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
19 <!DOCTYPE configuration
20     PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
21     "http://mybatis.org/dtd/mybatis-3-config.dtd">
22 
23 <configuration>
33   <environments default="development">
34     <environment id="development">
35       <transactionManager type="JDBC">
36         <property name="" value=""/>
37       </transactionManager>
38       <!-- 加载驱动和连接 -->
39       <dataSource type="UNPOOLED">
40         <property name="driver" value="com.mysql.jdbc.Driver"/>
41         <property name="url" value="jdbc:mysql://127.0.0.1:3306/micro_message"/>
42         <property name="username" value="xxx"/>
43         <property name="password" value="xxx"/>
44       </dataSource>
45     </environment>
46   </environments>
54 </configuration>

 

 在java代码中读配置文件,读mybatis配置文件的代码应该写在Dao层

Mybatis相关知识

   Dao层需求

    对象能与数据库交互

    能执行SQL语句

   Mybatis中向Dao层提供对象的名字叫做SqlSession(核心对象)

   SqlSession的作用

    向SQL语句传入参数

    执行SQL语句

    获取执行SQL语句结果的能力

    事务的控制

  如何得到SqlSession

    通过配置文件获取数据库连接相关信息

    通过配置信息构建SqlSessionFactory

    通过SqlSessionFactory打开数据库会话

创建一个可以获取SqlSession的类

 1 /**
 2  * 访问数据库类
 3  */
 4 public class DBAccess {
 5     /**
 6      * 
 7      * @return
 8      * @throws IOException 出现异常先往外抛,抛给DAO层去处理,因为DAO层需要捕获异常并在finally中关闭拿到的SqlSession
 9      * 
10      * mybatis的SqlSession也是提供的供数据库的会话,其实是对JDBC的二次封装,因此拿到数据后也是需要关闭的
11      */
12     public SqlSession getSqlSession() throws IOException {
13         //通过配置文件获取数据库连接信息    路径从src根路径下面开始算起
14         Reader reader = Resources.getResourceAsReader("com/imooc/config/Configuration.xml");
15         //通过配置信息构建一个SqlSessionFactory
16         SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
17         //通过SqlSessionFactory打开一个数据库会话
18         SqlSession sqlSession = SqlSessionFactory.openSession();
19         return sqlSession;
20     }
21 }

 

 第一次测试getSqlSession()方法在line16处报错

public class MessageDao {
    /**
     * 根据查询条件查询消息列表
     * @param command
     * @param description
     * @return
     */
    public List<Message> queryMessageList(String command,String description) {
        DBAccess dbAccess = new DBAccess();
        SqlSession sqlSession = null;
        //通过sqlSession执行SQL语句
        
        try {
            sqlSession = dbAccess.getSqlSession();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            sqlSession.close();
        }
        
        
        return null;
    }
    public static void main(String[] args) {
        MessageDao messageDao = new MessageDao();
        //测试queryMessageList是否能够否文数据库
        messageDao.queryMessageList("test","test");
    }
}

 

 报错信息:Exception in thread "main" java.lang.NullPointerException

 原因:在mybatis的配置文件中没有注释掉<mappers>,尚未编写Message.xml

  <mappers>
    <mapper resource="com/imooc/config/sqlxml/Message.xml"/>
  </mappers>

二 SQL基本配置与执行

SQL配置文件的目的:将配置文件中的SQL语句提供给SqlSession,使其能读到并执行.

SQL语句标签的id属性就是给这段SQL语句起了一个名字,以便java代码通过该名称去调用.多个SQL配置文件的id都不能重名.因此可以通过namespace为每一个配置文件起一个不同的名称,因为不同的namespace下相同的id是可以存在的,不会引起冲突.配置文件中的resultMap标签能够配置java对象和数据库字段的映射关系.

三 动态SQL拼接

怎么向SQL语句传参

  将查询条件封装为message对象,将查询条件传入SQL语句中  

public List<Message> queryMessageList(String command,String description) {
        DBAccess dbAccess = new DBAccess();
        List<Message> messageList = new ArrayList<Message>();
        SqlSession sqlSession = null;
        try {
            Message message = new Message();
            message.setCommand(command);
            message.setDescription(description);
            sqlSession = dbAccess.getSqlSession();
            // 通过sqlSession执行SQL语句
            messageList = sqlSession.selectList("Message.queryMessageList", message);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if(sqlSession != null) {
                sqlSession.close();
            }
        }
        return messageList;
    }

配置文件怎么接收参数

  使用parameterType="com.imooc.bean.Message"指定传入的参数类型,用于接收参数,如果是lang包下面的则可以直接写类型,例如在传递String类型的时候就直接写String,而并非写全路径的类名

<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
    select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
    <where>
        <if test="command != null and !&quot;&quot;.equals(command.trim())">
            and COMMAND=#{command}
        </if>
        <if test="description != null and !&quot;&quot;.equals(description.trim())">
            and DESCRIPTION like ‘%‘ #{description} ‘%‘
        </if>
    </where>
  </select>

 OGNL表达式

  OGNL和EL表达式意义相同,在Strusts2和Mybatis中都有用到,在mybatis中OGNL用于从parameterType中取到值并进行处理.不管从哪个标签中进行取值都是取得java类型,所以根据java类型的不同取值写法也有所不同

技术分享图片

技术分享图片

技术分享图片

  OGNL的一个强大功能就是不仅能从java对象中去取属性值,而且还可以调用java的方法,本例调用了equals和trim方法

<if test="description != null and!&quot;&quot;.equals(description.trim())">
    and DESCRIPTION like ‘%‘ #{description} ‘%‘
</if>

 

Mybatis学习

标签:pen   rip   获取数据   conf   应该   test   select   word   技术分享   

原文地址:https://www.cnblogs.com/dzj0712/p/9424943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!