MyBatis学习(三)

视频观看地址:http://edu.51cto.com/course/14674.html?source=sohtml

一、配置文件(mybatis-config.xml)

1.一、properties 属性

以前咱们编写jdbc模板类中使用属性文件db.properties文件,在mybatis中也能够这样配置java

src目录下创建一个db.properties文件sql

db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
db.username=scott
db.password=tiger

接下来须要在mybatis-config.xml文件中进行加载数据库

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="db.properties"/>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

接下来测试便可apache

1.二、驼峰命名

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的相似映射。 session

在mybatis中开启驼峰命名mybatis

<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

设置完毕后,咱们更改一个以前的sql,不采用别名的方式进行oracle

<select id = "selectAll" resultType="cn.org.kingdom.pojo.User">
    select * 
    from tb_user
  </select>

测试该方法,查看日志app

DEBUG - Opening JDBC Connection
DEBUG - Created connection 532118459.
DEBUG - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - ==>  Preparing: select * from tb_user 
DEBUG - ==> Parameters: 
DEBUG - <==      Total: 4
User [userid=2, userName=张三, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=3, userName=李四, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=4, userName=王五, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
User [userid=5, userName=赵六, pwd=123456, age=10, sex=男, birthday=Mon Aug 13 10:07:55 CST 2018]
DEBUG - Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@1fb77bbb]
DEBUG - Returned connection 532118459 to pool.

可是有的时候,咱们的数据库的列的命名和实体类没有遵照驼峰命名,此时就须要咱们后面讲解resultMap类型来搞定dom

1.三、typeAliases

每一个mapper文件中关于resultType,parameterType这样的属性写全类名太麻烦,咱们能够经过此属性进行优化

在mybatis-config.xml中加入别名设置

单一设置:

<typeAlias type="cn.org.kingdom.pojo.User" alias="User"/>

扫描包设置:

<package name="cn.org.kingdom.pojo"/>

直接运行测试便可

1.四、类型处理器

类型处理器是在设置参数,以及从result中检索值来匹配java数据类型,MyBatis提供了很是多的默认类型处理器,知足咱们的开发要求。不须要自定义

类型处理器 Java 类型 JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 数据库兼容的 NUMERICBYTE
ShortTypeHandler java.lang.Short, short 数据库兼容的 NUMERICSHORT INTEGER
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERICINTEGER
LongTypeHandler java.lang.Long, long 数据库兼容的 NUMERICLONG INTEGER
FloatTypeHandler java.lang.Float, float 数据库兼容的 NUMERICFLOAT
DoubleTypeHandler java.lang.Double, double 数据库兼容的 NUMERICDOUBLE
BigDecimalTypeHandler java.math.BigDecimal 数据库兼容的 NUMERICDECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 数据库兼容的字节流类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定类型
EnumTypeHandler Enumeration Type VARCHAR-任何兼容的字符串类型,存储枚举的名称(而不是索引)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERICDOUBLE 类型,存储枚举的索引(而不是名称)。
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR or LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE

1.五、environments

开发环境:开发人员平常开发的时候使用的环境

测试环境:测试人员测试的时候使用环境

预发布环境:几乎和线上环境如出一辙,在上线以前在进行一次测试。

生成环境:线上环境。正式的 java 程序运行的环境

MyBatis容许配置多个环境,好比说开发环境,测试环境,生成环境,可是在构建SqlSessionFactory时只能选择一个,虽然这种方式也能够作到很方便的分离多个环境,可是在实际场景下咱们是更多的使用Spring来管理数据源,作到环境的分离

1.六、Mapper映射器

既然 MyBatis 的行为已经由上述元素配置完了,咱们如今就要定义 SQL 映射语句了。可是首先咱们须要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,因此最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可使用相对于类路径的资源引用, 或彻底限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:

1.使用相对于类路径的资源引用

<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

2.使用彻底限定资源定位符(URL)

<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

3.使用映射器接口实现类的彻底限定类名

<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

四、映射器接口扫描包的方式

<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

二、基于Mapper接口下的数据操做

2.一、概述

在 mybatis 中 dao 层的接口名字不推荐使用Dao,而是修改为Mapper,例如 UserDao 修改为 UserMapper

因为在 dao(mapper)的实现类中对 sqlsession 的使用方式很相似。mybatis 提供了接口的动态代理

2.二、动态代理的注意事项

1.将dao包更改命名为cn.org.kingdom.mapper(可选)

2.将接口也改成xxMapper的形式(可选)

3.删除全部的dao类实现类(必须)由于此时咱们是经过动态代理的方式来生成其操做类

4.将映射文件放在mapper包下,而且将该映射文件名更改成接口的名字.xml

namespace:

根标签的 namespace 属性称为名称空间,若是但愿使用 mybatis 经过的动态代理的接口,就须要 namespace 中的值,和须要对应的Mapper(dao)接口的全路径一致

注意此时还须要保证咱们接口中的方法名和配置文件中的id名称保持一致

2.三、具体操做

mapper接口实现

package cn.org.kingdom.mapper;

import java.util.List;

import cn.org.kingdom.pojo.User;

public interface UserMapper {
    public int insertUser(User vo) throws Exception;

    public int updateUser(User vo) throws Exception ; 

    public int deleteUser(int userid) throws Exception ; 

    public User selectUserById(int userid) throws Exception ; 

    public List<User> selectAll() throws Exception;

    public int getAllCounts() throws Exception ; 

}

将mapper.xml文件复制到mapper包中,而且将该文件的名称命名为Mapper接口的名字.xml(UserMapper.xml)

修改mybatis-config.xml文件

<mappers>
    <!-- <mapper resource="cn/org/kingdom/mapper/UserMapper.xml"/> -->
    <package name="cn.org.kingdom.mapper"/>
</mappers>

测试类进行测试

package cn.org.kingdom.test;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import cn.org.kingdom.mapper.UserMapper;
import cn.org.kingdom.pojo.User;

public class MyBatisTest01 {
    SqlSessionFactory sqlSessionFactory = null ;
    SqlSession sqlSession = null ; 
    UserMapper  userMapper = null ;
    @Before
    public void setUp() throws Exception {
        //加载资源
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession  = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void tearDown() throws Exception {
        //关闭
        sqlSession.close();
    }

    @Test
    public void testInsertUser() {
        User vo = new User("阿珂", "123456", 18, "女", new Date());
        try {
            userMapper.insertUser(vo);
            //提交事务
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        }
    }

    @Test
    public void testUpdateUser() {
        User vo = new User(7,"冰封战神", "123456", 18, "男", new Date());
        try {
            userMapper.updateUser(vo);
            //提交事务
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        }
    }
    @Test
    public void testDeleteUserById() {
        int sid = 7 ; 
        try {
            userMapper.deleteUser(sid);
            //提交事务
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        }
    }

    @Test
    public void testSelectAll() throws Exception {
        List<User> list = userMapper.selectAll();
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void testGetCount() throws Exception{
        int count = userMapper.getAllCounts() ; 
        System.out.println(count);
    }

    @Test
    public void testFindUserById() throws Exception{
        User user = userMapper.selectUserById(2);
        System.out.println(user);
    }

}

测试完成:

这里须要你们注意:必定要保证mapper接口中的方法名和mapper.xml中的id名称保持一致

mapper.xml中的namespace必须是mapper接口的全类名

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 
   namespace:命名空間 (保證惟一)
-->
<mapper namespace="cn.org.kingdom.mapper.UserMapper">
  <!-- 
    id:保證惟一
  -->
  <select id="selectUserById" resultType="User">
    select userid,user_name as userName,age,pwd,sex,birthday from tb_user where userid = #{userid}
  </select>

  <insert id="insertUser" parameterType="User">
    insert into tb_user(userid,user_name,age,pwd,sex,birthday)
    values(seq_user.nextval,#{userName},#{age},#{pwd},#{sex},#{birthday})
  </insert>

  <update id="updateUser">
    update tb_user set user_name=#{userName},age=#{age},pwd=#{pwd},sex=#{sex},birthday=#{birthday}
    where userid=#{userid}
  </update>

  <update id="deleteUser">
        delete from tb_user where userid=#{userid}
  </update>

  <select id = "selectAll" resultType="User">
    select * 
    from tb_user
  </select>

  <select id = "getAllCounts" resultType="int">
    select count(1) from tb_user
  </select>
</mapper>
相关文章
相关标签/搜索