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&useSSL=false&serverTimezone=UTC&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注入
也可以使用mysql的concat函数
<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中依靠sql中limit语句来进行分页操作
⚪并且依靠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类实现
需要了解,可跳转