準備工作
在學習Mybatis之前,先需要做一些準備工作,以方便後面測試。
- 使用Maven依賴相關jar包
- 配置Log4j日誌文件
- 準備好用於測試的數據庫
- 創建實體類
MyBatis相關Jar包
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
Log4j日誌文件
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
創建數據庫
-- 創建數據庫
CREATE DATABASE mybatistest;
-- 使用數據庫
USE mybatistest;
-- 創建數據庫表
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(20),
usex VARCHAR(20)
);
-- 添加數據
INSERT INTO user(uname,usex) VALUES('張三','男');
INSERT INTO user(uname,usex) VALUES('李四','女');
-- 查詢user表
SELECT * FROM user;
創建User類
public class User {
private Integer id;
private String uname;
private String usex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
}
MyBatis相關配置文件
創建jdbc.properties文件
# 驅動類
driver=com.mysql.jdbc.Driver
# mysql數據庫url地址
url=jdbc:mysql://localhost:3306/mybatistest
# 用戶名
username=root
# 密碼
password=root
創建UserMapper映射文件
<?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="com.itheima.dao.UserDao">
<!--查詢一個學生-->
<select id="selectUserById" resultType="com.itheima.domain.User" parameterType="Integer">
select * from user where id=#{id}
</select>
<!--查詢所有學生-->
<select id="selectAllUser" resultType="com.itheima.domain.User">
select * from user
</select>
<!--添加一個學生-->
<select id="addUser" parameterType="com.itheima.domain.User">
insert into User(uname,usex) values(#{uname},#{usex})
</select>
<!--刪除一個學生-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id}
</delete>
<!--修改一個學生-->
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set uname=#{uname},usex=#{usex} where id=#{id}
</update>
</mapper>
創建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>
<!-- 引用config.properties文件中的jdbc配置信息-->
<properties resource="com/mybatis/jdbc.properties"/>
<!-- MyBatis可以配置成適應多種環境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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/itheima/mybatis/UserMapper.xml"/>
</mappers>
</configuration>
舊版本MyBatis執行sql映射
讀取配置文件
//讀取配置文件
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
//根據配置文件構建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//通過SqlSessionFactory創建SqlSession
SqlSession ss = ssf.openSession();
執行sql映射
創建一個測試類,分別對增加、刪除、修改、查詢等方法進行測試
public class UserDaoTest {
private SqlSession ss = null;
/*執行在每次@Test運行之前,用於加載MyBatis-config配置文件*/
@Before
public void init() {
try {
//讀取配置文件
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
//根據配置文件構建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
//通過SqlSessionFactory創建SqlSession
ss = ssf.openSession();
} catch (IOException ex) {
ex.printStackTrace();
}
}
/*測試添加*/
@Test
public void testAdd() {
//添加一個用戶
User user = new User();
user.setUname("王五");
user.setUsex("女");
int count = ss.insert("com.itheima.dao.UserDao.addUser", user);
System.out.println(count+":"+(count > 0 ? "添加成功" : "添加失敗"));
ss.commit();
}
/*測試查詢*/
@Test
public void testSelect() {
//查詢多個用戶
List<User> list = ss.selectList("com.itheima.dao.UserDao.selectAllUser");
for (User o : list) {
System.out.println(o);
}
ss.commit();
System.out.println("-----------------------");
User o = ss.selectOne("com.itheima.dao.UserDao.selectUserById", 1);
System.out.println(o);
}
/*測試修改*/
@Test
public void testUpdate(){
User user=new User();
user.setId(1);
user.setUname("柳巖");
user.setUsex("女");
int count = ss.update("com.itheima.dao.UserDao.updateUser", user);
System.out.println(count+":"+(count>0?"修改成功":"修改失敗"));
ss.commit();
}
/*刪除修改*/
@Test
public void testDelete(){
int count = ss.update("com.itheima.dao.UserDao.deleteUser", 3);
System.out.println(count+":"+(count>0?"刪除成功":"刪除失敗"));
ss.commit();
}
}
新版本MyBatis執行sql映射
在老版的MayBatis中執行sql映射的代碼寫起來比較麻煩,如添加用戶代碼如下
/*添加用戶*/
@Test
public void testAdd() {
User user = new User();
user.setUname("王五");
user.setUsex("女");
//添加用戶
int count = ss.insert("com.itheima.mapper.UserMapper.addUser", user);
System.out.println(count+":"+(count > 0 ? "添加成功" : "添加失敗"));
ss.commit();
}
不過現在有了一種更簡潔的方式 ——使用正確描述每個語句的參數和返回值的接口(比如 UserMapper.class
),你現在不僅可以執行更清晰和類型安全的代碼,而且還不用擔心易錯的字符串字面值以及強制類型轉換。
定義UserMapper接口
public interface UserMapper {
/*查詢所有的User*/
public List<User> selectAllUser();
/*通過id查詢一個User*/
public User selectUserById(Integer id);
/*添加一個User*/
public int addUser(User user);
/*通過id刪除一個User*/
public int deleteUser(Integer id);
/*修改一個User*/
public int updateUser(User user);
}
注意UserMapper接口中的方法的參數和返回值要和UserMapper.xml映射文件中配置的參數和返回值保持一致
定義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">
<mapper namespace="com.itheima.dao.UserDao">
<!--查詢一個學生-->
<select id="selectUserById" resultType="com.itheima.domain.User" parameterType="Integer">
select * from user where id=#{id}
</select>
<!--查詢所有學生-->
<select id="selectAllUser" resultType="com.itheima.domain.User">
select * from user
</select>
<!--添加一個學生-->
<insert id="addUser" parameterType="com.itheima.domain.User">
insert into User(uname,usex) values(#{uname},#{usex})
</insert>
<!--刪除一個學生-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id}
</delete>
<!--修改一個學生-->
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set uname=#{uname},usex=#{usex} where id=#{d}
</update>
</mapper>
創建測試類並執行
public class UserDaoTest2 {
/*測試添加*/
@Test
public void testAdd() {
//讀取配置文件
SqlSession ss =null;
try {
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
ss= ssf.openSession();
UserDao mapper = ss.getMapper(UserDao.class);
//創建一個用戶
User user = new User();
user.setUname("趙六");
user.setUsex("男");
//添加一個用戶
Integer i = mapper.addUser(user);
} catch (IOException e) {
e.printStackTrace();
ss.rollback();
System.out.println("添加失敗,事務已經回滾");
}finally {
ss.commit();
System.out.println("事務已經提交,添加成功");
}
}
/*測試查詢*/
@Test
public void testSelect() {
//讀取配置文件
try {
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
SqlSession ss = ssf.openSession();
UserDao mapper = ss.getMapper(UserDao.class);
//查詢所有用戶
List<User> users = mapper.selectAllUser();
for (User user : users) {
System.out.println(user);
}
System.out.println("---------------");
//查詢一個用戶
User user = mapper.selectUserById(1);
System.out.println(user);
} catch (IOException e) {
e.printStackTrace();
}
}
/*測試修改*/
@Test
public void testUpdate(){
//讀取配置文件
SqlSession ss=null;
try {
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
ss=ssf.openSession();
UserDao mapper = ss.getMapper(UserDao.class);
//修改用戶
User user=new User();
user.setId(1);
user.setUname("大鵬");
user.setUsex("男");
//修改用戶
mapper.updateUser(user);
} catch (IOException e) {
e.printStackTrace();
ss.rollback();//回滾事務
System.out.println("出現異常,回滾事務");
}finally {
ss.commit(); //提交事務
System.out.println("正常執行,事務已經提交");
}
}
/*刪除修改*/
@Test
public void testDelete(){
//讀取配置文件
SqlSession ss=null;
try {
InputStream in = Resources.getResourceAsStream("com/itheima/mybatis/mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
ss=ssf.openSession();
UserDao mapper = ss.getMapper(UserDao.class);
//修改用戶
mapper.deleteUser(2);
} catch (IOException e) {
e.printStackTrace();
ss.rollback();//回滾事務
System.out.println("出現異常,回滾事務");
}finally {
ss.commit(); //提交事務
System.out.println("正常執行,事務已經提交");
}
}
}
MyBatis核心配置小結
MyBatis的核心配置文件的文檔的頂層結構如下:
configuration(配置)
properties(屬性)
settings(設置)
typeAliases(類型別名)
typeHandlers(類型處理器)
objectFactory(對象工廠)
plugins(插件)
environments(環境配置)
environment(環境變量)
transactionManager(事務管理器)
dataSource(數據源)
databaseIdProvider(數據庫廠商標識)
mappers(映射器)
properties(屬性)
jdbc.properties文件
# 驅動類
driver=com.mysql.jdbc.Driver
# mysql數據庫url地址
url=jdbc:mysql://localhost:3306/mybatistest
# 用戶名
username=root
# 密碼
password=root
mybatis-config.xml中引入jdbc.properties文件
<configuration>
<!-- 引用config.properties文件中的jdbc配置信息-->
<properties resource="com/mybatis/jdbc.properties"/>
</configuration>
typeAliases(類型別名)
類型別名是爲 Java 類型設置一個短的名字,存在的意義僅在於用來減少類完全限定名的冗餘
<typeAliases>
<typeAlias alias="user" type="com.itheima.User"/>
</typeAliases>
在使用com.itheima.User
的地方都可以使用user
代替
<mapper namespace="com.itheima.dao.UserDao">
<!--查詢一個學生-->
<select id="selectUserById" resultType="user" parameterType="Integer">
select * from user where id=#{id}
</select>
</mapper>
environments(環境配置)
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<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>
注意這裏的關鍵點:
默認使用的環境 ID(比如:default="development")。
每個 environment 元素定義的環境 ID(比如:id="development")。
事務管理器的配置(比如:type="JDBC")。
數據源的配置(比如:type="POOLED")。
默認的環境和環境 ID 是自解釋的,因此一目瞭然。 你可以對環境隨意命名,但一定要保證默認的環境 ID 要匹配其中一個環境 ID。
mappers(映射器)
使用相對於類路徑的資源引用
<!-- 使用相對於類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
使用映射器接口實現類的完全限定類名
<!-- 使用映射器接口實現類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>