步驟1:在mysql中創建表
create table `account`
(
`id` int(11) not null auto_increment,
`username` varchar(32) not null,
`pwd` varchar(64),
`email` varchar(64),
primary key (`id`),
unique key `unique_username` (`username`),
key `username_index` (`username`) USING BTree
) engine=InnoDB default charset=utf8
步驟2:在IDEA下創建Maven項目並創建與表對應的實體類
往Maven項目添加Mybatis依賴的包,pom.xml如下所示
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hurrican</groupId>
<artifactId>conference</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>conference Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>conference</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
項目mybatis.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>
<settings>
<!--當返回行的所有列都是空時,MyBatis默認返回null-->
<setting name="jdbcTypeForNull" value="NULL"/>
<!--cacheEnabled - 使全局的映射器啓用或禁用緩存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<typeAlias type="beans.UserInfo" alias="UserInfo"></typeAlias>
<package name="beans"></package>
</typeAliases>
<!-- 配置運行環境-->
<environments default="mysql">
<environment id="mysql">
<!-- MyBatis 中有兩種事務管理器類型,分別是:-->
<!--1. type = "JDBC" (依賴於數據源得到的連接來管理事務範圍)-->
<!--2. type = "MANAGED" (不提交或回滾連接,讓容器來管理事務的整個週期)-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/conference"/>
<property name="username" value="root"/>
<property name="password" value="qwer123456"/>
<!--poolMaximumActiveConnections – 正在使用連接的數量。默認值:10 -->
<!--poolMaximumIdleConnections – 任意時間存在的空閒連接數-->
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="userinfoMapper.xml"/>
<mapper resource="basicinfoMapper.xml"/>
<mapper resource="workinfoMapper.xml"/>
</mappers>
</configuration>
項目userinfoMapper.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">
<mapper namespace="userdao">
<insert id="addUser" parameterType="UserInfo" useGeneratedKeys="true" keyProperty="id">
insert into account (username, pwd, email)
values (#{username}, #{pwd}, #{email})
</insert>
<insert id="addUserAndQuery" useGeneratedKeys="true" keyProperty="id">
insert into account (username, pwd, email)
values (#{username}, #{pwd}, #{email})
<selectKey resultType="int" keyProperty="id">
select @@identity;
</selectKey>
</insert>
<!-- 單表刪除語句-->
<delete id="deleteUser" parameterType="long">
delete from account where id = #{id}
</delete>
<!-- 單表更新語句-->
<update id="updateUser">
update account set username = #{username}, email = #{email} where id = #{id}
</update>
<!-- 單表查詢語句-->
<select id="queryById" resultType="UserInfo" parameterType="long">
select id, username, pwd, email from account where id = #{id}
</select>
<select id="queryAll" resultType="UserInfo">
select id, username, pwd, email from account
</select>
<!-- 模糊查詢-->
<select id="queryByLike" resultType="UserInfo">
select id,username,email from account where email like concat('%', #{qq},'%')
</select>
<select id="queryNyLike1" resultType="UserInfo">
select id,username,email from account where email like '%${value}%'
</select>
</mapper>
創建實體類beans.UserInfo.java
package beans;
public class UserInfo {
private long id;
private String username;
private String email;
private String pwd;
public UserInfo(String username, String email, String pwd) {
this.username = username;
this.email = email;
this.pwd = pwd;
}
public UserInfo()
{
this.id = -1;
}
//此處省略所有成員的getter方法和setter方法
@Override
public String toString() {
return new StringBuffer().append("id:\t").append(this.id)
.append("\nusername:\t").append(this.username).toString();
}
}
創建DAO接口 dao.IUserinfoDao.java
package dao;
import beans.UserInfo;
import java.util.List;
public interface IUserinfoDao {
void add(UserInfo user);
void remove(UserInfo user);
UserInfo queryById(long id);
List<UserInfo> queryAll();
void update(UserInfo user);
List<UserInfo> queryByField(String fieldVal);
}
創建工具類MybatisSessionManage
,主要用於獲取SqlSession對象
utils.MybatisSessionManage.java
package 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 MybatisSessionManage {
private static InputStream stream = null;
private static SqlSessionFactory factory = null;
static {
try {
stream = Resources.getResourceAsStream("mybatis.xml");
if (stream != null) {
factory = new SqlSessionFactoryBuilder().build(stream);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession();
}
public static SqlSession getSqlSessionAutoCommit(){
return factory.openSession(true);
}
}
DAO接口實現類 dao.UserinfoDaoImp.java
package dao;
import beans.UserInfo;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisSessionManage;
import java.util.ArrayList;
import java.util.List;
public class UserinfoDaoImp implements IUserinfoDao {
public void add(UserInfo user) {
SqlSession session = MybatisSessionManage.getSqlSession();
session.insert("addUser", user);
session.commit();
session.close();
}
public void getIdAfterAdd(UserInfo user){
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
session.insert("addUserAndQuery", user);
session.close();
}
public void remove(UserInfo user) {
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
session.delete("deleteUser", user);
session.close();
}
@Override
public void update(UserInfo user) {
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
session.update("updateUser", user);
session.close();
}
@Override
public List<UserInfo> queryByField(String fieldVal) {
List<UserInfo> list = new ArrayList<>();
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
list = session.selectList("queryByLike", fieldVal);
return list;
}
@Override
public UserInfo queryById(long id) {
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
UserInfo user = session.selectOne("userdao.queryById", id);
return user;
}
@Override
public List<UserInfo> queryAll() {
SqlSession session = MybatisSessionManage.getSqlSessionAutoCommit();
List<UserInfo> list = new ArrayList<>();
list = session.selectList("queryAll");
session.close();
return list;
}
}
單表插入一條記錄
<insert id="addUser" parameterType="UserInfo" useGeneratedKeys="true" keyProperty="id">
insert into account (username, pwd, email)
values (#{username}, #{pwd}, #{email})
</insert>
public void add(UserInfo user) {
SqlSession session = MybatisSessionManage.getSqlSession();
session.insert("addUser", user);
session.commit();
session.close();
}
@Test
public void add() {
UserInfo user = new UserInfo("ZhangFei", "[email protected]", "3235168831");
new UserinfoDaoImp().add(user);
}
主鍵自增長插入1條記錄後查詢出剛插入的主鍵
單表簡單刪除
單表簡單更新
根據ID查詢(查詢時最好帶上命名空間,防止與id相同命名空間不同的查詢衝突)
單表1個條件模糊查詢
使用Mapper動態代理查詢
要求:
DAO層
定義了數據訪問接口- 每個數據庫訪問的接口方法名與mapper.xml文件裏的
select,delete,update,insert
元素的id
名需要保持一致 <mapper></mapper>
標籤裏的 namespace 的值需要與DAO
接口的全限定類名一致
設有beans.WorkInfo.java
實體類,類定義如下:
package beans;
import java.text.SimpleDateFormat;
import java.util.Date;
public class WorkInfo {
private Integer work_id;
private String company; //公司名稱
private String position; //職位
private String duty; //崗位職責
private Date departure; //離職時間
private Integer user_id; //關聯account表外鍵
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("work_id:\t").append(this.work_id)
.append("\ncompany:\t").append(this.company)
.append("\nposition:\t").append(this.position)
.append("\ndeparture:\t").append(this.formatDate(this.departure))
.append("\nduty:\t").append(this.duty)
.append("\nuser_id:\t").append(this.user_id).append("\n");
return builder.toString();
}
private String formatDate(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return dateFormat.format(date);
}
public WorkInfo(String company, String position,
String duty, Date departure, Integer user_id) {
this.company = company;
this.position = position;
this.duty = duty;
this.departure = departure;
this.user_id = user_id;
}
public WorkInfo() {
this.work_id = -1;
}
//此處省略getter和setter方法
}
實體類訪問數據庫的dao.IWorkInfoDao
接口定義如下:
package dao;
import beans.WorkInfo;
import java.util.List;
import java.util.Map;
public interface IWorkInfoDao {
void addWorkInfo(WorkInfo info);
List<WorkInfo> queryWorkInfoByManyConditions(Map<String,Object> map);
List<WorkInfo> queryWorkInfoByNumberIndex(Integer userIdRange, String prefixPosition);
}
數據庫裏有對應的表work_info
,表定義如下:
create table `work_info` (
`work_id` int(11) not null auto_increment,
`company` varchar(64),
`position` varchar(32),
`duty` varchar(128),
`departure` date ,
`user_id` int(11) ,
primary key (`work_id`),
key `fk_workinfo_account` (`user_id`),
constraint `fk_workinfo_account` foreign key (`user_id`) references `account` (`id`)
) engine=InnoDB default charset=utf8
Mapper動態代理單表插入
Mapper動態代理單表多條件查詢
- 方法1
- 方法2