mybatis基本的增删改查
1.什么是Mybatis
ORM持久层框架(数据库的增删改查)
1.*/2.*版本叫做ibatis 之后在Google旗下 3.* 改名Mybatis
2.Mybatis和Hibernate的区别
- hibernate:是通过实体映射文件将实体类(属性)与表(列)进行,并且能自动生成sql语句
- Mybatis 是通过实体映射文件将实体类(属性)与sql语句进行映射,帮我们执行sql语句,并且进行数据的绑定操作
3.创建Maven项目使用Mybatis
- 使用Mybatis必然要操作数据库(mysql),在pom文件导入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
- 创建实体类
public class Student {
//需要提供get set 方法这里就不写了
private Integer sid;
private String sname;
private String sex;
private Integer eid;
}
- 提供接口
package com.hr.dao;
import java.util.List;
import com.hr.entity.Student;
public interface StudentMapper {
//此接口中的方法名必须跟实体映射文件中sql的id一致
//返回值和参数也要对应
//实体映射文件的namespace必须与当前接口的全类名一致
List<Student> selectAll();
}
- 创建资源文件
jdbc.driver=com.mysql.jdbc.Driver //连接驱动信息
jdbc.url=jdbc:mysql://localhost:3306/a6 //连接url
jdbc.username=user //连接账号
jdbc.password=123 //连接密码
- 创建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>
<!-- 导入db.properties数据库连接信息资源文件 -->
<properties resource="db.properties"></properties>
<!-- 给实体类取别名,方便实体映射文件中使用 -->
<typeAliases>
<!-- 手动给指定实体类取指定别名 -->
<!-- <typeAlias type="com.hr.entity.UserInfo" alias="user"/> -->
<!-- 直接给指定包下的类全部取别名,别名就是类名 -->
<package name="com.hr.entity"/>
</typeAliases>
<!-- 配置数据库的连接 -->
<environments default="mysql">
<environment id="mysql">
<!-- 配置事物 -->
<transactionManager type="jdbc"></transactionManager>
<!-- 配置连接池
POOLED:使用mybatis提供的连接池
UNPOOLED:不使用连接池
JNDI:使用容器提供的连接池
-->
<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/hr/entity/Student.xml"/>
</mappers>
</configuration>
- 创建实体映射文件
Student.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:命名空间
作用:避免多实体映射文件时命名的冲突
原则上可以随意赋值,但是建议写成dao层接口的全类名
-->
<mapper namespace="com.hr.dao.StudentDao">
<!--标签:
select:查询
insert:添加
delete:删除
update:修改
-->
<!--
id:唯一标识
resultType:返回值类型(Student是取了别名的,没取别就需要全类名)
-->
<select id="selectAll" resultType="Student">
select * from Student
</select>
</mapper>
4.测试接口方法对应配置文件的id
1).测试查询全部的方法
package com.hr.test;
import java.io.IOException;
import java.io.InputStream;
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 com.hr.mapper.StudentDao;
public class Test {
//1.加载mybatis的主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
//2.构建session工厂
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(in);
//3.获取session
SqlSession session = sf.openSession();
//4.相关操作
//通过mybatis用代理的方式自动生成接口的实现类
StudentDao dao = session.getMapper(StudentDao.class);
List<Student> list=dao.selectAll();
//5.关session
session.close();
}
因为拿session时,重复代码1 2 3 5步基本不变,变的都是4,可以将其封装,提高代码的重用性
2).将构建session工厂封装
package com.hr.utils;
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 BaseSession {
private static SqlSessionFactory factory;
//访问mybatis读取student数据
//1.定义mybatis主配置文件的名称
private final static String CONFIG = "mybatis.xml";
static {
//2.读取这个config表示的文件
InputStream in = null;
try {
in = Resources.getResourceAsStream(CONFIG);
} catch (IOException e) {
e.printStackTrace();
}
//3.创建了SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
factory = builder.build(in);
}
//获取sqlsession
public static SqlSession getSession() {
//将参数设置为true:自动提交事务
SqlSession sqlSession = factory.openSession(true);
return sqlSession;
}
//关闭session
public static void closeSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
}
3).测试带基本数据类型条件查询的方法
<!--Student.xml加-->
<!--注意:
parameterType的参数int也属于别名 java.lang.Integer 的别名 int
基本数据类型 int 的别名 _int 其他的类似
#{}:类似于占位符,可以防止sql注入
-->
<select id="selectOne" parameterType="int" resultType="Student">
select * from Student where sid=#{sid}
</select>
//StudentDao接口加
Student selectOne(int sid);
//测试
BaseSession.getSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student student=dao.selectOne(1);
BaseSession.closeSession();
4).测试带实体类条件查询的方法(模糊查询)
<!--Student.xml加
参数是实体类对象:#{}中的参数不用关心接口中参数的名字,只关心传进来对象中的属性名
-->
<select id="selectOneLike" parameterType="Student" resultType="Student">
select * from Student where sname like "%" #{sname} "%"
</select>
//StudentDao接口加
Student selectOneLike(Student student);
//测试
BaseSession.getSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student s=new Student();
s.setSname("李");
Student student=dao.selectOneLike(s);
BaseSession.closeSession();
5).添加
<!--Student.xml加-->
<insert id="insert" parameterType="Student" >
insert into student(sname,sex,eid) value(#{sname},#{sex},#{eid})
</insert>
//StudentDao接口加
int insert(Student student);
//测试
BaseSession.getSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student s=new Student();
s.setSname("李");
s.setSex("男");
s.setEid(1);
//返回的影响的行数
int i =dao.insert(s);
BaseSession.closeSession();
当添加时,id列是自增长列时,添加成功需要拿到添加的id时,如下 5)
6).添加,拿添加成功的id
<!--Student.xml加-->
<!--
useGeneratedKeys:使用jdbc中提供的getGeneratedKey()的方法获得新添加数据生成的id
此设置只对有自动编号功能的数据库有效,比如Mysql/SqlServer
keyColumn:指表中的主键列名
keyProperty:指实体类中的主键属性名
-->
<insert id="insertId" parameterType="Student"
useGeneratedKeys="true" keyColumn="sid" keyProperty="sid" >
insert into student(sname,sex,eid) value(#{sname},#{sex},#{eid})
</insert>
//StudentDao接口加
int insertId(Student student);
//测试
BaseSession.getSession();
StudentDao dao = session.getMapper(StudentDao.class);
Student s=new Student();
s.setSname("李");
s.setSex("男");
s.setEid(1);
//返回的影响的行数
int i =dao.insertId(s);
//会将添加成功的id,放入到指定的属性中
//添加的id
int id=s.getSid();
BaseSession.closeSession();
删除 修改:目前没什么注意的