2020-04-02Mybatis

作者: summer96 | 来源:发表于2020-04-02 17:31 被阅读0次

Mybatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

Mybatis编程

mybatis的mapper编程

1.新建项目
2.导包

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
  </dependencies>

3.新建log4j.properties文件,用于打印日志
写入:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout    
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

4.新建实体类Users,与数据库中的表相对应
5.新建UserMapper.xml文件
写入:

<?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">
<mapper namespace="com.mybatis.UserMapper">
<!-- namespace 里可以随意起名 但要与测试类中  openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1)  里的名字一样 --> 
<!-- namespace:名称空间   id:唯一标识 resultType:返回值类型 #{id}:从传递过来的参数中取到id值-->
 <select id="selectEmp" resultType="com.mybatis.Users"><!--所传进来的id值由selectEmp中获取,返回值类型为Users类-->
 select * from users where id = #{id}
 </select>
</mapper>

6.新建全局配置文件SqlMapConfig.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>
 <environments default="development">
 <environment id="development">
 <transactionManager type="JDBC"/>
 <dataSource type="POOLED">
 <property name="driver" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql://localhost:3306/test"/>
 <property name="username" value="root"/>
 <property name="password" value="123456"/>
 </dataSource>
 </environment>
 </environments>
 <mappers>
 <mapper resource="UserMapper.xml"/>
 </mappers>
</configuration>

7.新建测试类测试
写入:

package com.mybatis;
import java.io.IOException;
import java.io.InputStream;
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.Test;

public class mybatisTest {
    /**
     * 1.根据xml配置文件创建一个SqlSessionFactory对象
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
             //加载核心配置文件
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
            //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
        //2.获取sqlSession实例,能直接执行已经映射的sql语句
        SqlSession openSession=sqlSessionFactory.openSession();
        try {
        Users users=openSession.selectOne("com.mybatis.UserMapper.selectEmp", 1);    //将id值设置为1,用selectEmp传给SqlMapConfig.xml
        System.out.println(users);
        }finally {
            openSession.close();
        }
    }
}

8.测试运行

当Users类中的变量名与建表时的名称未对应时,应该在UserMapper.xml文件中写入别名:

select * from users where id = #{id}
//将原语句改为:
select id,name username,password from users where id = #{id}
//建表时所创建字段名称为name,而在实体类中写为username

模糊查询

selecy * from user where username like '%${value}%'
//${}里只能写 value
//也可以写成 "%"#{}"%"  #{} 里的数值可以随意写

mybatis的接口类编程

1.写一个接口,与UserMapper.xml文件动态绑定
接口类如下所示:

package com.mybatis;

public interface UserMapper {
    public Users getUserId(Integer id);
}

2.绑定到UserMapper.xml中
如下所示:

<?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">
<mapper namespace="com.mybatis.UserMapper">
<!-- namespace:名称空间,必须指定为接口全类名   
id:唯一标识 方法名
resultType:返回值类型 
#{id}:从传递过来的参数中取到id值

public Users getUserId(Integer id);
-->
 <select id="getUserId" resultType="com.mybatis.Users">
 select * from users where id = #{id}
 </select>
</mapper>

3.编写测试类

//获取sqlsessionFactory方法
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    } 
    
    @Test
    public void test01() throws IOException{
        //1.获取sqlsessionFactory
        SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
        //2.获取SqlSession对象
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
        //3获取接口的实现类对象
          //会为接口自动创造一个代理对象
        UserMapper mapper=openSession.getMapper(UserMapper.class);
        Users user=mapper.getUserId(1); 
           System.out.println(mapper.getClass());//获取mapper的对象名
        System.out.println(user);
        }finally {
            openSession.close();
        }
    }

接口式编程的好处:
接口中编写的方法具有更强的类型检查,有明确的返回值,相当与抽出来一个规范。
mybatis会自动为其创建一个代理对象,所以推荐使用接口式编程。

SqlSession代表数据库的一次会话,用完必须关闭
SqlSession和Connetcion一样,都是非线程安全,所以不可以写成成员变量,会引起资源竞争,所以每次使用都应该获取新的对象,不能共享。
mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。
(将接口与xml绑定)
UserMapper userMapper = sqlSession.getMpper(UseraMapper.class);
两个重要配置文件。
mybatis全局配置文件(SqlMapconfig),包含了数据库连接池信息,事务管理信息等。。。。系统运行环境
sql映射文件(UserMapper),保存了每一个sql语句映射信息,将sql抽取出来

别名问题:
在xml文件里设置

<resultMap type="Orders" id="orders">
    <result column="user_id" property="userId"/>
</result>
//column 是数据库中的名字   property 是类中的属性
<select id="selectOrderList" resultMap=" orders">
    select id,user_id,number FROM orders
</select>   
//resultType改为resultMap  resultMap中的内容与id一致

sql语句拼接

<!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
    select * from user
    <where>
        <if text="sex != null and sex != ' '">
            sex = #{sex}
         </if>
         <if test="username !=null and username != ' '">
             and username = #{username}
          </if>
    </where>
 </select>  
<!-- 根据性别和名字查询用户 where 可以在sex为null或空值时 去掉username前的 and 但不能去掉后 and -->
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
    select * from user
    <where>
        <if text="sex != null and sex != ' '">
            sex = #{sex}
         </if>
         <if test="username !=null and username != ' '">
             and username = #{username}
          </

mybatis的注解式编程

只写接口,不写mapper.xml文件

public interface UsersMapper2 {
    @Select("select * from users where id = #{id}")
    public Users findUsersById(String id);
}

测试类中:

SqlSessionFactory sqlSessionFactory;
    @Before
    public void before() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test02() throws IOException {
        //创建会话
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //执行
        UsersMapper2 users2=sqlSession.getMapper(UsersMapper2.class);
        Users user = users2.findUsersById("01");
        System.out.println(user);
        //关闭
        sqlSession.close();
        
    }

相关文章

  • 2020-04-02Mybatis

    Mybatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache...

网友评论

    本文标题:2020-04-02Mybatis

    本文链接:https://www.haomeiwen.com/subject/vdgxphtx.html