有关sqlsession相关介绍
(1)sqlsession简单介绍
sqlSession提供select、insert、update、delete方法,在旧版本中使用sqlsession接口的这些方法,但是在新版本中Mybatis就会建议直接使用mapper接口的方法。
映射器其实就是一个动态代理对象,进入到MapperMethod的execute方法就能简单找打sqlsession的删除,更新、查询、选择方法,从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了sqlsession的接口方法(getMapper()方法等到Mapper)执行sql查询。
在 MyBatis 中,SqlSession 是其核心接口。在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager。
DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程环境下使用。SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。具体而言,它的作用有 3 个:
1、获取 Mapper 接口。
2、发送 SQL 给数据库。
3、控制数据库事务。
先来掌握它的创建方法,有了 SqlSessionFactory 创建的 SqlSession 就十分简单了,如下所示。
SqlSession sqlSession = SqlSessionFactory.openSession();
链接:https://pan.baidu.com/s/1lqBe_LeqSgBZ8W2dvGFN3A?pwd=6666
提取码:6666
所需要的配置文件:
链接:https://pan.baidu.com/s/1PuUb3GTkndaY3ti3sHEUfQ?pwd=1314
提取码:1314
1.创建数据库 创建t_user表
#创建表
create table t_user
(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);
insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');
2.在idea中创建分层结构 bean包(实体类 User)、dao包(创建接口UserDao和.xml)test包(创建测试类UserTest)。
3.需要创建两个xml文件:
UserDao.xml、SqlMapConfig.xml
SqlMapConfig.xml 需要在src里创建。
a.实体类User
package com.nai.bean;
public class User {
private Integer uid;
private String username;
private String password;
private String phone;
private String address;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
b. UserDao接口
package com.nai.dao;
import com.nai.bean.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有用户信息
* @return
*/
List<User> selectAll();
User selectByUid(int uid);
int add(User user);
int delete(int uid);
}
c. UserDao.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:把配置文件和接口进行映射-->
<mapper namespace="com.nai.dao.UserDao">
<!--通过select标签进行查询
id:映射接口的方法名
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可)
resultType:指定返回值的类型
-->
<select id="selectAll" resultType="com.nai.bean.User">
select * from t_user;
</select>
<select id="selectByUid" parameterType="int" resultType="com.nai.bean.User">
select * from t_user where uid=#{uid}
</select>
<select id="seach" parameterType="String" resultType="com.nai.bean.User">
select * from t_user where username like concat ('%',#{keyword},'%')
</select>
<insert id="add" parameterType="com.nai.bean.User">
insert into t_user(username, password, phone, address)
values (#{username}, #{password}, #{phone}, #{address});
</insert>
<delete id="delete" parameterType="int">
delete from t_user where uid=#{uid};
</delete>
<update id="update" parameterType="com.nai.bean.User">
update t_user set username=#{username},password=#{password},phone=#{phone},address=#{address} where uid=#{uid}
</update>
</mapper>
d.SqlMapConfig
<?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>
<environments default="mysql">
<environment id="mysql">
<!--配置SqlMapConfig默认使用jdbc的方法处理事务-->
<transactionManager type="jdbc"></transactionManager>
<!--配置数据源:默认使用 pooled-->
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/myweb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.nai.dao.UserDao"></mapper>
</mappers>
</configuration>
e.测试类 UserTest
固定语句:
@Before:在@Test之前执行
public class UserTest {
InputStream stream = null;
SqlSessionFactoryBuilder builder = null;
SqlSessionFactory factory = null;
SqlSession sqlSession = null;
UserDao userDao = null;
@Before
public void init() throws IOException {
System.out.println("before");
//1.加载核心配置文件的字节输入流
stream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory的构建对象--框架使用的是构建者模式
builder = new SqlSessionFactoryBuilder();
//3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
factory = builder.build(stream);
//4.通过工厂对象获取SqlSession对象----执行JDBC操作的
sqlSession = factory.openSession();
//5.通过SqlSession对象获取接口对应的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
测试内容:增加、 删除、 全查、 通过id查询、修改、模糊查询
@After:执行@Test之后代码
package com.nai.test;
import com.nai.bean.User;
import com.nai.dao.UserDao;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
InputStream stream = null;
SqlSessionFactoryBuilder builder = null;
SqlSessionFactory factory = null;
SqlSession sqlSession = null;
UserDao userDao = null;
@Before
public void init() throws IOException {
System.out.println("before");
//1.加载核心配置文件的字节输入流
stream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory的构建对象--框架使用的是构建者模式
builder = new SqlSessionFactoryBuilder();
//3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
factory = builder.build(stream);
//4.通过工厂对象获取SqlSession对象----执行JDBC操作的
sqlSession = factory.openSession();
//5.通过SqlSession对象获取接口对应的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@Test
public void testSelectAll() throws IOException {
List<User> userList = userDao.selectAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testSelectByUid() {
User user = userDao.selectByUid(17);
if (user != null) {
System.out.println(user);
}
}
//模糊查询
@Test
public void testSeach() throws IOException {
List<User> userList = userDao.seach("小");
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testAdd() {
User user = new User();
user.setUsername("SqlMapConfig");
user.setPassword("666");
user.setPhone("14381438");
user.setAddress("Lisan");
int n = userDao.add(user);
if (n > 0) {
System.out.println("add success");
}
}
@Test
public void testDelete() {
int n = userDao.delete(6);
if (n > 0) {
System.out.println("delete success");
}
}
@Test
public void testUpdate() {
User oldUser = userDao.selectByUid(3);
System.out.println("修改前:" + oldUser);
oldUser.setAddress("北疆");
userDao.update(oldUser);
User newUser = userDao.selectByUid(3);
System.out.println("修改后;" + newUser);
}
@After
public void distory() throws IOException {
System.out.println("after");
//资源释放
sqlSession.commit();
sqlSession.close();
stream.close();
}
}
注意:导入的架包是否正确