入门程序包含的文件有
- 核心配置文件
- 映射配置文件
- JavaBean
- 测试代码
一、入门程序
核心配置文件
只需要注意后面的载入映射配置文件即可,数据源和数据库连接池会在spring中配置。
<?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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="admin" />
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="sqlmap\User.xml"/>
</mappers>
</configuration>
映射配置文件
他的作用是将sql的原语封装成灵活性高的方法。
需要关心的是执行这个操作时输入了什么,输出/返回了什么。
知识点#{}
用于接收传入的参数
User.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 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="test">
<!-- 在映射文件中配置很多sql语句 -->
<!--需求:通过id查询用户表的记录 -->
<!-- 通过select执行数据库查询
id:标识映射文件中的sql,称为statement的id
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入参数的类型
#{}标示一个占位符,
#{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。
resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM user WHERE id=#{value}
</select>
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定就是单条记录所映射的java对象类型
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
使用${}拼接sql,引起 sql注入
${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
</mapper>
测试一下
package cn.itcast.mybatis.first;
import cn.itcast.mybatis.po.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
/**
* 入门程序
*/
public class MybatisFirst {
// 根据id查询用户信息
@Test
public void findUserByIdTest() throws IOException{
// mybatis配置文件
String resource = "SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂,传入mybatis配置文件的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession操作数据库
// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
// selectOne查询出一条记录
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
// 释放资源
sqlSession.close();
}
}
二、数据库的CRUD操作
对数据库进行写,必须要commit
2.1 模糊查询
sql原语:select * from user where username like '%小明'
模糊查询返回的是数组,因此输入是字符串类型,返回的是Bean的类型(配置文件中并不会返回List)
User.xml
引入新知识点${}
传入的参数会直接拼接到sql语句中,因此注意sql注入
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
select * from user where user.username like '%${value}'
</select>
测试代码
List<User> list = sqlSession.selectList("test.findUserByName","小明");
for (User user : list) {
System.out.println(user);
}
上面的小节一下
1、parameterType 指定了输入参数的类型
resultType指定了查询结果的类型
2、#{}表示一个占位符。
${}表示拼接符
3、selectOne 查询一个记录,进行映射
selectList 查询一个列表,进行映射
2.2 插入操作
传入的参数是User类型,通过OGNL可以直接调用到user的属性
<!--插入用户操作-->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
insert into user (id,username,birthday,sex,address) value (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
执行代码:需要session.commit()
sqlSession.insert("test.insertUser",user);
sqlSession.commit();
插入操作的返回主键ID
1、 自增类型主键的返回
mysql中,LAST_INSERT_ID()在insert语句之后使用的话,会得到最后插入的主键ID。
映射配置文件中
<!--插入用户操作-->
<!--将插入的数据的主键值返回,只适用于自增类型主键
keyProperty:返回的是User的什么属性
order: 相对于insert,本条语句应该在atter,之后进行执行
resultType:指定返回的是什么类型
-->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user (id,username,birthday,sex,address) value (#{id},#{username},#{birthday},#{sex},#{address})
</insert>
执行代码中
User user = new User();
user.setUsername("七冠服");
sqlSession.insert("test.insertUser",user);
sqlSession.commit();
System.out.println(user.getId());// 这里就能获得返回的id了
2、 非自增主键的返回
和自增类型相似,通过mysql的uuid()方法,在表中的主键类型是varchar,长度35。
执行思路:
先通过uuid()得到主键,再输入再sql语句中。
执行uuid()语句就要在insert之前了。
把selectKey换成,要注意,insert语句中就要加上ID了。
2.3 修改操作
配置文件
<!--更新用户
通过传入User进行更新,由于更新对象由id标识.因此id是必须要有的
-->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update user set username = #{username},birthday = #{birthday},sex = #{sex},address = #{address} where id = #{id}
</update>
执行代码
User user = new User();
user.setId(31);
user.setUsername("七冠服");
user.setBirthday(new Date( 1998,4,9));
user.setSex("女");
user.setAddress("湛江");
sqlSession.update("test.updateUser",user);
sqlSession.commit();
2.4 删除操作
User.xml
<!--删除用户-->
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from user where id = #{value}
</delete>
执行代码
sqlSession.delete("test.deleteUserById",10);
sqlSession.commit();