1.动态sql【重点】
1.右键点击File–>New–>Module,如图所示:
2.选择Java,并点击Next。如图所示:
3.填写项目名称,点击Finish。如图所示:
4.在sec目录下创建jdbc.properties的代码如下:
driver=com.mysql.cj.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&uesSSL=false&serverTimezone=Asia/Shanghai
如图所示:
5.在sec目录下创建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>
<!--读取小配置文件信息 resource:路径 相当于src-->
<properties resource="jdbc.properties" />
<!--实体类别名 name:java实体类全限定名 别名:默认实体类名(大小均可)-->
<typeAliases>
<package name="com.txw.entity"/>
</typeAliases>
<!--连接环境 default写的是要使用连接环境的id值-->
<environments default="mysql">
<!--连接环境 mysql id:当前环境的名字-->
<environment id="mysql">
<!--事务控制的方式 JDBC:使用原始JDBC事务控制。 JAT:分布式事务管理。-->
<transactionManager type="JDBC"></transactionManager>
<!--连接池配置 Mybatis默认为PUBLIC 第三方连接池:dbcp c3p0 druid-->
<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>
<!--注册mapper文件-->
<mappers>
</mappers>
</configuration>
如图所示:
6.编写MybatisUtils的代码如下:
package com.txw.util;
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.InputStream;
/**
* Mybatis工具类
* @Author Adair
* @QQ:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class MybatisUtils {
private static SqlSessionFactory ssf = null;
private static ThreadLocal<SqlSession> t1 = new ThreadLocal<SqlSession>();
static {
try {
// 1.加载mybatis-config.xml
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SQLSessionFactory工厂对象
ssf = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return
*/
public static SqlSession openSession(){
// 3.通过工厂对象获取SQLSession对象(连接)
SqlSession ss = t1.get();
if (ss == null){
ss = ssf.openSession();
t1.set(ss);
}
return ss;
}
/**
* 获取DAO的实现类
* @param clazz
* @return
*/
public static Object getMapper(Class clazz){
return openSession().getMapper(clazz);
}
/**
* 关闭资源
*/
public static void close(){
openSession().close();
t1.remove();
}
/**
* 事务提交
*/
public static void commit(){
openSession().commit();
close();
}
/**
* 事务回滚
*/
public static void rollback(){
openSession().rollback();
close();
}
}
如图所示:
7.编写User的代码如下:
package com.txw.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 用户实体类
* @Author Adair
* @QQ:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class User implements Serializable {
private int id;
private String name; // 姓名
private String password; // 密码
private Date birthday; // 生日
public User() {
}
public User(int id, String name, String password, Date birthday) {
this.id = id;
this.name = name;
this.password = password;
this.birthday = birthday;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
'}';
}
}
如图所示:
8.在mybatis-config.xml添加代码如图所示:
1.1 sql片段
将Sql语句中冗余的部分抽取出来,定义为一个Sql片段,后续可以反复使用。
1.编写UserDao的代码如下:
package com.txw.dao;
import com.txw.entity.User;
import org.apache.ibatis.annotations.Param;
/**
* 用户持久层
* @Author Adair
* @QQ:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public interface UserDao {
/**
* 根据id查询User信息
* @param id
* @return
*/
public User selectUserById(int id);
/**
* 根据用户名和密码查询User信息
* @param name
* @param password
* @return
*/
public User selectUaserByNameAndPassword(@Param("name")String name,@Param("password")String password);
}
如图所示:
2.UserDaoMapper.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.txw.dao.UserDao">
<!--结果映射-->
<resultMap id="UserResultMap" type="User">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
<result property="password" column="t_password"/>
<result property="birthday" column="t_birthday"/>
</resultMap>
<!--sql片段 id:片段的名字-->
<sql id="SELECT_USER">
select t_id,t_name,t_password,t_birthday from t_user
</sql>
<!--根据id查询User信息-->
<select id="selectUserById" resultMap="UserResultMap">
<include refid="SELECT_USER"/> where t_id = #{id}
</select>
<!--根据用户名和密码查询User信息-->
<select id="selectUaserByNameAndPassword" resultMap="UserResultMap">
<include refid="SELECT_USER"/> where t_name = #{name} and t_password = #{password}
</select>
</mapper>
如图所示:
3.编写UserDaoTest的代码如下:
package com.txw.test;
import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
import org.junit.Test;
/**
* 测试
* @Author Adair
* @QQ:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class UserDaoTest {
/**
* 根据id查询User信息
*/
@Test
public void testSelectUserById() throws Exception{
UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
User user = userDao.selectUserById(3);
System.out.println(user);
}
/**
* 根据用户名和密码查询User信息
*/
@Test
public void testSelectUaserByNameAndPassword(){
UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
User user = userDao.selectUaserByNameAndPassword("txw","123456");
System.out.println(user);
}
}
如图所示:
1.2 where相关处理
通过判断 动态筛选查询条件。
1.编写UserDao的代码如下:
/**
* 通过各种条件查询用户信息
* @param user
* @return
*/
public List<User> selectUserAll(User user);
如图所示:
2.在UserDaoMapper.xml添加的代码如下:
<!--通过各种条件查询用户信息-->
<select id="selectUserAll" resultMap="UserResultMap">
<include refid="SELECT_USER"/>
<where>
<if test="id != null">
t_id = #{id}
</if>
<if test="name != null">
and t_name = #{name}
</if>
<if test="password != null">
and t_password = #{password}
</if>
<if test="birthday != null">
and t_birthday = #{birthday}
</if>
</where>
</select>
如图所示:
注意:where动态判断会自动忽略 标签后的第一个and 或者 or。
3.编写UserDaoTest的代码如下:
/**
* 通过各种条件查询用户信息
*/
@Test
public void testSelectUserAll(){
UserDao userDao = (UserDao)MybatisUtils.getMapper(UserDao.class);
User u = new User(1,null,null,null);
List<User> list = userDao.selectUserAll(u);
for (User user : list) {
System.out.println(user);
}
}
如图所示:
1.3 update相关处理
通过判断 动态设置要修改的列。
1.4 批量操作 批量删除
## 2 缓存(cache)
Mybatis全局缓存的使用
1.告知Mybatis框架开启全局缓存的代码如下:
<!--开启全局缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
如图所示:
2.在需要进行缓存操作的Mapper文件中声明 使用缓存。如图所示:
3.实体实现序列化接口Serializable,如图所示:
4.在MybatisUtils添加如图所示的代码:
5.测试的代码如下:
package com.txw.test;
import com.txw.dao.UserDao;
import com.txw.entity.User;
import com.txw.util.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* 测试缓存
* @Author Adair
* @QQ:1578533828@qq.com
*/
@SuppressWarnings("all") // 注解警告信息
public class TestCache {
@Test
public void testCache() throws Exception{
System.out.println("--------Client 1-----------");
SqlSession ss = MybatisUtils.getSqlSession();
UserDao userDao1 = ss.getMapper(UserDao.class);
List<User> list1 = userDao1.selectUserAll(new User());
for (User user : list1) {
System.out.println(user);
}
System.out.println("--------Client 2-----------");
SqlSession ss2 = MybatisUtils.getSqlSession();
UserDao userDao2 = ss.getMapper(UserDao.class);
List<User> list = userDao2.selectUserAll(new User());
for (User user : list) {
System.out.println(user);
}
}
}
如图所示: