MyBatis环境配置和CRUD的方法使用

MyBatis环境配置和方法使用

1.MyBatis

MyBatis 是一款优秀的持久层框架,它可以避免JDBC的连接配置和获取结果集等操作的代码繁琐,简略这些步骤。

可以解除sql的耦合,方便代码的维护和管理。而且简单,jar包少,没有第三方依赖。

需要的jar包(在maven中配置)

<!--MyBatis的jar包 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>


<!--mysql的jar包 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.19</version>
</dependency>

2.MyBatis的环境配置

resource中创建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>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/web_work?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"/>
               <property name="username" value="root"/>
               <property name="password" value="123321"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
   		<!--这里填写和mapper的xml的路径来进行配置连接 -->
   		<!-- 把userMapper.xml存放于resources包下-->
       <mapper resource="userMapper.xml"/>
   </mappers>
</configuration>

我们还需要设置一个工具类来使用调用这些MyBatis,我们可以设置static来定义这些方法,这样我们在调用这些工具类的时候就不需要繁琐调用这些方法

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 java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {

   private static SqlSessionFactory sqlSessionFactory;

   static {
       try {
       		//获取sqlSessionFactory 对象
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
      } catch (IOException e) {
           e.printStackTrace();
      }
  }

   			//获取SqlSession连接
   public static SqlSession getSession(){
       return sqlSessionFactory.openSession();
  }

}

这样我们编写mapper时只要简单的调用

	SqlSession sqlsession = MybatisUtils.getSession(); 

我们需要一个mapper可以来配对这些配置文件,简单创建一个mapper

import com.nicht.pojo.User;
import java.util.List;

public interface UserMapper {
	//简单查询功能
   List<User> selectUser();
}

然后给这个mapper类编写一个userMapper.xml的配置文件来配对(个人建议放在resource文件中,方便管理

<?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文件路径-->
<mapper namespace="com.nicht.mapper.UserMapper">
<!--mapper中所对应的方法名   和sql表所对应的user类 -->
 <select id="selectUser" resultType="com.nicht.pojo.User">
  select * from Mybatis.user
  <!-- Mybatis其下的user表-->
 </select>
</mapper>

所以当我们调用这个mapper的方法时候,系统能找到所对应的的mapper对应文件来进行sql语句的执行

3.测试面板

public class MyTest {
   @Test
   public void selectUser() {
       SqlSession session = MybatisUtils.getSession();
       //UserMapper.class中用到了反射的原理
       UserMapper mapper = session.getMapper(UserMapper.class);
       List<User> users = mapper.selectUser();

       for (User user: users){
           System.out.println(user);
      }
       session.close();
       //一定要记得关闭session
  }
}

到这时候我们发现每个mapper的方法都要配置一个mapper.xml的文件,不会那么简便,所以就有了MyBatisPlus的诞生,之后我将会探讨到

4.MyBatis中的CRUD(增删改查)操作

在上面我已经简单列举MyBatis中遍历数据库的功能,现在来说说增删改查的操作

要想配置这些sql语句我们要在mapper中创造相对应的方法

1.查询(根据id来查询):

UserMapper中添加对应方法

public interface UserMapper {
   //查询全部用户
   List<User> selectUser();
   //根据id查询用户
   User selectUserById(int id);
}

mapper.xml中配置对应方法

<!--parameterType 为传入参数的参数类型   resultType 为返回的参数类型-->
<select id="selectUserById" resultType="com.nicht.pojo.User" parameterType="int">
select * from Mybatis.user where id = #{id}
</select>

调用

public void tsetSelectUserById() {
   SqlSession session = MybatisUtils.getSession();  //获取SqlSession连接
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   System.out.println(user);
   session.close();

如果我们遇到需要两个参数该怎么办?
可以在mapper中的方法中的参数前面加上 @Param
这样我们在xml文件就可以直接取到

User selectUserById(@Param("id") String id,@Param("name") String name);

xml中可以直接取到就不需要parameterType来定义参数类型

 <select id="selectUserByNP" resultType="com.nicht.pojo.User">
     select * from user where name = #{name} and id = #{id}
   </select>

2.增加:

UserMapper中添加对应方法

public interface UserMapper {
   //查询全部用户
   List<User> selectUser();
   //根据id查询用户
   User selectUserById(int id);
   //增加用户
   int addUser(User user);

mapper.xml中配置:

<insert id="addUser" parameterType="com.nicht.pojo.User">
    insert into Mybatis.user (id,name,year) values (#{id},#{name},#{year})
</insert>

测试:

public void testAddUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = new User(2,"孙笑川","60");
   int i = mapper.addUser(user);
   System.out.println(i);
   session.commit(); //提交事务,重点!不写的话不会提交到数据库
   session.close();

注意:在增删改的操作后,我们要提交事物给数据库,要不然无法获得数据库响应:
session.commit();

3.修改:

UserMapper中添加对应方法

public interface UserMapper {
   //查询全部用户
   List<User> selectUser();
   //根据id查询用户
   User selectUserById(int id);
   //增加用户
   int addUser(User user);
   //修改用户
   int updateUser(User user);

mapper.xml中配置:

<update id="updateUser" parameterType="com.nicht.pojo.User">
  update Mybatis.user set name=#{name},year=#{year} where id = #{id}
</update>

测试:

public void testAddUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = new User(2,"韩金龙","20");
   int i = mapper.update(user);
   System.out.println(i);
   session.commit(); //提交事务,重点!不写的话不会提交到数据库
   session.close();

也可以依靠查询的方法来获得对应的id目标实体类

public void testUpdateUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);//依靠查询方法获得目标实体类
   user.setname("韩金龙");
   user.setyear("20");
   int i = mapper.updateUser(user);
   System.out.println(i);
   session.commit(); //提交事务,重点!不写的话不会提交到数据库
   session.close();
}

4.删除:

UserMapper中添加对应方法

public interface UserMapper {
   //查询全部用户
   List<User> selectUser();
   //根据id查询用户
   User selectUserById(int id);
   //增加用户
   int addUser(User user);
   //修改用户
   int updateUser(User user);
   //删除用户
   int deleteUser(int id);

mapper.xml中配置:

<delete id="deleteUser" parameterType="int">
  delete from Mybatis.user where id = #{id}
</delete>

测试:

public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   int i = mapper.deleteUser(2);
   System.out.println(i);
   session.commit(); //提交事务,重点!不写的话不会提交到数据库
   session.close();
}

5.模糊查询

UserMapper中添加对应方法

public interface UserMapper {
   //查询全部用户
   List<User> selectUser();
   //根据id查询用户
   User selectUserById(int id);
   //增加用户
   int addUser(User user);
   //修改用户
   int updateUser(User user);
   //删除用户
   int deleteUser(int id);
   //模糊查询
   List<User> getUserlike(String value);

mapper.xml中配置:

<select id="getUserlike" resultType="com.nicht.pojo.User">
  select * from Mybatis.user where name like "%"${value}"%"
</select>

xml中的sql语句拼写时,我们要把通配符%写死在项目里面,这是为了防止sql注入

也可以使用mysqlconcat函数


<select>
    select * from table where name like concat('%',#{name},'%')
</selec>

测试:

public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   List<User> users = mapper.getUserlike("龙");
   for (User user: users){
           System.out.println(user);
      }
   session.close();
}

5.Map的使用

MyBatis支持Map键值对来给sql语句传递参数,在语段长的情况下,map的使用的确会比用户类来的方便些。甚至如果你愿意,整个项目可以由map来代替实体类的使用。
举个查询类来观察下:
UserMapper中添加对应方法:

User selectUserById(Map<String,Object> map);

mapper.xml中配置:

<select id="selectUserByNP2" parameterType="map" resultType="com.nicht.pojo.User">
select * from user where name = #{1} and year = #{2}
</select>

注意:
1.在配置mapper.xml的时候传进去的参数类型要是map型,也就是parameterType要设定map属性
2.map使用时,sql语句的参数就不需要为用户类中的变量,要为map中所对应的key

测试:

public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("1","孙笑川");
   map.put("2","60");
   User user = mapper.selectUserByNP2(map);
   System.out.println(user);
   session.close();
}

依靠Map来代替用户类传参主要就是创建Map的键值对,然后把这个map传入sql语句,一一对应,再执行

6.分页的操作

分页的操作可以使数据中的表的查询等操作更为便捷方便

方法一

使用limit来进行分页操作

⚪在mapper.xml中依靠sqllimit语句来进行分页操作

⚪并且依靠map来实现方法

UserMapper中添加对应方法:

User limitselectUser(Map<String,Object> map);

mapper.xml中配置:

<select id="limitselectUser" parameterType="map" resultType="com.nicht.pojo.User">
  <!--                        起始位置      页长   -->
  select * from user limit #{startIndex},#{pageSize}
</select>

测试:

public void testSelectUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);

   int currentPage = 1;  //第几页
   int pageSize = 2;  //每页显示几个
   Map<String,Integer> map = new HashMap<String,Integer>();
   map.put("startIndex",(currentPage-1)*pageSize);
   map.put("pageSize",pageSize);

   List<User> users = mapper.selectUser(map);

   for (User user: users){
       System.out.println(user);
  }

   session.close();
}

方法二

依靠PageHelper插件来实现
官方地址:https://pagehelper.github.io/
在这里插入图片描述

方法三(不推荐)

依靠RowBounds类实现
需要了解,可跳转

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页