开始了新项目的旅程,首先学习了java中的新后端框架Mybatis,一点一点个大家分享,今天给大家分享一下Mybatis的基础。
我们以前在后端连接的是JDBC,但是它有一些缺点:
(1)数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。
(2)Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。
(3)使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
(4)对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
在java中引入了Mybatis,下面来看一下Mybatis的架构
大家可以根据上图来分析和对比JDBC
Mybatis的特点:
Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
下面是Mybatis入门
3.1、根据id查询用户
创建POJO:
package com.long.pojo;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
创建核心配置文件:
SqlMapConfig.xml是mybatis核心配置文件,配置文件内容为数据源、事务管理。
sql映射文件User.xml:
<?xml version="1.0" encoding="UTF-8" ?> select * from user where id = #{v}创建测试文件:
public class MybatisFirstTest {
@Test
public void testMybatis() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
User user = sqlSession.selectOne("test.findUserById", 10);
System.out.println(user);
}
}
3.2、实现根据用户名模糊查询用户
SQL语句如下:
SELECT * FROM user
WHERE username LIKE ‘%王%’
1
User.xml里面加入这个:
<select id="findUserByUsername" parameterType="String" resultType="com.long.pojo.User">
elect * from user where username like '%${value}%'
</select>
测试代码:
@Test
public void testfindUserByUsername() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
List<User> users = sqlSession.selectList("test.findUserByUsername", "五");
for (User user2 : users) {
System.out.println(user2);
}
}
3.3、实现添加用户
User.xml:
<insert id="insertUser" parameterType="com.pojo.pojo.User">
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
insert into user (username,birthday,address,sex)
values (#{username},#{birthday},#{address},#{sex})
</insert>
测试程序:
//添加用户
@Test
public void testInsertUser() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
User user = new User();
user.setUsername("龙");
user.setBirthday(new Date());
user.setAddress("sadfsafsafs");
user.setSex("男");
int i = sqlSession.insert("test.insertUser", user);
sqlSession.commit();
}
3.4、mysql自增主键返回
User.xml:
测试程序:
//添加用户
@Test
public void testInsertUser() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
User user = new User();
user.setUsername("龙");
user.setBirthday(new Date());
user.setAddress("sadfsafsafs");
user.setSex("男");
int i = sqlSession.insert("test.insertUser", user);
sqlSession.commit();
System.out.println(user.getId());
}
3.5、更新用户
User.xml:
测试程序:
//更新用户
@Test
public void testUpdateUserById() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行Sql语句
User user = new User();
user.setId(29);
user.setUsername("雏田");
user.setBirthday(new Date());
user.setAddress("222222sadfsafsafs");
user.setSex("女");
int i = sqlSession.update("test.updateUserById", user);
sqlSession.commit();
}
3.6、删除用户
User.xml:
<delete id="deleteUserById" parameterType="Integer">
delete from user
where id = #{vvvvv}
</delete>
测试程序:
//删除
@Test
public void testDelete() throws Exception {
//加载核心配置文件
String resource = “sqlMapConfig.xml”;
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUserById", 29);
sqlSession.commit();
}