mybatis的工作原理:
MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。
- SqlSession对象,该对象中包含了执行SQL语句的所有方法。 类似于JDBC里面的Connection。
- Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
mybatis根据id查询
先创建数据库
create database mydb;
-- 使用数据库
use mydb;
-- 创建表
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) value('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) value('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) value('小美','123','18565234759','信阳');
在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 + '\'' +
'}';
}
}
在dao包中创建UserDao接口进行编写根据id查询方法
public interface UserDao {
User selectByUid(int uid);
}
创建核心文件连接数据库
<?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">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.qi.dao.UserDao"/>
</mappers>
</configuration>
然后在mapper文件编写根据id查询语句
<?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.qi.dao.UserDao">
<select id="selectByUid" parameterType="int" resultType="com.qi.bean.User">
select*from t_user where uid=#{uid};
</select>
</mapper>
最后在测试类里进行测试
public class UserTest {
InputStream stream=null;
SqlSessionFactoryBuilder builder=null;
SqlSessionFactory factory=null;
SqlSession sqlsession=null;
UserDao userDao=null;
@Before
public void init() throws IOException {
//加载核心文件
stream= Resources.getResourceAsStream("mybatis.xml");
//创建SqlSessionFactoryBuilder构建对象
builder=new SqlSessionFactoryBuilder();
//通过构建对象加载文件的输入流
factory= builder.build(stream);
//通过工厂对象获取SqlSession对象
sqlsession = factory.openSession();
//通过Sqlsession对象获取接口对应的代理对象
userDao = sqlsession.getMapper(UserDao.class);
}
@Test
public void testSelectByUid(){
User user = userDao.selectByUid(1);
System.out.println(user);
}
@After
public void destory() throws IOException {
sqlsession.commit();
sqlsession.close();
stream.close();
}
}
结果如下:
测试类里测试的步骤:
1.获取sqlSessionFactory对象
2.获取sqlSession对象
3.获取mapper接口的代理对象(MapperProxy)
4.执行增删改查方法
mybatis的修改
在UserDao接口中编写修改方法
public interface UserDao {
User selectByUid(int uid);
}
然后在mapper映射编写修改操作
<?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.qi.dao.UserDao">
<update id="update" parameterType="com.qi.bean.User" >
update t_user set username=#{username},password=#{password},phone=#{phone},address=#{address} where uid=#{uid};
</update>
</mapper>
最后在测试类里进行测试
public class UserTest {
InputStream stream=null;
SqlSessionFactoryBuilder builder=null;
SqlSessionFactory factory=null;
SqlSession sqlsession=null;
UserDao userDao=null;
@Before
public void init() throws IOException {
//加载核心文件
stream= Resources.getResourceAsStream("mybatis.xml");
//创建SqlSessionFactoryBuilder构建对象
builder=new SqlSessionFactoryBuilder();
//通过构建对象加载文件的输入流
factory= builder.build(stream);
//通过工厂对象获取SqlSession对象
sqlsession = factory.openSession();
//通过Sqlsession对象获取接口对应的代理对象
userDao = sqlsession.getMapper(UserDao.class);
}
@Test
public void testUpdate(){
//1.数据库
User oldUser=userDao.selectByUid(3);
System.out.println("修改前:"+oldUser);
//根据需要修改字段值
oldUser.setUsername("修改测试");
oldUser.setAddress("河南郑州");
//3.执行数据库更新
userDao.update(oldUser);
//4.再次查询
User newUser=userDao.selectByUid(3);
System.out.println("修改后:"+newUser);
}
@After
public void destory() throws IOException {
sqlsession.commit();
sqlsession.close();
stream.close();
}
}
修改的操作
根据id查询数据信息
然后更改User对象里的名字信息和地址信息
结果如下: