Mybatis的Jar包下载:https://pan.baidu.com/s/16P-MGgn53e1EtCL6wQ9VWA 密码:1azq
用传统Dao层实现类的方式开发,Dao层实现类需要注入SqlSessionFactory,并在各个方法中重复创建SqlSession。
mapper接口动态代理的方式避免重复创建SqlSession的问题。(mapper接口其实就是Dao层接口(动态代理自动创建Dao层实现类),接口需要遵循四个原则)
UserMapper.java(遵循四个原则的Dao层接口):
package com.xxx.mybatis.mapper;
import com.xxx.mybatis.pojo.User;
//其实就是Dao层接口
public interface UserMapper {
//遵循四个原则:
//UserMapper.xml中配置的命名空间要与该接口的全类名保持一致(com.xxx.mybatis.mapper.UserMapper)
//接口中的方法名 == UserMapper.xml中配置的sql语句的id名
//返回值类型 与 UserMapper.xml文件中配置的返回值类型(resultType)要一致
//方法的输入参数类型 与UserMapper.xml中配置的输入参数的类型(parameterType)要一致
public User findUserById(Integer id); //根据返回值类型决定调用selectOne()还是selectList()方法
}
Test.java(测试类):
package com.xxx.mybatis.junit;
import java.io.InputStream;
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.Test;
import com.xxx.mybatis.mapper.UserMapper;
import com.xxx.mybatis.pojo.User;
public class Test {
@Test
public void testMapper() throws Exception {
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSession会根据接口自动生成这个接口的实现类 (接口必须遵循那四个原则) (动态代理)。 多次调用接口中的方法,上面创建SqlSession的代码只用写一次。避免重复代码。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(10); //根据生成的实现类,调用接口中的方法。
System.out.println(user);
}
}
UserMapper.xml(实体类的Sql映射文件,配置原生SQL语句):
<?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">
<!-- 配置原生Sql语句 -->
<mapper namespace="com.xxx.mybatis.mapper.UserMapper"> <!-- 命名空间namespace一般设置为Dao层接口全类名"com.xxx.mybatis.mapper.UserMapper" -->
<!-- 通过ID查询一个用户。resultType:数据库中表的字段要和User实体类中的属性保持对应(如果不对应可以使用resultMap标签配置映射关系) -->
<select id="findUserById" parameterType="Integer" resultType="User"> <!-- 可以在sqlMapConfig.xml配置文件中配置"com.xxx.mybatis.pojo.User"类型的别名为User -->
select * from user where id = #{v}
</select>
<!-- 根据用户名称模糊查询用户列表 -->
<!--
#{}表示占位符 '%#{v}%' ==> '%'五'%' (String类型会自动带引号)
${}表示字符串拼接(不能防SQL注入) '%${value}%' ==> '%五%' ${value}中只能填value。 "%"#{haha}"%"可以防SQL注入
-->
<select id="findUserByUsername" parameterType="String" resultType="com.xxx.mybatis.pojo.User">
select * from user where username like "%"#{haha}"%"
</select>
<!-- 添加用户 -->
<insert id="insertUser" parameterType="com.xxx.mybatis.pojo.User">
<!-- 插入成功后,将生成的主键id注入到user对象中。 keyProperty的"id"要和User实体类中的属性保持一致 -->
<selectKey keyProperty="id" resultType="Integer" order="AFTER"> <!-- MySql中的自增主键用AFTER(先插入,后生成主键)。UUID用BEFORE -->
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
<!-- #{username}中的"username"要和User实体类中的属性名保持对应。 (OGNL表达式) -->
</insert>
<!-- 更新 -->
<update id="updateUserById" parameterType="com.xxx.mybatis.pojo.User">
update user
set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address}
where id = #{id}
</update>
<!-- 删除 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id = #{vvvvv}
</delete>
</mapper>
src/sqlMapConfig.xml(Mybatis的核心配置文件):
<?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="jdbc.properties"/>
<!-- 为类型配置别名 -->
<typeAliases>
<!-- <typeAlias type="com.xxx.mybatis.pojo.User" alias="User"/> -->
<!-- 该包及其子包下的所有类都会自动取简单类名为别名,且别名首字母大小写都可以 -->
<package name="com.xxx.mybatis.pojo"/>
</typeAliases>
<!-- 连接数据库的参数配置。和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:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<!-- 加载外部实体类的Sql映射文件 -->
<mappers>
<!-- 使用resource配置Sql映射文件,xml映射文件的名字和位置比较灵活 -->
<mapper resource="sqlmap/User.xml" /> <!-- resource和class和url只能配置其中一个 -->
<!-- <mapper class="com.xxx.mybatis.pojo.User" /> --> <!-- 使用class定位User.xml的位置。必须满足User.xml的名字和位置与User类相同 -->
<!-- <mapper url="c://User.xml" /> --> <!-- 根据绝对路径定位User.xml的位置,不推荐 -->
<package name="com.xxx.mybatis.mapper" /> <!-- 该包下的所有类对应的xml映射文件都会包含进来(推荐)。必须满足该包下的xml文件的名字和位置与对应类相同 -->
</mappers>
</configuration>
src/ jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123