MyBatis 本是apache的一个开源项目iBatis,Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
MyBatis入门步骤————基于xml文件开发- 第一步:在classpath下配置SqlMapConfig.xml文件.
[AppleScript] 纯文本查看 复制代码 <?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="development">
// 配置一个数据库连接
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/userdb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
通常命名规范为. 实体类名mapper.xml (Usermapper.xml) [AppleScript] 纯文本查看 复制代码 <?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="test1">
// 这里写sql语句
<!--根据id 查询-->
<select id="findUserById" parameterType="int" resultType="cn.fy.domain.User">
SELECT id,username,birthday,sex,address FROM USER WHERE id = #{id}
</select>
</mapper> - 第三步:加载mapper.xml文件,将配置文件配置到SqlMapConfig.xml中.
[AppleScript] 纯文本查看 复制代码 <configuration>
...
// 加载mapper.xml配置文件
<mappers>
<!-- 注册userMapper.xml文件, userMapper.xml位于cn.fy.mapping这个包下,所以resource写成cn/fy/mapping/userMapper.xml -->
<mapper resource="cn/fy/mapping/userMapper.xml"/>
</mappers>
</configuration>
[AppleScript] 纯文本查看 复制代码 public class MyBatisTest {
@Test
public void test1(){
SqlSession session = MyBatisUtil.getSession();
// 命名空间.id值
User user = session.selectOne("test1.findUserById", 10);
}
}
工具类:
[AppleScript] 纯文本查看 复制代码 public class MyBatisUtil {
public static SqlSession getSession() {
/**
* 注意:
* 1. "SqlMapConfig.xml" 在cn.itcast.test 包下找文件. 由于我使用的是maven开发,SqlMapConfig.xml放在了resource中,所以不加 / 也能正常读取
* 2. "/SqlMapConfig.xml" 在class路径下找
*/
String config = "SqlMapConfig.xml";
//InputStream is = Resources.getResourceAsStream(config)
InputStream is = MyBatisUtil.class.getClassLoader()
.getResourceAsStream(config);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
return session;
}
}
添加在user.xml中添加sql [AppleScript] 纯文本查看 复制代码 <!-- 添加用户 -->
<insert id="insertUser" parameterType="cn.fy.domain.User">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
// 测试
@Test
public void insert(){
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setUsername("knight");
user.setAddress("河南郑州");
user.setSex("1");
session.insert("test1.insertUser", user);
session.commit();
} —主键的返回—第一种: mysql 自增主键返回 [AppleScript] 纯文本查看 复制代码 <insert id="insertUser" parameterType="实体类">
//after 因为自增的主键是在执行完 insert语句后产生的
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address});
</insert> - 添加selectKey实现将主键返回
- keyProperty:返回的主键存储在pojo中的哪个属性
- order:selectKey的执行顺序,是相对与insert语句来说,由于mysql的自增原理执行完insert语句之后才将主键生成,所以这里selectKey的执行顺序为after
- resultType:返回的主键是什么类型
- LAST_INSERT_ID():是mysql的函数,返回auto_increment自增列新记录id值。
第二种: Mysql使用 uuid实现主键. [AppleScript] 纯文本查看 复制代码 <insert id="insertUser" parameterType="实体类">
<selectKey resultType="java.lang.String" order="BEFORE"
keyProperty="id">
select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address)
values(#{id},#{username},#{birthday},#{sex},#{address})
</insert> 第三种: Oracle使用序列生成主键 [AppleScript] 纯文本查看 复制代码 <insert id="insertUser" parameterType="实体类">
<selectKey resultType="java.lang.Integer" order="BEFORE"
keyProperty="id">
SELECT 自定义序列.NEXTVAL FROM DUAL
</selectKey>
insert into user(id,username,birthday,sex,address)
values(#{id},#{username},#{birthday},#{sex},#{address})
</insert> 删除在user.xml中添加sql [AppleScript] 纯文本查看 复制代码 <!-- 删除用户 -->
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
@Test
public void delete(){
SqlSession session = MyBatisUtil.getSession();
session.delete("test1.deleteUserById", 31);
session.commit();
} 修改在user.xml中添加sql [AppleScript] 纯文本查看 复制代码 <!-- 更新用户 -->
<update id="updateUser" parameterType="cn.fy.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
where id=#{id}
</update>
@Test
public void update(){
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(38);
user.setUsername("fy");
user.setAddress("zz");
user.setSex("1");
session.insert("test1.updateUser", user);
session.commit();
} 模糊查询在user.xml中添加sql [AppleScript] 纯文本查看 复制代码 <!-- 模糊查询 -->
<select id="findUserByUsername" parameterType="java.lang.String"
resultType="cn.fy.domain.User">
select * from user where username like '%${value}%'
</select>
<!--
根据用户名称模糊查询用户信息列表
resultType:不管结果集记录的数量有多少,resutType指定单条记录所映射的java对象
resultType映射规则是sql查询列名和pojo的属性名必须一致方可完成映射
${}:表示一个sql拼接符号,相当于字符串的拼接:
“SELECT * FROM USER WHERE username LIKE '%” + ${}表示的串 + “%'”
${}:如果接收输入参数是一个简单类型,${} 中只能写value
${}实现sql拼接是无法防止sql注入的。
-->
@Test
public void dimFind() {
SqlSession session = MyBatisUtil.getSession();
List<User> list = session.selectList("test1.findUserByUsername", "关键字");
System.out.println(list);
} #{}和${}的区别#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。 表示拼接sql串,通过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, 可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是value。 建议使用#{}. 但有时必须使用.比如:ORDERBY{某列} 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|