Mybatis持久层框架入门之CRUD实例代码详解

网友投稿 302 2022-08-01


目录1、MyBatis第一个程序1.1、代码演示1.2、问题说明2、CRUD操作2.1、namespace2.2、select2.3、insert2.4、update2.5、delete2.6、拓展思维

1、MyBatis第一个程序

思路流程:搭建环境–>导入Mybatis—>编写代码—>测试

1.1、代码演示

​ 1.搭建实验数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id` int(20) NOT NULL,

`name` varchar(30) DEFAULT NULL,

`pwd` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `user`(`id`,`name`,`pwd`) values (1,'hhh','123456'),(2,'张

三','abcdef'),(3,'李四','987654');

​ 2.导入MyBatis相关 jar 包

org.mybatis

mybatis

3.5.2

mysql

mysql-connector-java

5.1.49

编写MyBatis核心配置文件mybatis-config.xml

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

编写MyBatis工具类MybatisUtils.java

package com.sxau.utils;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;

import java.io.InputStream;

public class MybatisUtils{

private static SqlSessionFactory sqlSessionFactory;

static {

try {

String resource = "mybatis-config.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

}

public static SqlSession getSqlSession(){

return sqlSessionFactory.openSession();

}

}

创建实体类

package com.sxau.pojo;

public class User {

private int id;

private String name;

private String pwd;

public User() {

}

public User(int id, String name, String pwd) {

this.id = id;

this.name = name;

this.pwd = pwd;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String toString() {

return "User{" +

"id=" + id +

", name='" + name + '\'' +

", pwd='" + pwd + '\'' +

'}';

}

}

编写Mapper接口类

package com.sxau.dao;

import com.sxau.pojo.User;

import java.util.List;

import java.util.Map;

public interface UserMapper {

List getUserList();

}

编写Mapper.xml配置文件

namespace 十分重要,不能写错!

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select * from mybatis.user

编写测试类Junit 包测试

public class MyTest {

@Test

public void test(){

//第一步: 获得sqlSession

SqlSession sqlSession = MybatisUtils.getSqlSession();

//方式一:执行SQL语句 getmapper

// UserDao mapper = sqlSession.getMapper(UserDao.class);

// List userList = mapper.getUserList();

//方式二:

List userList = sqlSession.selectList("com.sxau.dao.UserMapper.getUserList");

for (User user : userList) {

System.out.println(user);

}

sqlSession.close();

}

}

运行测试

1.2、问题说明

可能出现问题说明:Maven静态资源过滤问题

在pom.xml中加入以下代码块

src/main/java

**/*.properties

**/*.xml

false

src/main/resources

**/*.properties

**/*.xml

false

2、CRUD操作

2.1、namespace

将上面案例中的UserMapper接口改名为 UserDao;将UserMapper.xml中的namespace改为为UserDao的路径 .再次测试

结论

配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!

2.2、select

select标签是mybatis中最常用的标签之一select语句有很多属性可以详细配置每一条SQL语句id命名空间中唯一的标识符接口中的方法名与映射文件中的SQL语句ID 一一对应parameterType传入SQL语句的参数类型 。【万能的Map,可以多尝试使用】resultTypeSQL语句返回值类型。【完整的类名或者别名】

需求:根据id查询用户

在UserMapper中添加对应方法

package com.sxau.dao;

import com.sxau.pojo.User;

import java.util.List;

import java.util.Map;

public interface UserMapper {

//查询全部用户

List getUserList();

//根据id查询用户

User getUserById(int id);

}

在UserMapper.xml中添加Select语句

select * from mybatis.user where id = #{id}

测试类中进行测试

Test

public void getUserById(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

User user = mapper.getUserById(1);

System.out.println(user);

sqlSession.close();

}

小练习:根据 密码 和 用户名 查询用户信息

思路一:直接在方法中传递参数

在接口方法的参数前加 @Param属性Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型

//通过密码和名字查询用户

User selectUserByNameAndPwd(@Param("username") String username,@Param("pwd") String pwd);

/*

select * from user where name = #{username} and pwd = #{pwd}

*/

思路二:使用万能的Map

​ 1. 在接口方法中,参数直接传递Map;

User selectUserByNP2(Map map);

编写sql语句的时候,需要传递参数类型,参数类型为map

resultType="com.sxau.pojo.User">

select * from user where name = #{username} and pwd = #{pwd}

在使用方法的时候,Map的 key 为 sql中取的值即可,没有顺序要求!

@Test

public void selectUserByNP2(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

Map map = new HashMap();

map.put("username","hhh");

map.put("pwd","123456");

User user = mapper.selectUserByNP2(map);

//提交事务

sqlSession.commit();

sqlSession.close();

}

如果参数过多,我们可以考虑直接使用Map来实现参数传递,如果参数比较少,直接传递参数即可

2.3、insert

我们一般使用insert标签进行插入操作,它的配置和select标签差不多!

需求:给数据库增加一个用户

在UserMapper接口中添加对应的方法

//添加用户

int addUser(User user);

在UserMapper.xml中添加insert语句

insert into mybatis.user(id, name, pwd) VALUES (#{id},#{name},#{pwd});

​ 3.在测试类中进行测试

//增删改 需要提交事务

@Test

public void addUser(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

mapper.addUser(new User(4,"hahah","123123"));

//提交事务

sqlSession.commit();

sqlSession.close();

}

注意点:增、删、改操作需要提交事务!

2.4、update

我们一般使用update标签进行更新操作,它的配置和select标签差不多!

需求:修改用户的信息

在UserMapper接口中添加对应的方法

//修改用户

int updateUser(User user);

在UserMapper.xml中添加update语句

update mybatis.user

set name=#{name},pwd=#{pwd}

where id=#{id};

​ 3.在测试类中进行测试

@Test

public void updateUser(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

mapper.updateUser(new User(4,"qqq","123123"));

sqlSession.commit();

sqlSession.close();

}

2.5、delete

我们一般使用delete标签进行删除操作,它的配置和select标签差不多!

需求:根据id删除一个用户

在UserMapper接口中添加对应的方法

根据id删除用户

int deleteUser(int id);

在UserMapper.xml中添加delete语句

delete from mybatis.user where id=#{id}

​ 3.在测试类中进行测试

@Test

public void deleteUser(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

int i = mapper.deleteUser(4);

sqlSession.commit();

sqlSession.close();

}

小结

所有的增删改操作都需要提交事务!接口所有的普通参数,尽量都写上@Param参数,尤其是多个参数时,必须写上!根据业务的需求,可以考虑使用map传递参数!为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上!

2.6、拓展思维

在MyBatis中模糊查询like语句该怎么写?

第1种:在Java代码中添加sql通配符。

//like模糊查询

List getUserLike(String value);

select * from mybatis.user where name like #{value}

@Test

public void getUserLike(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

List userLike = mapper.getUserLike("%李%");

for (User user : userLike) {

System.out.println(user);

}

}

第2种:在sql语句中拼接通配符,会引起sql注入

//like模糊查询

List getUserLike(String value);

select * from foo where bar like "%"#{value}"%"

@Test

public void getUserLike(){

SqlSession sqlSession = MybatisUtils.getSqlSession();

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

List userLike = mapper.getUserLike("李");

for (User user : userLike) {

System.out.println(user);

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot中如何通过yml为实体类注入属性
下一篇:SSM框架下如何实现数据从后台传输到前台
相关文章

 发表评论

暂时没有评论,来抢沙发吧~