一,添加依赖文件。
在pom.xml文件下添加:
<!-- mybatis框架所需jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
二,Mybatis的配置文件。
1.在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>
<!-- 默认使用的环境 ID(比如:default="development")
也就是说我们可以配置多套<environment>环境-->
<environments default="development">
<!--
每个 environment 元素定义的环境 ID
-->
<environment id="development">
<!--
transactionManager 事务管理器
type的值有JDBC和MANAGED
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
-->
<transactionManager type="JDBC"/>
<!--
dataSourcedataSource 数据源 dbcp c3p0 druid
type="[UNPOOLED|POOLED|JNDI]"
POOLED意思有连接池的连接
UNPOOLED意思没有连接池的连接
-->
<dataSource type="POOLED">
<!-- JDBC 驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- url数据库的 JDBC URL地址。-->
<property name="url" value="jdbc:mysql://localhost:3306/asset_manage_db?useUnicode&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- defaultTransactionIsolationLevel – 默认的连接事务隔离级别。–>-->
<!-- <property name="defaultTransactionIsolationLevel" value=""/>-->
<!-- defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)–>-->
<!-- <property name="efaultNetworkTimeout" value=""/>-->
</dataSource>
</environment>
</environments>
<mappers>
<!-- 使用相对于类路径的资源引用 -->
<!-- <mapper resource="asia/xiaojiang/mybatis03/dao/UserMapper.xml"/>-->
<!-- 使用完全限定资源定位符(URL)
不推荐使用
<mapper url="E:\JetBrains\mybatis学习\Mybatis-study\Mybatis-03\src\main\java\asia\xiaojiang\mybatis03\dao\UserMapper.xml"/>
-->
<!-- 使用映射器接口实现类的完全限定类名
使用注意点:
接口和其配置文件必须同名, 必须在同一个包下
-->
<mapper resource="org/spoto/dao/UserMapper.xml" />
<!-- 将包内的映射器接口实现全部注册为映射器
使用包扫描注意点:
接口和其配置文件必须同名, 必须在同一个包下
-->
<!-- <package name="asia.xiaojiang.mybatis03.dao"/>-->
</mappers>
</configuration>
2.在Resource的org.spoto.dao下创建UserMapper.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 namespace ="org.spoto.dao.UserMapper">
<!--
id为所配置接口的方法名
parameterType为方法的参数类型
resultType为返回值类型
增删改默认不用设置resultType,返回值默认为Integer
-->
<insert id="add" parameterType="org.spoto.model.User">
<!-- 这里写要执行的SQL语句-->
INSERT INTO asset_manage_db.usertab ( userName, passWord, status, otherName, administrator) VALUES (#{userName}, #{passWord}, #{status}, #{otherName}, #{administrator})
</insert>
<update id="updata" >
UPDATE asset_manage_db.usertab SET userName = #{userName} WHERE id = #{id}
</update>
<delete id="deleteById">
DELETE FROM asset_manage_db.usertab WHERE id=#{id}
</delete>
<select id="getById" resultType="org.spoto.model.User">
SELECT * FROM asset_manage_db.usertab WHERE id=#{id}
</select>
<!--<select id="getAll" resultType="org.spoto.model.User">
SELECT * FROM asset_manage_db.usertab
</select>-->
<!--<select id="getAll" resultType="org.spoto.model.User">
SELECT * FROM asset_manage_db.usertab_copy1
</select>-->
<select id="getAll" resultMap="selectMap">
SELECT * FROM asset_manage_db.usertab_copy1
</select>
<select id="getLimit" resultType="org.spoto.model.User">
SELECT * FROM asset_manage_db.usertab
</select>
<!--
当数据库表中的字段名与实体类对象的属性名称不一样时,
查询出的结果会有些字段因为与实体类的属性名不一致导致无法映射,
可以使用resultMap类梳理数据库字段与实体类的属性关系,使其具有映射关系
-->
<resultMap id="selectMap" type="org.spoto.model.User">
<!-- property:实体类的属性名,column数据库表的字段名-->
<result property="passWord" column="pass_Word"></result>
</resultMap>
</mapper>
三,java包下的主要类和接口。
1.UserMapper接口
package org.spoto.dao;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import org.spoto.model.User;
import java.util.List;
public interface UserMapper {
Integer add(User user);
Integer updata(@Param("id") Integer id,@Param("userName")String userName);
Integer deleteById(@Param("id")Integer id);
User getById(@Param("id")Integer id);
List<User> getAll();
List<User> getLimit(RowBounds rb);
}
2.User类
package org.spoto.model;
public class User {
private Integer id;
private String userName;
private String passWord;
private int status;
private String otherName;
private int administrator;
public User() {
}
public User(Integer id, String userName, String passWord, int status, String otherName, int administrator) {
this.id = id;
this.userName = userName;
this.passWord = passWord;
this.status = status;
this.otherName = otherName;
this.administrator = administrator;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getOtherName() {
return otherName;
}
public void setOtherName(String otherName) {
this.otherName = otherName;
}
public int getAdministrator() {
return administrator;
}
public void setAdministrator(int administrator) {
this.administrator = administrator;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", passWord='" + passWord + '\'' +
", status=" + status +
", otherName='" + otherName + '\'' +
", administrator=" + administrator +
'}';
}
}
3.MybatisUtils类
package org.spoto.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 MybatisUtils {
//读取mybatis配置文件,获取一个连接
public static SqlSession getSqlSession() {
String resource = "mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
4.测试类DemoMain
package org.spoto.main;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.spoto.model.User;
import org.spoto.Utils.MybatisUtils;
import org.spoto.dao.UserMapper;
import java.util.List;
public class DemoMain {
public static void main(String[] args) {
//add();
//updata();
//deleteById();
//getById();
getAll();
//getLimit();
}
public static void add(){
User user = new User(null,"3-10","17.29",1,"插入数据",1);
//获取连接
SqlSession sqlSession = MybatisUtils.getSqlSession();
//相当于获取了一个操作User的Dao
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer add = mapper.add(user);
//mybatis对写操作默认开启事务
if(add>0){
sqlSession.commit();//提交
}else {
sqlSession.commit();//回滚
}
System.out.println(add);
sqlSession.close();
}
public static void updata(){
//获取连接
SqlSession sqlSession = MybatisUtils.getSqlSession();
//相当于获取了一个操作User的Dao
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer updata = mapper.updata(24,"修改数据");
//mybatis对写操作默认开启事务
if(updata>0){
sqlSession.commit();//提交
}else {
sqlSession.commit();//回滚
}
System.out.println(updata);
sqlSession.close();
}
public static void deleteById(){
//获取连接
SqlSession sqlSession = MybatisUtils.getSqlSession();
//相当于获取了一个操作User的Dao
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer delete = mapper.deleteById(24);
//mybatis对写操作默认开启事务
if(delete>0){
sqlSession.commit();//提交
}else {
sqlSession.commit();//回滚
}
System.out.println(delete);
sqlSession.close();
}
public static void getById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getById(1);
System.out.println(user);
}
public static void getAll(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> all = mapper.getAll();
for (User u:all){
System.out.println(u);
}
}
public static void getLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
RowBounds rowBounds = new RowBounds(2, 5);//跳过offset行,取limit行
List<User> getLimit = mapper.getLimit(rowBounds);
for (User u:getLimit){
System.out.println(u);
}
}
}
四,项目结构图。
五,实现Mybatis对数据库操作的流程。
1.在UserMapper接口中写一个方法。
2.在UserMapper.xml文件中的中进行配置。
3.获取Mapper调用方法,Mybatis会帮我们执行SQL语句。
利用我们写好的Mybatis工具类获取一个SqlSession连接,再获取我们配置好的接口的一个实例,通过这个实例调用接口方法,Mybatis会帮我们执行对应的SQL语句,比如图中调用了接口的add方法,Mybatis就会在UserMapper.xml中找id为add的SQL语句并执行(如下图),并将结果返回,返回值为改动的条数。增删改这种写的操作Mybatis默认开启事务,当改动条数大于0时进行提交,否则回滚最后别忘了关闭SqlSession连接释放资源。
六,使用时的细节。
的属性namespace为指定接口或者类的全路径。
在配置sql语句的时候:
id的值要与指定的接口类的方法名对应。
增删改等写操作不需要写resultType属性,增删改的默认返回值类型为Integer。
查的操作需要配置返回值类型resultType,需要写全路径。
在配置参数时,如果只有一个,可以配置parameterType,值为参数的全路径,如下图所示。Mybatis会将User的属性值通过#{}取出来添在该位置,#{}中写的值要与User类中的属性名相同。
如果有多个参数的时候,不能使用parameterType,而是在指定的接口或类中的方法的参数前添加注解@Param(),Mysql会将对应方法参数添加到对应的#{}下,如@Param(“id”)指定的参数的值会添加到#{id}下。
返回值可以为装配指定返回值的容器,如下如中的方法getLimit(),Mybatis会自动将返回值装配返回一个装有这些返回值的容器。
当User类的属性与数据库表中的字段名不相同时,Mybatis不能将不同名的属性和字段进行关联形成映射关系,导致这个属性无法插入对应字段。可以配置一个resultMap将类的属性与数据库表中的字段进行关联形成映射关系。
Mybatis提供一个RowBounds类,只要将其添加在接口方法的参数中,
在调用时传入一个RowBounds类的实例对象,就能实现分页操作,
比如List getLimit =mapper.getLimit(new RowBounds(2,5));表示将查找到的记录跳过2行取5行。