Mybatis

一 Mybatis入门案列

1.1环境搭建

1.1.1 引路依赖
<dependencies>
    <!--myubatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--mysql驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!-- log4j日志包 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
</dependencies>

配置环境变量在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="mysql">
        <environment id="mysql">
            <!--事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源-->
            <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://mybatis"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
1.1.2 创建Mybatis核心配置文件SqlMapConfig.xml

1 导入sql文件
2.导入log4j文件
3.创建实体类

package com.itbaizhan.pojo;

public class User {
    private  int id;
    private  String username;
    private  String sex;
    private String address;
    构造方法(有参和无参),get和set,tostring方法

1.2 创建持久层接口和映射文件

1.2.1 创建持久层接口

public interface UserMapper {
    List<User> findAll();
}

1.2.2 在 resources目录下创建映射文件(和接口路径得一样)

mapper是映射器,namespace是接口路径
id是方法名, resultType是实体类,下面写SQL语句

<?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.itbaizhan.mapper.UserMapper">
    <select id="findAll" resultType="com.itbaizhan.pojo.User">
        select * from user
    </select>
</mapper>

1.2.3 将映射文件配置到核心文件中SqlMapConfig.xml

 <!--告诉Mybatis加载映射文件-->
    <mappers>
        <mapper resource="com/itbaizhan/mapper/UserMapper.xml"></mapper>

    </mappers>

注意事项

  1. 映射文件要和接口名称相同。
  2. 映射文件要和接口的目录结构相同。
    在这里插入图片描述
  3. 映射文件中namespace属性要写接口的全名。
  4. 映射文件中标签的id属性是接口方法的方法名。
  5. 映射文件中标签的resultType属性是接口方法的返回值类型。
  6. 映射文件中标签的parameterType属性是接口方法的参数类型。
  7. 映射文件中resultType、parameterType属性要写全类名,如果是集合类型,则写其泛型的全类名。

1.3 测试持久层接口方法

public class TestUserMapper {
    @Test
    public void testFindAll() throws Exception {
        //1.读取核心配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2)创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3)SqlSessionFactoryBuilder对象获取SqlsessionFactory对象
        SqlSessionFactory build = builder.build(is);
        //4) SqlSessionFactory对象获取sqlSession对象
        SqlSession session = build.openSession();
        //5)sqlSession对象获取代理对象
        UserMapper mapper = session.getMapper(UserMapper.class);
        //6)代理对象执行方法
        List<User> all = mapper.findAll();
        all.forEach(System.out::println);

        //7释放资源
        session.close();
        is.close();

二Mybatis核心对象以及工作流程

MyBatis核心对象

SqlSession工厂构建者对象,使用构造者模式创建SqlSession
工厂对象。
SqlSessionFactorySqlSession 工厂,使用工厂模式创建SqlSession对象。
SqlSession 该对象可以操作数据库,也可以使用动态代理模式创建持久层接口的代理对象操作数据库。
Mapper 持久层接口的代理对象,他具体实现了持久层接口,用来操作数据库。

工作流程

  1. 创建SqlSessionFactoryBuilder对象
  2. SqlSessionFactoryBuilder对象构建了SqlSessionFactory对象:构造者模式
  3. SqlSessionFactory对象生产了SqlSession对象:工厂模式
  4. SqlSession对象创建了持久层接口的代理对象:动态代理模式
  5. 代理对象操作数据库

使用SQLSession操作数据库

Mapper动态代理原理

二 Mybatis增删改查

sql语句

选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ 

2.1 新增方法

先写接口方法

    //添加
    void add(User user);

在文件添加查找方法

 <insert id="add" parameterType="com.itbaizhan.pojo.User">
        insert into user(username, sex,address)values(#{username},#{sex},#{address})
    </insert>

测试

    @Test
    public void testAdd() throws Exception {
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        SqlSession session = factory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = new User("程序员","男","上海");
        mapper.add(user);
     //手动提交事务
        session.commit();
        session.close();
        is.close();
    }

注意:

当接口方法的参数类型为POJO类型时,SQL语句中绑定参数时使用#{POJO的属性名}即可。
MyBatis事务默认手动提交,所以在执行完增删改方法后,需要手动调用SqlSession对象的事务提交方法,否则数据库将不发生改变。

2.2 修改方法

接口里写方法

 //修改
   void updater(User user) ;

配置文件写实现方法

<update id="updater" parameterType="com.itbaizhan.pojo.User">
        update user
        set  username=#{username},
            sex      = #{sex},
            address  = #{address}
        where   id   = #{id}
    </update>

优化代码加测试修改方法


public class TestUserMapper2 {
    InputStream is=null;
    SqlSession session=null;
    UserMapper userMapper=null;

    @Before
public void before() throws Exception {
    //1.读取核心配置文件
     is = Resources.getResourceAsStream("SqlMapConfig.xml");
    //2)创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //3)SqlSessionFactoryBuilder对象获取SqlsessionFactory对象
    SqlSessionFactory factory = builder.build(is);
    //4) SqlSessionFactory对象获取sqlSession对象
    session = factory.openSession();
    //5)sqlSession对象获取代理对象
     userMapper = session.getMapper(UserMapper.class);

}
@After
public void after() throws IOException {
        //释放资源
    session.close();
    is.close();
}
@Test
    public void testUpadte(){
        User user=new User(7,"程序员2","女","深圳");
        userMapper.updater(user);
        session.commit();

    }

2.3删除方法

   //删除
    void delete(int userId);
    <!--删除标签-->
    <delete id="delete" parameterType="int">
        delete from user when id = #{id}
    </delete>
   public void testDelete(){
        userMapper.delete(7);
        session.commit();
    }

2.4 根据id查询用户

  //根据id查询
    User findById(int userId);
    <select id="findById" parameterType="int" resultType="com.itbaizhan.pojo.User">
select * from user where id = #{userId}
    </select>

    public void testFindByIdt(){
        User user = userMapper.findById(1);
        System.out.println(user);
    }

二 Mybatis模糊查询

查找:select * from table1 where field1 like ’%value1%’ 查找别忘了加%占位符

第一种写法

接口写

//模糊查询
    //like
    List<User> findByUsernameLike(String username);

配置文件写查询语句

 <!--模糊查询-->
    <select id="findByUsernameLike" resultType="com.itbaizhan.pojo.User" parameterType="String">
        select * from user where username  like #{username}
    </select>

写查询·

@Test
    public void TestFindByUsernameLike(){
    List<User> users = userMapper.findByUsernameLike("%尚学堂%");
    users.forEach(System.out::println);
}

第二种写法

配置文件写查询语句

 <select id="findByUsernameLike" resultType="com.itbaizhan.pojo.User" parameterType="String">
        select * from user where username  like'%${value}%'
    </select>

#和$的区别:

1 # 表示sql模板的占位符,KaTeX parse error: Expected 'EOF', got '#' at position 23: …接到sql模板中。 2 #̲可以防止sql注入,一般能用#…
3 ${}内部的参数名必须写value。

三 Mybatis分页查询

方法一

limit 标签
接口

    /**
     * 分页查询
     * @param startIndex 开始索引
     * @param pageSize  每页条数
     * @return
     */
    List<User> findPage(@Param("startIndex") int startIndex,@Param("pageSize") int pageSize);

映射文件

   <select id="findPage" resultType="com.itbaizhan.pojo.User" >
        select  * from user limit #{startIndex},#{pageSize}
    </select>

测试

@Test
    public void TestfindPage(){
    List<User> page = userMapper.findPage(3,3);
    page.forEach(System.out::println);
}

方法二 pojo方式

定义一个pojo类

package com.itbaizhan.pojo;

public class PageQuery {
    private  int startIndex;
    private  int pageSize;

映射

<select id="findPage1" resultType="com.itbaizhan.pojo.User" parameterType="com.itbaizhan.pojo.PageQuery" >
        select * from user limit #{startIndex},#{pageSize}
    </select>

测试

   @Test
    public void TestfindPage1() {
        PageQuery pageQuery = new PageQuery(3, 3);
        List<User> page = userMapper.findPage1(pageQuery);
        page.forEach(System.out::println);
    }

聚合查询&主键回填

聚合查询
接口

 //查询用户总数
    int findCount();

映射

  <select id="findCount" resultType="int">
        select  count(id) from user
    </select>

测试

  @Test
    public void testFindCount() {
        System.out.println(userMapper.findCount());
    }

主键回填

作用:有时我们需要获取新插入数据的主键值。
如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。
接口

void add(User user);

映射

   <insert id="add2" parameterType="com.itbaizhan.pojo.User">
        <!-- keyProperty:主键属性名,keyColumn:主键列名,resultType:主键类型,order:执行时机 -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID();
        </selectKey>
        insert into user(username,sex,address)
        values(#{username},#{sex},#{address})
    </insert>


SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行。
测试

    @Test
    public void testAdd2(){
        User user = new User("程序员", "男", "北京");
        System.out.println(user);
        userMapper.add2(user);
        session.commit();
        System.out.println(user);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值