mybatis说到底,两个jar包:mybatis,mysql-connector-java+两个配置文件,mybatis.xml和自定义的Mapper.xml这两个配置文件的名字可以自定义
1.首先要创建数据库,做为查询的对象
2.创建一个java工程,web,app都可以maven,ivy都可以,这里面以简单的app java项目+maven为例
在pom.xml文件中添加:
前两个是必须的,junit只是为了调试方便,我一般都用testng,换成testng的引用就可以了
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<!-- junit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
3.在工程中添加对应的mybatis.xml文件,这个文件的位置一般都是放在resource文件夹中
<?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标签,当mybatis和spring整合之后,这个标签是不用配置的 -->
<!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境
一、development:开发模式
二、work:工作模式-->
<environments default="development">
<!--id属性必须和上面的default一样 -->
<environment id="development">
<!--事务管理器
一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围
二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期
比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,
因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:
<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>
-->
<transactionManager type="JDBC"/>
<!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
4.定义表所对应的实体类
个人觉得这个步骤很关键,这个是区别去普通连接的特别之处
4.问题四:从resultset中遍历结果集时,对表的字段存在硬编码,不利于维护
设想解决:将查询的结果集自动映射为java对象
将数据库里面的字段定义成类,设置get和set方法,然后最后重写返回的toString方法
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
public int getId() {
return id;
}
public void setId(int 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 + "]";
}
}
5.定义操作表的sql映射文件Mapper.xml
id:唯一标识符,此文件中的id值不能重复
resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
<?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.ys.po.userMapper">
<!-- 根据 id 查询 user 表中的数据
id:唯一标识符,此文件中的id值不能重复
resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
parameterType:参数类型,也就是查询条件的类型
-->
<select id="selectUserById"
resultType="com.ys.po.User" parameterType="int">
<!-- 这里和普通的sql 查询语句差不多,对于只有一个参数,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着,如果有多个参数则必须写pojo类里面的属性 -->
select * from user where id = #{id}
</select>
<!-- 查询 user 表的所有数据
注意:因为是查询所有数据,所以返回的应该是一个集合,这个集合里面每个元素都是User类型
-->
<select id="selectUserAll" resultType="com.ys.po.User">
select * from user
</select>
<!-- 模糊查询:根据 user 表的username字段
下面两种写法都可以,但是要注意
1、${value}里面必须要写value,不然会报错
2、${}表示拼接 sql 字符串,将接收到的参数不加任何修饰拼接在sql语句中
3、使用${}会造成 sql 注入
-->
<select id="selectLikeUserName" resultType="com.ys.po.User" parameterType="String">
select * from user where username like '%${value}%'
<!-- select * from user where username like #{username} -->
</select>
6.向mybatis.xml配置文件中注册Mapper.xml文件
这里面注意Mapper.xml文件的resource路径,不然的话可能会找不到,因为每个人的路径是不一样的,没有一个统一的标准
<mappers>
<!-- 注册userMapper.xml文件,
userMapper.xml位于com.ys.mapper这个包下,所以resource写成com/ys/mapper/userMapper.xml-->
<mapper resource="com/ys/mapper/userMapper.xml"/>
</mappers>
7.创建测试类
好了,上面如果都配置完成之后我们就可以进行调试了,看看我们配置的是否正确
首先是@Before,这里也是要先进行数据库连接
public class CRUDTest {
//定义 SqlSession
SqlSession session =null;
@Before
public void init(){
//定义mybatis全局配置文件
String resource = "mybatis-configuration.xml";
//加载 mybatis 全局配置文件
InputStream inputStream = CRUDTest.class.getClassLoader()
.getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//根据 sqlSessionFactory 产生 session
session = sessionFactory.openSession();
}
//根据id查询user表数据
@Test
public void testSelectUserById(){
/*这个字符串由 userMapper.xml 文件中 两个部分构成
<mapper namespace="com.ys.po.userMapper"> 的 namespace 的值
<select id="selectUserById" > id 值*/
String statement = "com.ys.po.userMapper.selectUserById";
User user = session.selectOne(statement, 1);
System.out.println(user);
session.close();
}
//查询所有user表所有数据
@Test
public void testSelectUserAll(){
String statement = "com.ys.po.userMapper.selectUserAll";
List<User> listUser = session.selectList(statement);
for(User user : listUser){
System.out.println(user);
}
session.close();
}
//模糊查询:根据 user 表的username字段
@Test
public void testSelectLikeUserName(){
String statement = "com.ys.po.userMapper.selectLikeUserName";
List<User> listUser = session.selectList(statement, "%t%");
for(User user : listUser){
System.out.println(user);
}
session.close();
}
//向 user 表中插入一条数据
@Test
public void testInsertUser(){
String statement = "com.ys.po.userMapper.insertUser";
User user = new User();
user.setUsername("Bob");
user.setSex("女");
session.insert(statement, user);
//提交插入的数据
session.commit();
session.close();
}
//根据 id 更新 user 表的数据
@Test
public void testUpdateUserById(){
String statement = "com.ys.po.userMapper.updateUserById";
//如果设置的 id不存在,那么数据库没有数据更改
User user = new User();
user.setId(4);
user.setUsername("jim");
session.update(statement, user);
session.commit();
session.close();
}
//根据 id 删除 user 表的数据
@Test
public void testDeleteUserById(){
String statement = "com.ys.po.userMapper.deleteUserById";
session.delete(statement,4);
session.commit();
session.close();
}
}
通过mapper接口加载映射文件 Mapper.xml文件使用时需要注意的地方:
1.Mapper接口(我们自己定义的interface)必须要和Mapper.xml文件同名且放在同一个包下,也就是说Mapper.xml文件中的namespace是Mapper接口的全类名
2.Mapper接口中的方法名和Mapper.xml文件中定义的id一致
3.Mapper接口输入参数类型要和Mapper.xml中定义的parameterType一致
4.Mapper接口返回数据类型要和Mapper.xml定义的resultType一致