一、MyBatis核心jar包:
二、核心配置文件sqlMapConfig.xml
注:配置文件的所有内容包括文件本身,在进行spring整合后都已废除。
<?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>
<!-- 引入数据源配置文件jdbc.properties-->
<properties resource="jdbc.properties">
<property name="jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl?characterEncoding=utf-8"/>
<property name="jdbc.username" value="ly1"/>
<property name="jdbc.password" value="ly1"/>
</properties>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<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>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
解决了JDBC本身的缺陷:
1、涉及到重复创建链接和释放链接,造成资源浪费。解决方式:使用连接池 ------> 使用了数据库连接池
2、出现硬编码。体现在:数据库驱动,url、用户名密码、sql。解决方式:使用配置文件 ------> 引入数据源配置文件jdbc.properties
3、结果获取不方便。解决方式:把结果放到一个POJO中 ------> 实现
三、配置sql映射文件xxxMapper.xml
创建对应的POJO和映射文件PojoMapper.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="test1">
<select id="findUserById" parameterType="int" resultType="com.ly.mybatis.pojo.User" >
select * from t_user where id = #{id}
</select>
<select id="findUserByUsername" parameterType="string" resultType="com.ly.mybatis.pojo.User">
select * from t_user where username like '%${value}%'
</select>
<insert id="insertUser" parameterType="com.ly.mybatis.pojo.User">
<!--insert into t_user(id,USERNAME,BIRTHDAY,SEX,ADDRESS) values(#{id},#{username},sysdate,#{sex},#{address})-->
insert into t_user(id,USERNAME,BIRTHDAY,SEX,ADDRESS) values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
<update id="updateUser" parameterType="com.ly.mybatis.pojo.User">
update t_user set birthday=#{birthday},address=#{address} where id = #{id}
</update>
<delete id="deleteUserById" parameterType="int">
delete from t_user where id = #{id}
</delete>
</mapper>
- namespace :命名空间,用于隔离sql语句
- #{}:占位符:如果传入的是字符串,预编译时会自动带上单引号;
- ${}:连接符:如果传入的是基础数据类型,也就是string,long,double,int,boolean,float等 大括号只能写value,即${value};
- 如果传入的是pojo或者map类型, 大括号只能写属性名或key名,即${username};
能使用#{}的时候尽量使用#{},不使用${}; ${}用的很少,也就模糊查询
#{}相当于jdbc中的preparedstatement(预编译),${}是直接使用里面的值进行拼接,有可能会有SQL注入问题
四、JUnit测试
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.UUID;
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.Before;
import org.junit.Test;
import com.ly.mybatis.pojo.User;
public class UserTest {
SqlSessionFactory sqlSessionFactory = null;
@Before
public void init() throws IOException {
//1、创建sqlSessionFactory工厂
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void testFindUserById() throws IOException {
//2、开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、使用sqlSession方法
User user = sqlSession.selectOne("findUserById", 10);
System.out.println("结果:"+user);
//4、关闭sqlSession
sqlSession.close();
}
@Test
public void testfindUserByUsername() throws IOException {
//2、开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、使用sqlSession方法
List<User> list = sqlSession.selectList("findUserByUsername", "张");
System.out.println("结果2:"+list);
//4、关闭sqlSession
sqlSession.close();
}
@Test
public void testInsertUser() throws IOException {
//2、开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、使用sqlSession方法
User user = new User();
System.out.println("结果3--UUID测试:"+UUID.randomUUID().toString());
user.setId(2);
user.setUsername("yanyan");
user.setBirthday(new Date());
user.setSex("2");
user.setAddress("永杰北路");
sqlSession.insert("insertUser", user);
sqlSession.commit();//不要忘了提交
//4、关闭sqlSession
sqlSession.close();
}
@Test
public void testUpdateUser() throws IOException {
//2、开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、使用sqlSession方法
User user = new User();
user.setId(2);
user.setBirthday(new Date());
user.setAddress("永杰北路2222444");
sqlSession.update("updateUser", user);
sqlSession.commit();//不要忘了提交
System.out.println("结果4--");
//4、关闭sqlSession
sqlSession.close();
}
@Test
public void testDeleteUserById() throws IOException {
//2、开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、使用sqlSession方法
sqlSession.delete("deleteUserById", 2);
sqlSession.commit();//不要忘了提交
System.out.println("结果5--");
//4、关闭sqlSession
sqlSession.close();
}
}