文章目录
一、pom.xml 添加插件和依赖
<!--添加运行tomcat的插件-->
<plugin>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
</build>
<dependencies>
<!--dependency>
<groupId>org.example</groupId>
<artifactId>[the artifact id of the block to be mounted]</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency-->
<!-- Maven-->
<!-- JSP依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- Servlet 依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- mysql驱动-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- mybatis驱动-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<!--分页插件 PageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
二、MyBatis工具类
package com.atmae.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;
class MyBatisUtils {
private static SqlSessionFactory factory;
//线程锁?
//sqlSession是线程不安全的
private static final ThreadLocal<SqlSession> local=new ThreadLocal<SqlSession>();
//对外提供sqlSession
static {
//加载mybatis配置文件
try {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 提供factory的get方法
* @return
*/
public static SqlSessionFactory getFactory(){
return factory;
}
/**
*
* @param isAutoCommit 是否自动提交事务
* 此方法不对外提供
* @return
*/
private static SqlSession getSqlSession(boolean isAutoCommit){
//存储session
SqlSession sqlSession=local.get();
if (sqlSession==null){
//第一次调用时
// 参数true:自动提交事务
// 参数false:无:手动提交事务
sqlSession=factory.openSession(isAutoCommit);
local.set(sqlSession);
}
return sqlSession;
}
/**
* 手动事务管理
* @return
*/
public static SqlSession getSqlSession(){
return getSqlSession(false);
}
/**
* 自动事务管理
*/
public static <T extends Object>T getMapper(Class<T> c){
SqlSession sqlSession = getSqlSession(true);
return sqlSession.getMapper(c);
}
}
三、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>
<!--properties 1、定义键值对 ★2、引用属性文件-->
<properties resource="jdbc.properties"/>
<!-- <!– 设置mybatis属性–>
<settings>
<!–启动二级缓存–>
<setting name="cacheEnabled" value="true"/>
<!–启动延迟加载–>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>-->
<!-- <!–用于给实体类取别名 在映射文件中可以直接使用别名来实体类的全类名–>
<typeAliases>
<typeAlias type="com.atmae.dao.UserDao" alias="User"/>
</typeAliases>-->
<!-- 配置mybatis插件 (例如分页插件) -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<!--配置数据库连接信息-->
<environments default="mysql">
<environment id="mysql">
<!--用于配置数据库的管理方式-->
<!--JDBC:-->
<!--MANAGED: 依赖容器完成事务管理-->
<transactionManager type="JDBC"/>
<!--用于配置数据库连接信息-->
<!--POOLED:数据库连接池-->
<!--UNPOOLED:-->
<dataSource type="POOLED">
<property name="url" value="${jdbc.url}"/>
<property name="driver" value="${jdbc.driver}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 用于载入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
<mapper resource="mappers/BookMapper.xml"/>
</mappers>
</configuration>
jdbc配置文件
jdbc.url=jdbc:mysql://localhost:3306/book?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456
四、编写pojo对象和Dao接口
1、pojo
package com.atmae.pojo;
import lombok.*;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Book {
int id;
String name;
String author;
double price;
}
2、Dao接口
package com.atmae.dao;
import com.atmae.pojo.Book;
import com.atmae.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookDao {
//添加一本书
public int insertBook(Book book);
//更新一本书
public int deleteBook(int id);
//删除一本书
public int updateBook(Book book);
//查询所有书
public List<Book> queryBooks();
//查询指定书名的图书
public Book queryBook(String name);
//查询总记录数
public int getCount();
//分页查询,给每个参数起一个别名 常用! @Param 声明参数别名
public List<Book> listBooksByPage(@Param("start") int start, @Param("pageSize") int pageSize);
}
五、编写mapper映射文件
相当于DAO接口的实现类
<?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">
<!--相当于DAO接口类的实现类-->
<mapper namespace="com.atmae.dao.UserDao">
<!--组件回填方式:通过useGeneratedKeys,keyProperty-->
<!-- useGeneratedKeys 设置添加操作是否需要回填生成的组件-->
<!-- keyProperty 设置回填的主键赋值到参数对象的哪个属性-->
<!-- timeout 设置此操作的超时时间,如果不设置一直等待-->
<insert id="insertUser" parameterType="com.atmae.pojo.User" useGeneratedKeys="true" keyProperty="id" timeout="3000">
insert into t_user(id, username, password, email)
values (#{id}, #{username}, #{password}, #{email})
</insert>
<insert id="insertUser2" parameterType="com.atmae.pojo.User">
<selectKey keyProperty="id" resultType="java.lang.Integer">
select last_insert_id()
</selectKey>
insert into t_user(id,username,password,email)
values(#{id},#{username},#{password},#{email})
</insert>
<insert id="insertUser4" useGeneratedKeys="true" keyProperty="id">
insert into t_user(username, password, email)
values (#{username}, #{password}, #{email})
</insert>
<insert id="insertUser5">
insert into t_user(username, password, email)
values (#{username}, #{password}, #{email})
</insert>
<delete id="deleteUser" parameterType="com.atmae.pojo.User">
delete
from t_user
where id = #{id}
</delete>
<update id="updateUser" parameterType="com.atmae.pojo.User">
update t_user
set username=#{username},
password=#{password},
email=#{password}
where id = #{id}
</update>
<!--映射 防止数据表中的 字段与实体类不同-->
<!-- <resultMap id="userMap" type="com.atmae.pojo.User">
<id></id>
</resultMap>-->
<!--使用sql片段-->
<sql id="user">id,username,password,email</sql>
<!-- resultType: 指定查询结果封装的对象的实体类 -->
<!-- resultSets: 指定当前操作返回的集合类型 (可省略 )-->
<!-- resultMap: 用于引用一个实体的映射关系,当配置了resultMap之后 resultType就可以省略-->
<select id="queryUsers" parameterType="com.atmae.pojo.User" resultType="com.atmae.pojo.User"
resultSets="java.util.List">
select
<include refid="user"/>
from t_user
</select>
<select id="queryUser" resultType="com.atmae.pojo.User">
select id, username, password, email
from t_user
where id = #{id}
</select>
<select id="getCount" resultType="int">
select count(1)
from t_user
</select>
<select id="listUsersByPage" resultType="com.atmae.pojo.User">
select id, username, password, email
from t_user limit #{start},#{pageSize}
</select>
<select id="listUsersByPage2" resultType="com.atmae.pojo.User">
select id, username, password, email
from t_user limit #{start},#{pageSize}
</select>
</mapper>