MyBatis是一個持久層的框架,mybatis可以將向 preparedStatement中的輸入?yún)?shù)自動進行輸入映射,將查詢結果集靈活映射成java對象即輸出映射。
PART_ONE:環(huán)境搭建和配置文件編寫
1.準備基本的user類和數(shù)據(jù)庫user表
package entiy;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", address=" + address + "]";
}
}
2.在MyBatis官網(wǎng)中下載其jar包
image.png
將jar包導入到工程中。
2.編寫SqlMapConfig.xml,這個文件配置基本的數(shù)據(jù)庫連接信息和之后需要的mappers信息。這個文件需要放在資源文件的根下,或者在使用的時候表明位置
<?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 resource="db.properties"></properties>
<!-- 和spring整合后 environments配置將廢除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理,事務控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 數(shù)據(jù)庫連接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加載 映射文件 -->
<mappers>
<!--配置單個xml文件-->
<!--<mapper resource="sqlmap/User.xml"/>
<mapper resource="mapperxml/UserMapper.xml"/>-->
<!-- 配置mapper接口class的方式 -->
<!--<mapper class="Mapper.UserMapper"/> -->
<!-- 批量導入的方式 -->
<package name="Mapper"/>
</mappers>
</configuration>
3.編寫user類對應的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命名空間,作用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper代理方法開發(fā),namespace有特殊重要的作用
-->
<mapper namespace="Mapper.UserMapper">
<!-- 在 映射文件中配置很多sql語句 -->
<!-- 需求:通過id查詢用戶表的記錄 -->
<!-- 通過 select執(zhí)行數(shù)據(jù)庫查詢
id:標識 映射文件中的 sql
將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id
parameterType:指定輸入 參數(shù)的類型,這里指定int型
#{}表示一個占位符號
#{id}:其中的id表示接收輸入 的參數(shù),參數(shù)名稱就是id,如果輸入 參數(shù)是簡單類型,#{}中的參數(shù)名可以任意,可以value或其它名稱
resultType:指定sql輸出結果 的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。
-->
<select id="findUserById" parameterType="int" resultType="entiy.User">
select * from t_user where id =#{value}
</select>
<!--用戶名模糊查詢用戶,${}表示拼接字符串,如果只需要傳入簡單類型,里面只能傳value-->
<select id="findUserByName" parameterType="String" resultType="entiy.User">
select * from t_user where name like '%${value}%'
</select>
<!-- 添加用戶,#{}中對應User中的變量 -->
<insert id="addUser" parameterType="entiy.User">
<!--查詢剛插入的ID,只對sql的自增適用,id是保存在user中的意思-->
<selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
<!--插入UUID-->
<!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
insert into t_user (name,address) values (#{name},#{address})
</insert>
<!--刪除用戶-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id =#{id}
</delete>
<!-- 更新用戶 -->
<update id="updateUser" parameterType="entiy.User">
update t_user set name=#{name},address=#{address} where id=#{id}
</update>
<!-- 用戶綜合查詢 -->
<select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
select * from t_user
<where>
<if test="usercustom!=null">
<if test="usercustom.address!=null and usercustom.address!=''">
and address = #{usercustom.address}
</if>
</if>
</where>
</select>
<!--自定義的resultMap-->
<resultMap type="entiy.User" id="userResultMap">
<id column="id_" property="id"/>
<result column="name_" property="name"/>
</resultMap>
<!-- 字段查詢 -->
<select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
select id id_,name name_ from t_user where id = #{id}
</select>
</mapper>
PART_TWO:基本的CRUD實現(xiàn),之后還有dao和Mapper的兩種方式來實現(xiàn)。
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.annotation.Resource;
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 org.junit.jupiter.api.Test;
import entiy.User;
public class domain {
@Test
public void testselect() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到sqlsession
SqlSession sqlsession = sessionFactory.openSession();
//通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
User user = sqlsession.selectOne("test.findUserById", 1);
System.out.println(user);
sqlsession.close();
}
@Test
public void testselectByName() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到sqlsession
SqlSession sqlsession = sessionFactory.openSession();
//通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
List<User> users = sqlsession.selectList("test.findUserByName", "胖");
System.out.println(users);
sqlsession.close();
}
@Test
public void testinsertuser() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到sqlsession
SqlSession sqlsession = sessionFactory.openSession();
//通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
User test = new User();
test.setName("傻強");
test.setAddress("廣州");
sqlsession.insert("test.addUser",test);
sqlsession.commit();
System.out.println(test.getId());
sqlsession.close();
}
@Test
public void testdeletuserbyid() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到sqlsession
SqlSession sqlsession = sessionFactory.openSession();
//通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
sqlsession.delete("test.deleteUserById",5);
sqlsession.commit();
sqlsession.close();
}
@Test
public void testupdateuser() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠得到sqlsession
SqlSession sqlsession = sessionFactory.openSession();
//通過sqlsession操作數(shù)據(jù)庫,第一個參數(shù)是User.xml的方法,第二參數(shù)是需要傳入的值
User test = sqlsession.selectOne("test.findUserById", 3);
test.setName("沖鋒舟");
sqlsession.update("test.updateUser", test);
sqlsession.commit();
sqlsession.close();
}
}
PART_THREE:使用dao來實現(xiàn)CRUD操作
1.dao文件
image.png
2.UserDao.java
package dao;
import entiy.User;
public interface UserDao {
public User selectUserById(int id);
}
3.UserDaoImpl.java
package dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import entiy.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public User selectUserById(int id) {
SqlSession sqlsession = sqlSessionFactory.openSession();
User user = sqlsession.selectOne("test.findUserById", id);
return user;
}
}
備注:SqlSessionFactory是單線程的以節(jié)約資源,SqlSession是多線程的,因為其線程不安全。
PART_FOUR:使用Mapper(類似dao只是不用寫實現(xiàn)類)來實現(xiàn)CRUD操作
開發(fā)規(guī)范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法輸入?yún)?shù)類型和mapper.xml中statement的parameterType指定的類型一致。
4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。
1.文件結構
2. 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命名空間,作用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper代理方法開發(fā),namespace有特殊重要的作用
-->
<mapper namespace="Mapper.UserMapper">
<!-- 在 映射文件中配置很多sql語句 -->
<!-- 需求:通過id查詢用戶表的記錄 -->
<!-- 通過 select執(zhí)行數(shù)據(jù)庫查詢
id:標識 映射文件中的 sql
將sql語句封裝到mappedStatement對象中,所以將id稱為statement的id
parameterType:指定輸入 參數(shù)的類型,這里指定int型
#{}表示一個占位符號
#{id}:其中的id表示接收輸入 的參數(shù),參數(shù)名稱就是id,如果輸入 參數(shù)是簡單類型,#{}中的參數(shù)名可以任意,可以value或其它名稱
resultType:指定sql輸出結果 的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。
-->
<select id="findUserById" parameterType="int" resultType="entiy.User">
select * from t_user where id =#{value}
</select>
<!--用戶名模糊查詢用戶,${}表示拼接字符串,如果只需要傳入簡單類型,里面只能傳value-->
<select id="findUserByName" parameterType="String" resultType="entiy.User">
select * from t_user where name like '%${value}%'
</select>
<!-- 添加用戶,#{}中對應User中的變量 -->
<insert id="addUser" parameterType="entiy.User">
<!--查詢剛插入的ID,只對sql的自增適用,id是保存在user中的意思-->
<selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
<!--插入UUID-->
<!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
insert into t_user (name,address) values (#{name},#{address})
</insert>
<!--刪除用戶-->
<delete id="deleteUserById" parameterType="int">
delete from t_user where id =#{id}
</delete>
<!-- 更新用戶 -->
<update id="updateUser" parameterType="entiy.User">
update t_user set name=#{name},address=#{address} where id=#{id}
</update>
<!-- 用戶綜合查詢 -->
<select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
select * from t_user
<where>
<if test="usercustom!=null">
<if test="usercustom.address!=null and usercustom.address!=''">
and address = #{usercustom.address}
</if>
</if>
</where>
</select>
<!--自定義的resultMap-->
<resultMap type="entiy.User" id="userResultMap">
<id column="id_" property="id"/>
<result column="name_" property="name"/>
</resultMap>
<!-- 字段查詢 -->
<select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
select id id_,name name_ from t_user where id = #{id}
</select>
</mapper>
3.UserMapper.java(這個名字必須和對應的xml相同)
package Mapper;
import java.util.List;
import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;
public interface UserMapper {
public User findUserById(int id);
public List<User> findUserByName(String name);
public void addUser(User user);
public void deleteUserById(int id);
public List<UserCustom> findUserList(UserQueryVo userQueryVo);
public List<User> findUserResultMap(int id);
}
4.測試類
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 org.junit.jupiter.api.Test;
import Mapper.UserMapper;
import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;
public class mapperTest {
//mapper查詢id用戶
@Test
public void testMapper() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
User test = usermapper.findUserById(2);
System.out.println(test);
}
//mapper名字查詢用戶集
@Test
public void testfindbyname() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
List<User> users = usermapper.findUserByName("胖");
System.out.println(users);
}
//mapper用戶綜合查詢
@Test
public void testfindList() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setAddress("珠海");
userQueryVo.setUsercustom(userCustom);
System.out.println(userQueryVo.getUsercustom().getAddress());
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
List<UserCustom> userCustoms = usermapper.findUserList(userQueryVo);
System.out.println(userCustoms);
}
//resultMap字段查詢
@Test
public void testfindUserResultMap() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlsessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sessionFactory.openSession();
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
List<User> users = usermapper.findUserResultMap(2);
System.out.println(users);
}
}