Mybatis个人学习笔记

一、Mybatis

1、#{}和${}的区别是什么?
在这里插入图片描述
2.当实体类中的属性名和表中的字段名不一样 ,怎么办?
在这里插入图片描述

二、第一个Mybatis工程

1、搭建环境

  • 创建数据库和表
CREATE DATABASE mybatis1;
USE mybatis1;
CREATE TABLE users(
	uid INT PRIMARY KEY,
	uname VARCHAR(32),
	uaccount VARCHAR(32),
	upwd VARCHAR(32)
)
  • 导入依赖
  <!--导入依赖-->
<dependencies>
    <!--msql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>
  • 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {
    
    
     private long uid;
     private String uname;
     private String uaccount;
     private String upwd;
    
}
  • 创建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"/>
      <settings>
          <setting name="logImpl" value="LOG4J"/>
      </settings>
      <typeAliases>
          <package name="com.codewen.entity"/>
      </typeAliases>
      
      <environments default="development">
          <environment id="development">
              <transactionManager type="JDBC"/>
              <dataSource type="POOLED">
                  <property name="driver" value="${driver}"/>
                  <property name="url" value="${url}"/>
                  <property name="username" value="${username}"/>
                  <property name="password" value="${password}"/>
              </dataSource>
          </environment>
      </environments>
      
      <mappers>
          <mapper resource="com/codewen/mapper/UsersMapper.xml"/>
      </mappers>
  </configuration>
  • 创建获取SQLSession的工具类
public class SqlSessionUtil {
    
    
    private static SqlSessionFactory sqlSessionFactory;
    static {
    
    
        String resource = "mybatis-config.xml";
        try {
    
    
            InputStream is = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
    public static SqlSession getSession() {
    
    
        return sqlSessionFactory.openSession();
    }
  }
  • 创建mapper
  public interface UsersMapper {
    
    
      List<Users> queryAllUsers();
  }
  • 创建mapper对应的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.codewen.mapper.UsersMapper">
      <select id="UsersMapper" resultType="com.codewen.entity.Users">
        SELECT * FROM users
      </select>
  </mapper>
  • 创建测试类
 public class Test01 {
    
    
     public static void main(String[] args) {
    
    
         SqlSession session = SqlSessionUtil.getSession();
         UsersMapper mapper = session.getMapper(UsersMapper.class);
         List<Users> users = mapper.queryAllUsers();
         for(Users user : users) {
    
    
             System.out.println(user);
         }
     }
  }

注册mapper(有三种resource、class、url)

<mappers>
     <mapper resource="com/codewen/mapper/UsersMapper.xml"/>
     <!--<mapper class="com.codewen.mapper.UsersMapper"/>-->
</mappers>

属性名和字段名不匹配

第一种:修改sql语句,将sql中列的字段名取别名为属性名
第二种:使用resultMap,只需要映射不同的

SELECT * FROM users

三、Mybatis基础CURD

select语句回顾
选择,查询语句

<mapper namespace="zsj.dao.UserDao">
	<select id="getUserList" resultType="zsj.pojo.User">
        select * from user
    </select>
</mapper>
  • id: 就是对应接口类中的方法名
  • resultType: Sql语句执行的返回值!
  • paramaterType:函数传递参数的类型

使用paramaterType的例子(查询一个用户)

UserDao添加语句:

// 根据id查询用户
User getUserById(int id);

UserDao.xml添加语句:

<!--根据id查询用户-->
<select id="getUserById" resultType="zsj.pojo.User" parameterType="zsj.pojo.User">
    select * from user where id = #{
    
    id}
</select>

测试程序添加语句:

//根据id查询用户
User user = userDao.getUserById(2);
System.out.println(user);

insert

1.UserDao中添加相应的方法

// 插入一个用户
int addUser(User user);

2.UserDao.xml中添加相应的语句

<insert id="addUser"  parameterType="zsj.pojo.User">
        insert into user(id,uname,pwd)values(#{
    
    id},#{
    
    uname},#{
    
    pwd})
</insert>

3.测试

@Test
public void add(){
    
    
    SqlSession session = MybatisUtils.getSession();
    UserDao userDao = session.getMapper(UserDao.class);
    /*
     * 插入一个用户
     * */
    User add = new User(3,"srman","18277407480");
    userDao.addUser(add);
    //一定要提交事务
    session.commit();
    List<User> users01 = userDao.getUserList();
    for (User ur: users01){
    
    
        System.out.println(ur.toString());
    }
    session.close();
}

update
1.UserDao中添加相应的方法

// 修改一个用户
int updateUser(User user);

2.UserDao.xml中添加相应的语句

<update id="updateUser" parameterType="zsj.pojo.User">
        update user set uname=#{
    
    uname}, pwd=#{
    
    pwd} where id = #{
    
    id} ;
</update>

3.测试

  @Test
  public void update(){
    
    
      SqlSession session = MybatisUtils.getSession();
      UserDao userDao = session.getMapper(UserDao.class);
      /*
       * 插入一个用户
       * */
      User update = new User(3,"srman","19976253559");
      userDao.updateUser(update);
      //一定要提交事务
      session.commit();
      List<User> users01 = userDao.getUserList();
      for (User ur: users01){
    
    
          System.out.println(ur.toString());
      }
      session.close();
  }

四、动态sql及标签

1、sql标签与include标签

使用sql标签可以实现复用sql,id为该sql语句的名称

<sql id="queryAllBooks">
    select * from book;
</sql>

sql标签跟include标签进行sql复用

<include refid="queryAllBooks"/>

2、if标签
if标签用法和java中的if很相似,test属性中是判断的内容

<if test="btime != null">
    btime=#{
    
    btime}
</if>
<if test="author_array != null and author_array[0] != null">
    and bauthor=#{
    
    author_array[0]}
</if>

3、where 标签:where标签用来替代sql中传统的where,一般配合if标签使用。
where标签的作用:

如果where后面没有语句,那么最后的sql不会把where加上
如果where后面有语句,那么会把第一个语句的and去掉

SELECT * FROM book
<where>
    <if test="btime != null">
        btime=#{
    
    btime}
    </if>
    <if test="author_array != null and author_array[0] != null">
        and bauthor=#{
    
    author_array[0]}
    </if>
</where>

4、set标签
set标签用来替代sql中传统的set,一般配合if标签使用
set标签的作用:用于update的sql中,会把末尾多余的逗号去掉

update book
<set>
    <if test="bname!=null and bname!=''">
        bname=#{
    
    bname},
    </if>
    <if test="bauthor!=null and bauthor!=''">
        bauthor=#{
    
    bauthor},
    </if>
    <if test="bintroduction!=null and bintroduction!=''">
        bintroduction=#{
    
    bintroduction}
    </if>
</set>
...

5、bind标签
bind标签就相当于在value值中,把需要的字符拼接好,然后用name中的值去代替拼接好的参数。(一般用于与#{}取值拼接)
使用 bind 拼接字符串不仅可以避免因更换数据库而修改 SQL,也能预防 SQL 注入。

<bind name="bindfparam" value=" '%'+ parameterMap.fparam +'%' "/>
concat(bname,bauthor,bcategory) like #{
    
    bindfparam}

6、foreach标签: 可以迭代对象的属性、数组、集合、对象数组、对象集合,构建in条件语句或者批量操作语句
collection:表示要迭代的对象的属性、数组、集合、对象数组、对象集合

  1. item:collection中要迭代的单个元素
  2. open:表示该段语句以什么开头
  3. close:表示该语句以什么结尾
  4. separator:表示该语句以什么划分
  5. index:在list、Set和数组中,index表示当前迭代的位置,在map中,index代指是元素的key,一般不用

猜你喜欢

转载自blog.csdn.net/Anna_Liqi/article/details/114442274