mybatis实现增删查改
流程图:
// mybatis配置文件
// 在此遇到一个问题,发现读取配置文件的时候读取不到,原因是idea的 classpath的问题,解决的方案
// 可以在 http://blog.youkuaiyun.com/shifangwannian/article/details/48882201 找到解决方案
// SqlmapConfig.xml 是全局配置文件
String resource = "SqlmapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// 通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询语句
User user = sqlSession.selectOne("test.queryUserById", 1);
注意的是: SqlSessionFactory 一般使用单例模式进行管理,是线程安全的,sqlSession是线程不安全的,一般其使用要放在每一个方法之中。
- 配置 SqlMapConfig 中的内容
<?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://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="011152" />
</dataSource>
</environment>
</environments>
<!--配置映射文件,文件里的内容是对User这张表的SQL语句-->
<mappers>
<mapper resource="SqlMap/User.xml"/>
</mappers>
</configuration>
- 配置 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 与 id 一同组合成为一个sql执行的statement的唯一标识,
参数类型 parameterType, 返回值类型-->
<mapper namespace="test">
<!--通过id 查询用户信息-->
<select id="queryUserById" parameterType="int" resultType="com.dustin.dao.User">
select * from user where id = #{id}
</select>
<!--通过name查询用户信息-->
<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定就是单条记录所映射的java对象 类型
${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
使用${}拼接sql,引起 sql注入
${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<!--#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,
#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。
如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,
${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,
${}括号中只能是value。
-->
<select id="queryUserByName" parameterType="java.lang.String" resultType="com.dustin.dao.User">
select * from User where username like '%${value}%'
</select>
<!--添加用户-->
<insert id="insertUser" parameterType="com.dustin.dao.User">
<!--
将插入数据的主键(自增的)返回,返回到user对象中
SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
-->
<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})
<!--<!– 针对函数生成的的一个id, 则id的生成返回要在insert语句之前–>-->
<!--<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">-->
<!--SELECT uuid()-->
<!--</selectKey>-->
<!--insert into user(id, username, birthday, sex, address ) values(#{id}, #{name}, #{birthday}, #{sex}, #{address})-->
</insert>
</mapper>
说明: 本文大部分内容都是跟随者传播智课的教学视频学习而来,可以看做是翻译文章,只是自己吸收之后又书写一遍,加深自己的知识理解。