JavaWeb框架学习文章
首先是准备Mybatis的jar包
Mybatis下载地址
1,导入Mybatis-x.x.x.jar和lib中的依赖包
2,导入要使用的数据库的驱动包
3,创建一个config文件,在config文件夹下创建一个log4j.properties
打开mybatis自带的pdf,翻到logging配置中找需要的配置信息,大概如下
这里贴出mybatis-3.4.6中的信息
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
由于我们在开发阶段,所以上述内容中的ERROR也就是日志级别,建议改成DEBUG,投入工作后可以用INFO,ERROR
4,在config下创建一个SqlMapConfig.xml文件
<?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">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlmap/user.xml"/>
</mappers>
</configuration>
5,在config中创建一个sqlmap包,然后包内创建一个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="test">
<!-- 用来查询
id:用来标识这条select
parameterType:传入的参数类型
resultType:返回的sql映射成的java对象类型
#{}表示一个占位符
#{}中如果要输入的参数名是简单类型,那么参数名可以任意:如#{id},#{value}
${}表示将接收到的参数不加任何修饰拼接到sql中
${value},如果接受的类型是简单类型,参数只能填value
${}的方式 可能引起sql注入,不推荐使用
-->
<select id="findUserById" parameterType="int" resultType="com.hhh.dao.User">
select * from user where id = #{id}
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="com.hhh.dao.User">
select * from user where name like '%${value}%'
</select>
</mapper>
6,在src包下创建常见的User对象,该对象对应数据库中的表,user.xml中的返回类型也就是它
7,创建测试类(主要测试的是单项结果查询,和多项结果查询)
package com.hhh.test;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import com.hhh.dao.User;
public class MyTest {
@Test
public void test1() throws Exception {
//读取mybatis配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
//创建会话工厂,传入配置信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//通过工厂得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
/*
* 通过SqlSession操作数据库
* 参数1:命名空间和sql的id
* 参数2: 传向占位符的值
* */
User user = sqlSession.selectOne("test.findUserById",1);
System.out.println(user);
List<User> selectList = sqlSession.selectList("test.findUserByName","张三");
System.out.println(selectList);
sqlSession.close();
}
}
运行结果:
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 422392391.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@192d3247]
DEBUG [main] - ==> Preparing: select * from user where id = ?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
User [id=1, name=张三1, age=20, tel=12341]
DEBUG [main] - ==> Preparing: select * from user where name like '%张三%'
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 2
[User [id=1, name=张三1, age=20, tel=12341], User [id=2, name=张三2, age=21, tel=12342]]
插入数据:
修改user.xml
<!--
向user表中插入信息
由于id自增所以不需要填
-->
<insert id="insertInfoToUser" parameterType="com.hhh.dao.User">
insert into user(name, age, tel) values(#{name},#{age},#{tel})
</insert>
测试类:
User user = new User("王五3",18,"12346");
sqlSession.insert("test.insertInfoToUser", user);
sqlSession.commit();//如果不提交将会回滚事务
运行结果:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 1181869371.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4671e53b]
DEBUG [main] - ==> Preparing: insert into user(name, age, tel) values(?,?,?)
DEBUG [main] - ==> Parameters: 王五3(String), 18(Integer), 12346(String)
DEBUG [main] - <== Updates: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4671e53b]
获取自增长的id值:
修改user.xml
<insert id="insertInfoToUser" parameterType="com.hhh.dao.User">
insert into user(name, age, tel) values(#{name},#{age},#{tel})
<!-- keyProperty:参数名
order:插入后获取
resultType:返回值类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select last_insert_id();
</selectKey>
</insert>
修改测试类:
User user = new User("王五3",18,"12346");
sqlSession.insert("test.insertInfoToUser", user);
sqlSession.commit();//如果不提交将会回滚事务
System.out.println(user.getId());
结果:
DEBUG [main] - ==> Preparing: insert into user(name, age, tel) values(?,?,?)
DEBUG [main] - ==> Parameters: 王五3(String), 18(Integer), 12346(String)
DEBUG [main] - <== Updates: 1
DEBUG [main] - ==> Preparing: select last_insert_id();
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 1
DEBUG [main] - Committing JDBC Connection [com.mysql.jdbc.JDBC4Connection@6950e31]
9
删除用户:
修改user.xml
<delete id="deleteById" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
测试类:
sqlSession.delete("deleteById", 6);
sqlSession.commit();
修改用户:
修改user.xml
<update id="updateUser" parameterType="com.hhh.dao.User">
update user set name = #{name} where id = #{id}
</update>
需要注意的是这里的参数不是简单类型,所以不能够随便填,字段名和属性名需要对应。由于根据id修改数据,所以这里传入的属性必须要有id值。
User user = new User("王五3",18,"12346");
user.setId(5);
sqlSession.update("updateUser", user);
sqlSession.commit();