文章目录
mybatis3链接地址
Mybatis
需要:jdk1.8,mysql,maven,idea
1.概念
1.1.什么是mybatis
mybatis是一款优秀的持久层框架,
使用mybatis当然是取代JDBC来操作数据库啦。
它对JDBC操作数据库进行了封装,使开发者只需要关注sql本身。
1.2.持久层
数据持久化
持久化:数据放在数据库中,不删库 数据就一直存在。
1.3.为什么使用mybatis?
核心作用:帮助程序员把数据存储到数据库中。
懒,传统的JDBC代码太复杂,简化。他是一个框架。
2.第一个mybatis程序
思路:搭建环境–>导入mybatis–>编写代码–>测试
2.1.搭建环境
搭建数据库 user表
2.2.新建maven项目 导入依赖
<!--导入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
2.3.创建新的模块
编写mybatis的核心配置文件
<?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核心配置文件-->
<configuration>
<!--environments:环境 default:默认选择的环境,意思是说我们可以有多套环境-->
<environments default="development">
<environment id="development">
<!--transactionManager:事务管理 这里使用的是JDBC-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--useSSL=false 安全连接 & 等同于 & characterEncoding=utf-8 中文-->
<property name="url" value="jdbc:mysql://localhost:3306/dawenxi?useSSL=false& useUnicode=true& characterEncoding=utf-8& autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="Gm_199610"/>
</dataSource>
</environment>
</environments>
</configuration>
编写mybatis工具类
略
2.4.编写代码
实体类
@Data
public class User {
private int id;
private String username;
private String password;
}
注意:引入了一个lombok依赖,可以使用@Data注解,帮助我们自动生成get,set,tostring方法
public interface UserMapper {
public List<User> getUser();
}
mapper.xml 接口实现类UserDaoImpl转化为一个mapper配置文件
<?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">
<!--namespace会绑定一个mapper接口-->
<mapper namespace="com.gm.mapper.UserMapper">
<!--select 查询语句 id对应方法名字 resultType根据类型返回,
resultMap 返回一个集合 这里的User对应的是UserMapper接口中getUser方法的返回值List<User>-->
<select id="getUserList" resultType="com.gm.pojo.User">
select * from dawenxi.user;
</select>
</mapper>
测试类
public class Application {
public static void main(String[] args) {
// 1.获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2.执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUser();
for (User user : userList) {
System.out.println(user);
}
// 关闭sqlSession
sqlSession.close();
}
}
2.5.测试
遇到的问题
1.未注册问题 Type interface com.gm.mapper.UserMapper is not known to the MapperRegistry
每一个mapper.xml都需要在核心配置文件mybatis-config.xml中注册
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
2.资源导出问题 Cause: java.io.IOException: Could not find resource com.gm.mapper.UserMapper
先settings–>Editor–>File Encodings Project Encodings UTF-8
然后pom.xml添加
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
3.CRUD
增删改查
3.1.根据id查询用户
接口
public interface UserMapper {
// 根据id查询用户
public User getUserById(@Param("id") int id);
}
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">
<!--namespace会绑定一个mapper接口-->
<mapper namespace="com.gm.mapper.UserMapper">
<!--parameterType 传递参数的类型-->
<select id="getUserById" resultType="com.gm.pojo.User" parameterType="int">
select * from user where id = #{id};
</select>
</mapper>
测试代码
public class Application {
public static void main(String[] args) {
// 1.获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2.执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.输出mapper.getUserById(1)
System.out.println(mapper.getUserById(1));
// 关闭sqlSession
sqlSession.close();
}
}
3.2.新增用户
接口
public interface UserMapper {
// 新增用户
public int addUser(User user);
}
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">
<!--namespace会绑定一个mapper接口-->
<mapper namespace="com.gm.mapper.UserMapper">
<!--parameterType 传递参数的类型 此时的参数类型为User-->
<insert id="addUser" parameterType="com.gm.pojo.User">
insert into user (id, username, password)
values (#{id},#{username},#{password});
</insert>
</mapper>
测试
package com.gm;
import com.gm.mapper.UserMapper;
import com.gm.pojo.User;
import com.gm.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
/**
* @author gm
* 启动类
*/
public class Application {
public static void main(String[] args) {
// 1.获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2.执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 新增用户 如果没有set方法就会报错
// 注意增删改操作需要提交事务
// 执行新增方法
int res = mapper.addUser(new User(100, "lisi", "123124"));
if (res>0){
System.out.println("插入成功");
}
// 提交事务
sqlSession.commit();
// 关闭sqlSession
sqlSession.close();
}
}
3.3.修改用户
接口
public interface UserMapper {
// 修改用户
public int updateUser(User user);
}
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">
<!--namespace会绑定一个mapper接口-->
<mapper namespace="com.gm.mapper.UserMapper">
<update id="updateUser" parameterType="com.gm.pojo.User">
update user
set username =#{username},password =#{password}
where id =#{id};
</update>
</mapper>
测试
public class Application {
public static void main(String[] args) {
// 1.获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2.执行sql
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3.执行修改操作
mapper.updateUser(new User(3,"李四","12123"));
// 提交事务
sqlSession.commit();
// 关闭sqlSession
sqlSession.close();
}
}
注意:修改用户 返回值类型同样是 User 是根据修改 信息 然后根据id替换 同样需要提交事务
3.4.删除用户
接口
public interface UserMapper {
// 删除用户
public int delUser(@Param("id") int id);
}
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">
<!--namespace会绑定一个mapper接口-->
<mapper namespace="com.gm.mapper.UserMapper">
<delete id="delUser" parameterType="int">
delete
from user
where id =#{id};
</delete>
</mapper>
测试
/删除用户-根据id删除的
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.delUser(100);
// 提交事务
sqlSession.commit();
// 关闭
sqlSession.close();
}
4.Map传参
如果user有100个字段,而我们只需要修改其中一个或几个字段,难道要写100个字段?但是你不写他出来。
假设我们的实体类,或者数据库中的表,字段或者参数过多,我们应该考虑map。
<insert id="addUser" parameterType="com.gm.pojo.User">
insert into user (id, username, password)
values (#{id},#{username},#{password});
</insert>
使用map来传 虽然不正规,但是很万能
4.1.查询用户
接口
// 使用map来查询用户
public User getUserById2(Map<String,Object> map);
xml
<!--通过map来查询用户-->
<select id="getUserById2" resultType="com.gm.pojo.User" parameterType="map">
select * from user where id = #{id};
</select>
测试
@Test
public void test4(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("id",1);
System.out.println(userMapper.getUserById2(map));
}
4.2.新增用户
接口
// 使用map来新增用户
public int addUser2(Map<String,Object> map);
xml
<!--通过map来新增数据-->
<insert id="addUser2" parameterType="map">
insert into user (id, username)
values (#{id},#{username});
</insert>
测试
// 使用map来新增数据
@Test
public void test3(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("id",11);
map.put("username","asdasda");
userMapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
4.3.修改用户
接口
// 使用map来修改用户
public int updateUser2(Map<String,Object> map);
xml
<!--通过map来修改数据-->
<update id="updateUser2" parameterType="map">
update user set password =#{password} where id =#{id};
</update>
测试
// 通过map来修改用户
@Test
public void test5(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("password","123123");
map.put("id","1");
int a= userMapper.updateUser2(map);
if (a>0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
sqlSession.commit();
sqlSession.close();
}
4.4.删除用户
接口
// 使用map来删除用户
public int delUser2(Map<String,Object> map);
xml
<!--通过map来删除用户-->
<delete id="delUser2" parameterType="map">
delete
from user
where id =#{id};
</delete>
测试
// 通过map来删除用户
@Test
public void test6(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("id","2");
int a = userMapper.delUser2(map);
if (a>0){
System.out.println("删除成功");
for (User user : userMapper.getUser()) {
System.out.println(user);
}
}else {
System.out.println("删除失败");
}
sqlSession.close();
}
总结:
1.map传递参数,直接在sql中取出对应的key 对应 – parameterType=“map”
2.对象传递参数,直接在sql中取对象的属性即可。对应 – parameterType=“对象”